4.2 FM 解调流程与 Python 实现


4.2 FM 解调流程与 Python 实现

本节摘要:FM 把信息装在瞬时频率里,而瞬时频率等于相位的导数。复数样本让求导变成"相邻样本的相位差",这就是正交鉴频——全书出场率最高的解调算法。本节给出公式推导、完整 FM 广播接收实现、去加重处理,以及用第 3 章样本文件离线复现的完整实验。

算法原理:三行公式讲完鉴频

载波写作复数形式 A·exp(jφ),瞬时频率就是相位对时间的导数 dφ/dt。数字序列里导数用差分近似:第 k 个样本的相位减第 k-1 个样本的相位,除以采样间隔。于是解调输出 = angle(conj(z[k-1]) * z[k])——把相邻两个复数样本的共轭相乘再取辐角,一步同时完成共轭与除法。这个式子的妙处在于无需显式计算相位、无需处理 2π 跳变的缠绕问题(辐角差天然落在正负 π 内),一次乘法搞定。

前提是信号必须已被搬移到零频且限带:若信号中心偏离零频 φ1,输出会叠加一个恒定直流偏置(对应固定频偏),所以解调前要确认频谱里信号居中;带外强噪声进入乘法会产生拍频噪声,所以鉴频前的低通滤波不是可选项而是必需品。完整流程是:数字下变频到零频、低通限带、抽取到合适数率、正交鉴频、去加重、音频输出。

图:FM 正交解调的信号处理流程

图:FM 正交解调的信号处理流程

实弹:离线解调 FM 广播

用第 2 章采集的 98 MHz 样本文件离线解调——离线的好处是可以反复跑、随时改参数,是实验期最有效率的方式:

import numpy as np from scipy.signal import firwin, lfilter import wave fs = 2.048e6 raw = np.fromfile("fm_band.iq", dtype=np.uint8).astype(np.float32) - 127.5 iq = (raw[0::2] + 1j * raw[1::2]) / 128.0 # 一、限带:保留 200 kHz 信号,抑制邻台 taps = firwin(255, 200e3 / (fs / 2)) iq = lfilter(taps, 1.0, iq) # 二、正交鉴频:相邻样本共轭相乘取辐角 demod = np.angle(iq[1:] * np.conj(iq[:-1])) # 三、抽取到 48 kSPS 音频(约 42.7 倍,取 42) audio = demod[::42] # 四、去加重:一阶低通,时间常数 75 微秒(中国与欧洲标准) a = np.exp(-1 / (75e-6 * 48000)) audio = lfilter([1 - a], [1, -a], audio) # 五、归一并写 wav audio = audio / (np.abs(audio).max() + 1e-9) * 0.9 with wave.open("fm_audio.wav", "wb") as w: w.setnchannels(1); w.setsampwidth(2); w.setframerate(48000) w.writeframes((audio * 32767).astype(np.int16).tobytes())

听感检查清单:音量正常但有"沙沙"高频噪声,多半是去加重没做或时间常数取错(北美标准是 75 微秒,部分亚洲广播曾用 50 微秒,两种都试试);声音周期性"卡顿"是抽取比取整误差累积,换成 scipy 的 resample_poly 更严谨;整段静音先回去看频谱确认信号确实在中心——偏 50 kHz 就足以让鉴频输出变成低电平噪声。

为什么 FM 听起来比 AM 干净

实验后值得把现象连回理论。FM 恒包络,幅度噪声在鉴频前就被"与幅度无关"的相位运算天然抑制;而 AM 的信息就在幅度上,噪声与信息同路,无法分离。FM 用带宽换抗噪:占用约 180 kHz 带宽(AM 只要 10 kHz),换来幅度噪声免疫,但存在门限效应:信噪比低于门限(约 10 dB)时输出噪声急剧恶化——这就是弱 FM 电台"不是清晰就是全噪声"的原因。第 8 章收气象卫星 APT(宽带 FM 体制)时,你会再次与门限效应打交道:天线增益差一点,图像就是雪崩式劣化。

去加重的来龙去脉也值得一句:调频噪声的功率谱随频率上升(高频噪声更重),发射端预先把高频"抬升"(预加重),接收端再用对称的低频提升网络"压回"(去加重),噪声被压的同时高频音乐成分复原——75 微秒就是那个 RC 网络的时间常数。没有去加重的 FM 听起来高音发刺,正是高频噪声未压制的听感。

常见问题

问题:为什么鉴频前一定要把信号搬到零频?

正交鉴频输出的是"相对中心频率的偏移",这个中心由样本流自己定义。若信号实际偏了 30 kHz,输出会叠加一个 30 kHz 的直流偏置,音频里表现为持续的哼声并压缩有效动态范围。先居中再鉴频,或者鉴频后减去长期均值(等效于去直流),两种做法都能救,前者更干净。

问题:采样率不足时 FM 解调会发生什么?

FM 信号的最大相位变化率受最大频偏限制:广播 75 kHz 频偏要求相邻样本相位差小于 180 度,即采样率高于 2 乘 75 kHz 加信息带宽,实际留余量取 200 kSPS 以上。采样率不足时相邻相位差超过正负 180 度,辐角函数按缠绕后的值输出——声音里出现刺耳的"折叠噪声",这是 FM 独有的失败模式。

问题:能用这套代码解调窄带对讲机信号吗?

可以,改三个参数:低通截止从 100 kHz 降到 5 kHz、抽取比按设备采样率与 25 kSPS 音频速率的比例重算、去加重时间常数部分制式为 750 微秒。窄带信号带宽小 8 倍,单位带宽信噪比随之改善——同样的天线,对讲机往往比广播收得清楚。

问题:能不能只用 I 路或只用 Q 路解调?

不能,丢了正交分量就丢了相位旋转方向。只用一路实数信号,正负频偏在数学上不可区分,鉴频输出会正负混淆、波形翻折。I 与 Q 合起来才构成完整的"旋转指针"——这也是所有相干解调都基于复数运算的根本原因。

问题:解调输出的幅度为什么忽大忽小?要紧吗?

正交鉴频输出正比于"频偏乘信号幅度",信号衰落时输出随幅度起伏,音量跟着飘。严格的做法是鉴频前做 AGC 把幅度归一,鉴频输出就只反映频偏。离线实验里简单归一再播放即可;做长时记录时建议加上限幅或软限幅,防止信号突发增强时音频削波。

本节要点回顾

  • 正交鉴频公式:相邻样本共轭乘积取辐角,一步得到瞬时频偏。
  • 鉴频三前提:信号居中(否则输出带直流偏置)、已限带(否则拍频噪声)、采样率高于两倍频偏(否则相位跳变缠绕)。
  • 去加重 75 微秒:压掉随频率上升的调频噪声,音质立刻改观。
  • 门限效应:弱信号下 FM 的"非清晰即全噪",源自鉴频的非线性。

模拟调制到此打通。最后一节进入数字世界:星座图上那些云一样的点,如何变成一串比特。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U