【调制解调】FM 调频

说明

学习数字信号处理算法时整理的学习笔记。同系列文章目录可见 《DSP 学习之路》目录,代码已上传到 Github - ModulationAndDemodulation。本篇介绍 FM 调频信号的调制与解调,内附全套 MATLAB 代码。

1. FM 调制算法

1.1 FM 信号描述

调制信号去控制载波的瞬时频率,使其按照调制信号的规律变化,当调制信号是模拟信号时,这个过程就被称为调频(FM)。FM 信号的时域表达式为:

[s_{FM}(t)=Acos{left[omega_ct+{K_f}int_0^{t}{m(tau)}d{tau}right]} tag{1} ]

式中:(A) 为载波恒定振幅,(K_f) 为调频灵敏度(单位 (rad/(s{cdot}V))),(m(t)) 是调制信号(携带要发出去的信息),(cos{omega_ct}) 是载波,(omega_c) 是载波角频率,与载波频率 (f_c) 之间的关系为 (omega_c=2{pi}f_c)。由式 ((1)) 可得 FM 信号相对于载频 ({omega_c}) 的瞬时频偏为:

[frac{d{left[{K_f}int_0^{t}{m(tau)}d{tau}right]}}{dt}={K_f}m(t) tag{2} ]

((1)) 式可知 FM 信号相对于载波相位 ({omega}_ct)瞬时相位偏移(m(t)) 的积分呈线性变化,由 ((2)) 式可知 FM 信号相对于载频 ({omega_c})瞬时频率偏移(m(t)) 成线性变化,比例系数都为 (K_f)。有时候会用 (k_f) 表示调频灵敏度(单位 (Hz/V)),它与 (K_f) 之间的关系为 ({K_f}=2{pi}{k_f}),需注意这个转换关系。FM 的调频指数(调制指数) ({beta}) 定义如下,其中 (W) 是基带信号(调制信号)(m(t)) 的带宽(或最高频率):

[{beta}=frac{{k_f}{lvert}{m(t)}{rvert}_{max}}{W} tag{3} ]

(m(t)) 为单一频率的正弦波(即 (m(t)={A_m}cos({2{pi}{f_m}t})) 时,此时 (W={f_m})),则调制指数的表达式如下,调制指数的值正好与最大相位偏移相同,其中 ({Delta}f={beta}{f_m}) 表示最大频偏。

[{beta}=frac{{K_f}{A_m}}{omega_m}=frac{{k_f}{A_m}}{f_m}=frac{{Delta}f}{f_m}=left[{K_f}int_0^{t}{m(tau)}d{tau}right]_{max} tag{4} ]

FM 信号的频域表达式比较复杂,下面分成窄带调频宽带调频两种情况来简化讨论。

(1)窄带调频

一般将由 (m(t)) 引起的最大瞬时相位偏移远小于 (30^{circ}) 的情况称为窄带 FM,即满足以下条件时,FM 信号的频谱宽度比较窄,称为窄带调频(NBFM)。窄带调频占据的带宽较窄,传输数据量有限,主要应用于无线语音的传输(比如无线对讲机)。

[{lvert}{K_f}int_0^{t}{m(tau)}d{tau}{rvert}llfrac{pi}{6} tag{5} ]

此时,式 ((1)) 可以近似为:

[begin{aligned} s_{NBFM}(t)&=Acos{left[omega_ct+{K_f}int_0^{t}{m(tau)}d{tau}right]}\[1em] &=Acos{(omega_ct)}cos{left[{K_f}int_0^{t}{m(tau)}d{tau}right]}-Asin{(omega_ct)}sin{left[{K_f}int_0^{t}{m(tau)}d{tau}right]}\[1em] &approx{Acos}{(omega_ct)}cdot{1}-Asin{(omega_ct)}cdot{{K_f}int_0^{t}{m(tau)}d{tau}}\[1em] &={Acos}{(omega_ct)}-left[A{K_f}int_0^{t}{m(tau)}d{tau}right]sin{(omega_ct)} end{aligned} tag{6} ]

对其做傅里叶变换,得到窄带调频(NBFM)信号的频谱(幅度谱)表达式:

[S_{NBFM}(omega)={pi}Aleft[delta(omega+omega_c)+delta(omega-omega_c)right]+frac{AK_f}{2}left[frac{M(omega-omega_c)}{omega-omega_c}-frac{M(omega+omega_c)}{omega+omega_c}right] tag{7} ]

式中,(M(omega)) 是调制信号 (m(t)) 的频谱。与 AM 信号不同的是,NBFM 信号的两个边频分别乘了因式 (1/(omega-omega_c))(1/(omega+omega_c)),由于因式是频率的函数,所以这种加权是频率加权,加权的结果引起调制信号频谱的失真,此外, NBFM 的一个边带和 AM 反相。

(2)宽带调频

当不满足 ((5)) 式所表示的条件时,FM 信号被称为宽带调频(WBFM)。宽带调频所占用的频带宽度比较宽,传输数据量大,主要应用于调频立体声广播。WBFM 的时域表达式无法进一步简化,首先考虑单音调制的情况,然后把分析的结论推广到多音调制,当 (m(t)={A_m}cos({{omega_m}t})) 时,带入式 ((1)) 展开可得:

[begin{aligned} s_{WBFM}(t)&=Acos{left[omega_ct+{K_f}int_0^{t}{{A_m}cos({{omega_m}{tau}})}d{tau}right]}\[1em] &=Acos{left[omega_ct+frac{{K_f}{A_m}}{omega_m}sin({{omega_m}t})right]}\[1em] &=Acos{left[omega_ct+{beta}sin({{omega_m}t})right]}\[1em] &=Asumlimits_{n=-infty}^{infty}{{J_n}(beta)cos{left[(omega_c+nomega_m)tright]}} end{aligned} tag{8} ]

式中 (J_n(beta)) 为第一类 (n) 阶贝塞尔函数,它是调频指数 (beta) 的函数。对其做傅里叶变换,得到单音调制时宽带调频(WBFM)信号的频谱(幅度谱)表达式:

[S_{WBFM}(omega)={pi}Asumlimits_{n=-infty}^{infty}{{J_n}(beta)left[delta(omega-omega_c-nomega_m)+delta(omega+omega_c+nomega_m)right]} tag{9} ]

由式 ((8)) 和式 ((9)) 可见,WBFM 调频信号的频谱由载波分量 (omega_c) 和无数边频 ({omega_c}pm{nomega_m}) 组成。当 (n=0) 时是载波分量 (omega_c),其幅度为 (AJ_0(beta)),当 (nnot=0) 时就是对称分布在载频两侧的边频分量 ({omega_c}pm{nomega_m}),其幅度为 (AJ_n(beta)),相邻边频之间的间隔为 (omega_m)。且当 (n) 为奇数时,上下边频极性相反,当 (n) 为偶数时极性相同。由此可见,FM 信号的频谱不再是调制信号频谱的线性搬移,而是一种非线性过程。

1.2 FM 信号的带宽与功率分配

宽带调频信号的频谱包含无穷多个频率分量,因此理论上调频信号的频带宽度为无限宽。但是,实际上边频幅度 (J_n(beta)) 随着 (n) 的增大而逐渐减小,因此只要取适当的 (n) 值使边频分量小到可以忽略的程度,调频信号可以近似认为具有有限频谱。通常采用的原则是:信号的频带宽度应包括幅度大于未调载波的 (10%) 以上的边频分量,即 (lvert{J_n(beta)}rvertgeq0.1)。根据经验,当 (betageq1) 时,取边频数 (n=beta+1) 即可,因为 (n>beta+1) 以上的边频幅度 (J_n(beta)) 均小于 (0.1),相应产生的功率均在总功率的 (2%) 以下,可以忽略不计,根据这条经验规则,调频波的有效带宽为:

[B_{FM}=2(beta+1)W tag{10} ]

这就是广泛用于计算调频信号带宽的卡森(Carson)公式。式中 (beta) 为调频指数,(W) 为基带信号(调制信号)(m(t)) 的带宽(或最高频率)。对于单音调制信号(即 (m(t)={A_m}cos({2{pi}{f_m}t})) 时,此时 (W={f_m})),将 ((4)) 式带入 ((10)) 式,可得:

[B_{FM}=2(beta+1)f_m=2({Delta}f+f_m) tag{11} ]

  • (beta ll 1) 时(对应窄带调频),带宽可近似估计为 (B_{NBFM}approx2f_m),这时,带宽由第一对边频分量决定,带宽只随调制频率 (f_m) 变化,而与最大频偏 ({Delta}f) 无关。
  • (beta gg 1) 时(对应宽带调频),带宽可近似估计为 (B_{WBFM}approx2{Delta}f),这时,带宽由最大频偏 ({Delta}f) 决定,而与调制频率 (f_m) 无关。

利用帕塞瓦尔定理以及贝塞尔函数性质,不难求得 FM 信号功率 (P_{FM}) 与未调载波功率 (P_c) 的关系如下:

[P_{FM}=overline{s_{WBFM}^2(t)}=frac{A^2}{2}sumlimits_{n=-infty}^{infty}{{J_n^2}(beta)}=frac{A^2}{2}=P_c tag{12} ]

上式说明,调频信号的平均功率 (P_{FM}) 等于未调载波的平均功率 (P_c),即调制后总的功率不变,只是将原来载波功率中的一部分分配给每个边频分量,所以,调制过程只是进行功率的重新分配,而分配的原则与调频指数 (beta) 有关。

1.3 FM 信号的调制方法

FM 信号的调制方法有 3 种,一种是直接调频法,一种是间接调频法,第三种是正交调制法。

(1)直接调频法

直接调频法是用调制信号 (m(t)) 直接控制高频振荡器,让回路元件的参数发生改变,使其输出频率按调制信号的规律线性地变化,常用的元件是变容二极管。直接调频法的主要优点是在实现线性调频的要求下,可以获得较大的频偏,且实现电路简单;主要缺点是频率稳定度不高,往往需要采用自动频率控制系统来稳定中心频率。

(2)间接调频法

间接调频法也被称为倍频法、阿姆斯特朗法。该方法先将调制信号积分,然后对载波进行调相,即可产生一个 NBFM 信号,再经 (n) 次倍频器得到 WBFM 信号,间接调频法的优点是频率稳定性好,缺点是需要多次倍频和混频,电路较复杂。如下图所示,根据式 ((6)) 窄带调频的时域表达式可知,虚线框内所示部分可以用来获得 NBFM 信号。

【调制解调】FM 调频

上图中的倍频器是一个非线性器件,以理想平方律器件为例,其输出 (x_o(t)) 与输入 (x_i(t)) 的关系为 ({x_o}(t)=a{x_i^2}(t)),其中 (a) 为常数,将式 ((6)) 带入,得到:

[{x_o}(t)=ax^2(t)=frac{1}{2}aA^2left{ 1+cos{left[2omega_ct+2{K_f}int_0^{t}{m(tau)}d{tau}right]}right} tag{13} ]

接着将 (x_o(t)) 经过一个带通滤波器,就可以将其中的直流分量滤除,从而得到一个新的 FM 信号 (x'_o(t)),如下:

[x'_o(t)=frac{1}{2}aA^2cos{left[2omega_ct+2{K_f}int_0^{t}{m(tau)}d{tau}right]} tag{14} ]

这个信号的载频和相位偏移均增为原来的 (2) 倍,由于相位偏移增为 (2) 倍,因而调频指数也必然增为 (2) 倍,同理,经 (n) 次倍频后可以使调频信号的载频和调频指数增为 (n) 倍。增大调制指数时,一般需要保持载频不变或者不增大太多,这个时候可以接着使用一个混频器配一个带通滤波器来进行下变频,混频器只改变载频而不影响频偏,具体实现方法可参考《通信原理》相关资料。

(3)正交调制法

((1)) 式进行三角展开,可以得到:

[begin{aligned} s_{FM}(t)&=Acos{left[omega_ct+{K_f}int_0^{t}{m(tau)}d{tau}right]}\[1em] &=Acos{(omega_ct)}cos{left[{K_f}int_0^{t}{m(tau)}d{tau}right]}-Asin{(omega_ct)}sin{left[{K_f}int_0^{t}{m(tau)}d{tau}right]}\[1em] end{aligned} tag{15} ]

正交调制流程如下:

  1. 对调制信号 (m(t)) 进行积分,得到 (Phi=K_fint_0^{t}{m(tau)}d{tau})
  2. 对积分后的信号分别取余弦和正弦,得到 (I) 路数据 (I(t)=cos(Phi))(Q) 路数据 (Q(t)=sin(Phi))
  3. 分别乘以载波 (Acos(omega_ct))(-Asin(omega_ct)) 后相加,得到 FM 信号 (s_{FM}(t)=I(t)Acos(omega_ct)-Q(t)Asin(omega_ct))

其中第三步也可以先将 (I(t))(Q(t)) 组成一个复信号 (Z(t)=I(t)+iQ(t)),然后乘以复载波 (exp(iomega_ct)),最后取实部,即 (s_{FM}(t)=Realleft[Z(t)exp(iomega_ct)right]),两种方法是等价的。

1.4 窄带 FM 信号示例

上一小节中介绍的调制方法都与硬件实现相关,接下来使用 MATLAB 软件来直接生成 NBFM 信号。调制信号 (m(t)) 可以是确知信号,也可以是随机信号。当 (m(t)) 是确知信号时,不妨假设 (m(t)) 的时域表达式如下,对应的基带带宽 (W=f_m)

[m(t) = sin(2{pi}{f_m}t)+cos({pi}{f_m}t) tag{16} ]

各调制参数取值:(A=1)(f_m=2500Hz)({beta}=10^{-6})(f_c=20000Hz)。信号采样率 (f_s=8{f_c}),仿真总时长为 (2s)。FM 调制效果如下图所示(为了美观,时域只显示前 500 个点),调制信号 (m(t)) 双边幅度谱有四根离散谱线(({pm}2500Hz)({pm}1250Hz)),调制信号 (m(t)) 积分后的双边幅度谱有五根离散谱线((0Hz)({pm}2500Hz)({pm}1250Hz)),NBFM 调频信号 (s(t)) 双边幅度谱有十根离散谱线(({pm}22500Hz)({pm}21250Hz)({pm}20000Hz)({pm}18750Hz)({pm}17500Hz))。NBFM 调频信号 (s(t)) 的带宽满足公式 (B_{NBFM}approx2f_m=5000Hz),代码详见附录 main_modFM_example1.mmod_fm.m,设置 beta = 1e-6 即可。

【调制解调】FM 调频

(m(t)) 是随机信号时,不妨假设基带信号带宽为 (W={f_H}=3000Hz),各调制参数取值:(A=1)({beta}=10^{-6})(f_c=20000Hz)。信号采样率 (f_s=8{f_c}),仿真总时长为 (2s)。FM 调制效果如下图所示(为了美观,时域只显示前 500 个点),调制信号 (m(t)) 双边幅度谱中间谱峰的范围约为 (-3000Hz{sim}3000Hz),调制信号 (m(t)) 积分后的双边幅度谱中间谱峰的范围依然约为 (-3000Hz{sim}3000Hz),NBFM 调频信号 (s(t)) 双边幅度谱有两根离散谱线(({pm}20000Hz))及两个谱峰(范围约为 (-23000Hz{sim}-17000Hz)(17000Hz{sim}23000Hz))。NBFM 调频信号 (s(t)) 的带宽满足公式 (B_{NBFM}approx2f_H=6000Hz),代码详见附录 main_modFM_example2.mmod_fm.m,设置 beta = 1e-6 即可。

【调制解调】FM 调频

1.5 宽带 FM 信号示例

(m(t)) 是确知信号时,设 (f_m=2500Hz)(beta=4),其他参数与 1.4 节中的确知信号相同,FM 调制效果如下图所示,带宽约为 (B_{FM}=2(beta+1)f_m=25000Hz),代码详见附录 main_modFM_example1.mmod_fm.m,设置 fm = 2500, beta = 4 即可。

【调制解调】FM 调频

.当 (m(t)) 是确知信号时,设 (f_m=1000Hz)(beta=15),其他参数与 1.4 节中的确知信号相同,FM 调制效果如下图所示,带宽约为 (B_{WBFM}approx2{Delta}f=2{beta}f_m=30000Hz),代码详见附录 main_modFM_example1.mmod_fm.m,设置 fm = 1000, beta = 15 即可。

【调制解调】FM 调频

2. FM 解调算法

解调是调制的逆过程,其作用是从接收的已调信号中恢复原基带信号(即调制信号)。FM 解调的方法也分为相干解调和非相干解调,普通的相干解调仅适用于 NBFM 信号,正交相干解调与非相干解调对 NBFM 信号和 WBFM 信号均适用。下面分别用几种不同方法对 1.4 与 1.5 节中确知信号的 FM 调制结果进行解调。

2.1 非相干解调(鉴频器)

微分器和包络检波器是一种最常见的鉴频器。其中微分器的作用是把幅度恒定的调频波 (s_{FM}(t)) 变成幅度和频率都随调制信号 (m(t)) 变化的调幅调频波 (s_d(t)),即:

[begin{aligned} s_d(t)&=frac{ds_{FM}(t)}{dt}\[1em] &=frac{dleft{ Acos{left[omega_ct+{K_f}int_0^{t}{m(tau)}d{tau}right]}right}}{dt}\[1em] &=-Aleft[omega_c+{K_f}m(t)right]sin{left[omega_ct+{K_f}int_0^{t}{m(tau)}d{tau}right]}\[1em] end{aligned} tag{17} ]

包络检波器则将其幅度变化检出并滤去直流,即得解调输出 (m_o(t)={K_d}{K_f}m(t)),式中 (K_d) 为鉴频器灵敏度(单位 (V/(rad/s)))。FM 非相干解调(鉴频器)一般有以下四个步骤,其中第一步是微分器,第二至第四步是包络检波器,与 AM 包络检波的流程一样。

  1. 第一步:求微分,得到 (s_d(t))
  2. 第二步:全波整流(对 (s(t)) 取绝对值)或半波整流(将 (s(t)) 小于 (0) 的地方置零)。
  3. 第三步:低通滤波器滤除高频载波,滤除 (2{omega}_c)({omega}_c)
  4. 第四步:去除直流分量(减去自身均值)。

对 1.4 节中的 FM 信号,设定 (f_m=2500Hz)({beta}=10^{-6}),信噪比 (SNR=150dB),非相干解调效果如下,最大频偏 ({Delta}f={beta}f_m=0.0025Hz) 过小,解调效果很差。

【调制解调】FM 调频

对 1.5 节中的 FM 信号,设定 (f_m=2500Hz)({beta}=4),信噪比 (SNR=50dB),非相干解调效果如下,解调后幅度放大系数 (k=overline{{lvert}m(t){rvert}}/overline{{lvert}hat{m}(t){rvert}}approx7.61),使用这个系数放大解调信号幅值,然后计算误差,有:(sqrt{sum{{lvert}m(t_i)-khat{m}(t_i){rvert}^2}}/sqrt{sum{{lvert}m(t_i){rvert}^2}}approx0.0920)

【调制解调】FM 调频

对 1.5 节中的 FM 信号,设定 (f_m=1000Hz)({beta}=15),信噪比 (SNR=50dB),非相干解调效果如下,解调后幅度放大系数 (k=overline{{lvert}m(t){rvert}}/overline{{lvert}hat{m}(t){rvert}}approx5.07),使用这个系数放大解调信号幅值,然后计算误差,有:(sqrt{sum{{lvert}m(t_i)-khat{m}(t_i){rvert}^2}}/sqrt{sum{{lvert}m(t_i){rvert}^2}}approx0.0634)

【调制解调】FM 调频

非相干解调(鉴频器)的代码详见 lpf_filter.mdemod_fm_method1.mmain_demodFM_example1.m

2.2 非相干解调(鉴频器 - 希尔伯特变换法)

鉴频器中的包络检波器可以通过希尔伯特变换法来实现,解调时无需任何载频信息,这样,FM 非相干解调(鉴频器)可以分为以下三个步骤。

  1. 第一步:求微分,得到 (s_d(t))
  2. 第二步:计算 (s_d(t)) 的希尔伯特变换,得到一个复信号(实部为 (s_d(t)),虚部为其希尔伯特变换结果),对所得复信号取模,即为 (s_d(t)) 的包络。
  3. 第三步:去除直流分量(减去自身均值)。

对 1.4 节中的 FM 信号,设定 (f_m=2500Hz)({beta}=10^{-6}),信噪比 (SNR=150dB),非相干解调效果如下,最大频偏 ({Delta}f={beta}f_m=0.0025Hz) 过小,解调效果很差。

【调制解调】FM 调频

对 1.5 节中的 FM 信号,设定 (f_m=2500Hz)({beta}=4),信噪比 (SNR=50dB),非相干解调效果如下,解调后幅度放大系数 (k=overline{{lvert}m(t){rvert}}/overline{{lvert}hat{m}(t){rvert}}approx4.87),使用这个系数放大解调信号幅值,然后计算误差,有:(sqrt{sum{{lvert}m(t_i)-khat{m}(t_i){rvert}^2}}/sqrt{sum{{lvert}m(t_i){rvert}^2}}approx0.0492)

【调制解调】FM 调频

对 1.5 节中的 FM 信号,设定 (f_m=1000Hz)({beta}=15),信噪比 (SNR=50dB),非相干解调效果如下,解调后幅度放大系数 (k=overline{{lvert}m(t){rvert}}/overline{{lvert}hat{m}(t){rvert}}approx3.26),使用这个系数放大解调信号幅值,然后计算误差,有:(sqrt{sum{{lvert}m(t_i)-khat{m}(t_i){rvert}^2}}/sqrt{sum{{lvert}m(t_i){rvert}^2}}approx0.0433)

【调制解调】FM 调频

非相干解调(鉴频器 - 希尔伯特变换法)的代码详见 demod_fm_method2.mmain_demodFM_example2.m

2.3 相干解调

相干解调时,为了无失真地恢复原基带信号,接收端必须提供一个与调制载波严格同步(同频同相)的本地载波(称为相干载波,可使用锁相环技术得到)。普通的相干解调仅适用于 NBFM 信号,其解调框图如下:

【调制解调】FM 调频

其中:

[s_{NBFM}(t)={Acos}{(omega_ct)}-left[A{K_f}int_0^{t}{m(tau)}d{tau}right]sin{(omega_ct)} tag{18} ]

相干载波 (c(t)=-sin({omega_c}t)),则相乘器的输出为:

[s_p(t)=-frac{A}{2}sin{(2{omega_c}t)}+left[frac{AK_f}{2}int_0^{t}{m(tau)}d{tau}right]cdotleft[{1-cos(2{omega_c}t)}right] tag{19} ]

经低通滤波器取出其低频分量:

[s_d(t)=frac{AK_f}{2}int_0^{t}{m(tau)}d{tau} tag{20} ]

再经微分器,即得解调输出:

[m_o(t)=frac{AK_f}{2}m(t) tag{21} ]

可见,相干解调可以恢复原调制信号,这种解调方法与线性调制中的相干解调一样,要求本地载波与调制载波同步,否则将使解调信号失真。NBFM 相干解调可以分为以下几步:

  1. 第一步:乘以相干载波(即乘以 (-sin({omega_c}t+phi_0))),注意载波初始相位。
  2. 第二步:低通滤波滤除高频载波,滤除 (2omega_c)
  3. 第三步:求微分。

对 1.4 节中的 FM 信号,设定 (f_m=2500Hz)({beta}=10^{-6}),信噪比 (SNR=150dB),相干解调效果如下,解调后幅度放大系数 (k=overline{{lvert}m(t){rvert}}/overline{{lvert}hat{m}(t){rvert}}approx222.30),使用这个系数放大解调信号幅值,然后计算误差,有:(sqrt{sum{{lvert}m(t_i)-khat{m}(t_i){rvert}^2}}/sqrt{sum{{lvert}m(t_i){rvert}^2}}approx0.1313)。更改相干载波的初始相位为 ({phi_0}=pi/4,pi/2),或者更改相干载波的中心频率为 (0.8f_c,1.2f_c) 后,解调效果变差,说明这种方法对相干载波同频同相的要求较高,鲁棒性不够强悍,可使用锁相环技术来改善这一缺点。

【调制解调】FM 调频

对 1.5 节中的 FM 信号,设定 (f_m=2500Hz)({beta}=4),信噪比 (SNR=50dB),相干解调效果如下,可知这种方法不适用于非窄带调频信号。

【调制解调】FM 调频

对 1.5 节中的 FM 信号,设定 (f_m=1000Hz)({beta}=15),信噪比 (SNR=50dB),相干解调效果如下,可知这种方法不适用于非窄带调频信号。

【调制解调】FM 调频

相干解调的代码详见 lpf_filter.mdemod_fm_method3.mmain_demodFM_example3.m

2.4 数字正交解调

数字正交解调也属于相干解调的一种,但这种方法具有较强的抗载频失配能力,不要求相干载波严格的同频同相。FM 数字正交解调一般有以下四个步骤:

  1. 第一步:乘以正交相干载波得到 ({s_I}(t))({s_Q}(t)),即 ({s_I}(t)=s(t)cos({omega_ct}+{phi_0}))({s_Q}(t)=-s(t)sin({omega_ct}+{phi_0}))
  2. 第二步:低通滤波器滤除 ({s_I}(t))({s_Q}(t)) 中的高频分量。
  3. 第三步:通过反正切计算相位 (Phi(t)=atanleft[frac{s_Q(t)}{s_I(t)}right]=kint_0^{t}{m(tau)}d{tau})
  4. 第四步:对相位进行差分,得到解调结果 (m_o(t))

反正切运算在硬件中难以实现,通过一阶近似,上面第三步与第四步可合并为以下式子:

[m_o(t)=frac{{s_I(n-1)}{s_Q(n)}-{s_I(n)}{s_Q(n-1)}}{{s_I^2(n)}+{s_Q^2(n)}} tag{22} ]

对 1.4 节中的 FM 信号,设定 (f_m=2500Hz)({beta}=10^{-6}),信噪比 (SNR=150dB),数字正交解调效果如下,解调后幅度放大系数 (k=overline{{lvert}m(t){rvert}}/overline{{lvert}hat{m}(t){rvert}}approx17782852.62),使用这个系数放大解调信号幅值,然后计算误差,有:(sqrt{sum{{lvert}m(t_i)-khat{m}(t_i){rvert}^2}}/sqrt{sum{{lvert}m(t_i){rvert}^2}}approx0.1318)

【调制解调】FM 调频

对 1.5 节中的 FM 信号,设定 (f_m=2500Hz)({beta}=4),信噪比 (SNR=50dB),数字正交解调效果如下,解调后幅度放大系数 (k=overline{{lvert}m(t){rvert}}/overline{{lvert}hat{m}(t){rvert}}approx4.48),使用这个系数放大解调信号幅值,然后计算误差,有:(sqrt{sum{{lvert}m(t_i)-khat{m}(t_i){rvert}^2}}/sqrt{sum{{lvert}m(t_i){rvert}^2}}approx0.0391)

【调制解调】FM 调频

对 1.5 节中的 FM 信号,设定 (f_m=1000Hz)({beta}=15),信噪比 (SNR=50dB),数字正交解调效果如下,解调后幅度放大系数 (k=overline{{lvert}m(t){rvert}}/overline{{lvert}hat{m}(t){rvert}}approx2.99),使用这个系数放大解调信号幅值,然后计算误差,有:(sqrt{sum{{lvert}m(t_i)-khat{m}(t_i){rvert}^2}}/sqrt{sum{{lvert}m(t_i){rvert}^2}}approx0.0163)

【调制解调】FM 调频

数字正交解调的代码详见 lpf_filter.mdemod_fm_method4.mmain_demodFM_example4.m。更改相干载波的初始相位为 ({phi_0}=pi/4,pi/2),或者更改相干载波的中心频率为 (0.8f_c,1.2f_c) 后,解调效果依然比较好,说明这种方法具有较好的抗载频失配能力。

3. FM 仿真(MATLAB Communications Toolbox)

MATLAB 的 Communications Toolbox 中提供了 FM 调制函数 fmmod,高斯白噪声函数 awgn,以及 FM 解调函数 fmdemod,可以很方便地完成 FM 信号仿真。使用这三个函数实现上面 1.4 节中确知信号 (m(t)) 的 FM 调制解调,调制后加噪声的效果如下:

【调制解调】FM 调频

解调效果如下:

【调制解调】FM 调频

解调信号与调制信号波形基本重回,计算误差,有:(sqrt{sum{{lvert}m(t_i)-hat{m}(t_i){rvert}^2}}/sqrt{sum{{lvert}m(t_i){rvert}^2}}approx0.2397)。代码详见附录 main_CommFM_example.m

参考资料

[1] 楼才义,徐建良,杨小牛.软件无线电原理与应用[M].电子工业出版社,2014.

[2] 樊昌信,曹丽娜.通信原理.第7版[M].国防工业出版社,2012.

[3] 刘学勇.详解MATLAB/Simulink通信系统建模与仿真[M].电子工业出版社,2011.

[4] 王丽娜,王兵.卫星通信系统.第2版[M].国防工业出版社,2014.

[5] 博客园 - 两种频率调制(FM)方法的MATLAB实现

[6] CSDN - 数字信号处理基础----FM的调制与解调

附录代码

附.1 文件 mod_fm.m

function [ sig_fm, deltaf ] = mod_fm(fc, beta, fs, mt, t, W, A) % MOD_FM        FM 调频 % 输入参数: %       fc      载波中心频率 %       beta    调频指数/调制指数 %       fs      信号采样率 %       mt      调制信号 %       t       采样时间 %       W       基带信号带宽(最高频率) %       A       载波恒定振幅 % 输出参数: %       sig_fm  调频(FM)实信号 %       deltaf  最大频偏 % @author 木三百川  % 计算调频灵敏度及最大频偏 kf = beta*W/max(abs(mt)); deltaf = beta*W;  % 计算调制信号积分 int_mt = cumtrapz(t,mt);  % 生成信号 sig_fm = A*cos(2*pi*fc*t+2*pi*kf*int_mt); % FM调频信号  % 绘图 nfft = length(sig_fm); freq = (-nfft/2:nfft/2-1).'*(fs/nfft); figure;set(gcf,'color','w'); plot_length = min(500, length(sig_fm)); subplot(3,2,1); plot(t(1:plot_length), mt(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('调制信号m(t)'); subplot(3,2,2); plot(freq, 10*log10(fftshift(abs(fft(mt,nfft)/nfft))+eps));xlim([freq(1),freq(end)]); xlabel('频率/hz');ylabel('幅度/dB');title('调制信号m(t)双边幅度谱');  subplot(3,2,3); plot(t(1:plot_length), int_mt(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('调制信号m(t)积分'); subplot(3,2,4); plot(freq, 10*log10(fftshift(abs(fft(int_mt,nfft)/nfft))+eps));xlim([freq(1),freq(end)]); xlabel('频率/hz');ylabel('幅度/dB');title('调制信号m(t)积分双边幅度谱');  subplot(3,2,5); plot(t(1:plot_length), sig_fm(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('FM调频信号s(t)'); subplot(3,2,6); plot(freq, 10*log10(fftshift(abs(fft(sig_fm,nfft)/nfft))+eps));xlim([freq(1),freq(end)]); xlabel('频率/hz');ylabel('幅度/dB');title('FM调频信号s(t)双边幅度谱');  end 

附.2 文件 main_modFM_example1.m

clc; clear; close all; % FM 调制仿真(调制信号为确知信号) % @author 木三百川  % 调制参数 A = 1;                  % 载波恒定振幅 fm = 2500;              % 调制信号参数 beta = 1e-6;            % 调频指数/调制指数 fc = 20000;             % 载波频率 fs = 8*fc;              % 采样率 total_time = 2;         % 仿真时长,单位:秒  % 采样时间 t = 0:1/fs:total_time-1/fs;  % 调制信号为确知信号 mt = sin(2*pi*fm*t)+cos(pi*fm*t); W = fm;  % FM 调制 [ sig_fm, deltaf ] = mod_fm(fc, beta, fs, mt, t, W, A); fprintf('最大频偏 deltaf = %.6f Hz.n', deltaf); 

附.3 文件 main_modFM_example2.m

clc; clear; close all; % FM 调制仿真(调制信号为随机信号) % @author 木三百川  % 调制参数 A = 1;                  % 载波恒定振幅 fH = 3000;          	% 基带信号带宽 beta = 1e-6;            % 调频指数/调制指数 fc = 20000;             % 载波频率 fs = 8*fc;              % 采样率 total_time = 2;         % 仿真时长,单位:秒  % 采样时间 t = 0:1/fs:total_time-1/fs;  % 调制信号为随机信号 mt = randn(size(t)); b = fir1(512, fH/(fs/2), 'low'); mt = filter(b,1,mt); mt = mt - mean(mt); W = fH;  % FM 调制 [ sig_fm, deltaf ] = mod_fm(fc, beta, fs, mt, t, W, A); fprintf('最大频偏 deltaf = %.6f Hz.n', deltaf); 

附.4 文件 lpf_filter.m

function sig_lpf = lpf_filter(sig_data, cutfre) % LPF_FILTER    自定义理想低通滤波器 % 输入参数: %       sig_data        待滤波数据 %       cutfre          截止频率,范围 (0,1) % 输出参数: %       sig_lpf         低通滤波结果 % @author 木三百川  nfft = length(sig_data); lidx = round(nfft/2-cutfre*nfft/2); ridx = nfft - lidx; sig_fft_lpf = fftshift(fft(sig_data)); sig_fft_lpf([1:lidx,ridx:nfft]) = 0; sig_lpf = real(ifft(fftshift(sig_fft_lpf)));  end 

附.5 文件 demod_fm_method1.m

function [ sig_fm_demod ] = demod_fm_method1(sig_fm_receive, fc, fs, t) % DEMOD_FM_METHOD1        FM 非相干解调(鉴频器) % 输入参数: %       sig_fm_receive      FM 接收信号,行向量 %       fc                  载波中心频率 %       fs                  信号采样率 %       t                   采样时间 % 输出参数: %       sig_fm_demod        解调结果,与 sig_fm_receive 等长 % @author 木三百川  % 第一步:求微分 sig_dfm = [diff(sig_fm_receive),0];  % 第二步:全波整流 sig_fm_abs = abs(sig_dfm);  % 第三步:低通滤波 sig_fm_lpf = lpf_filter(sig_fm_abs, fc/2/(fs/2));  % 第四步:去除直流分量 sig_fm_demod = sig_fm_lpf - mean(sig_fm_lpf);  % 绘图 nfft = length(sig_fm_abs); freq = (-nfft/2:nfft/2-1).'*(fs/nfft); figure;set(gcf,'color','w'); plot_length = min(500, length(sig_fm_abs)); subplot(3,2,1); plot(t(1:plot_length), sig_fm_abs(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('全波整流结果'); subplot(3,2,2); plot(freq, 10*log10(fftshift(abs(fft(sig_fm_abs,nfft)/nfft))+eps));xlim([freq(1),freq(end)]); xlabel('频率/hz');ylabel('幅度/dB');title('全波整流结果双边幅度谱');  subplot(3,2,3); plot(t(1:plot_length), sig_fm_lpf(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('低通滤波结果'); subplot(3,2,4); plot(freq, 10*log10(fftshift(abs(fft(sig_fm_lpf,nfft)/nfft))+eps));xlim([freq(1),freq(end)]); xlabel('频率/hz');ylabel('幅度/dB');title('低通滤波结果双边幅度谱');  subplot(3,2,5); plot(t(1:plot_length), sig_fm_demod(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('(去除直流)解调结果'); subplot(3,2,6); plot(freq, 10*log10(fftshift(abs(fft(sig_fm_demod,nfft)/nfft))+eps));xlim([freq(1),freq(end)]); xlabel('频率/hz');ylabel('幅度/dB');title('(去除直流)解调结果双边幅度谱');  end 

附.6 文件 main_demodFM_example1.m

clc; clear; close all; % FM 解调仿真(调制信号为确知信号,非相干解调) % @author 木三百川  % 调制参数 A = 1;                  % 载波恒定振幅 fm = 1000;              % 调制信号参数 beta = 15;              % 调频指数/调制指数 fc = 20000;             % 载波频率 fs = 8*fc;              % 采样率 total_time = 2;         % 仿真时长,单位:秒  % 采样时间 t = 0:1/fs:total_time-1/fs;  % 调制信号为确知信号 mt = sin(2*pi*fm*t)+cos(pi*fm*t); W = fm;  % FM 调制 [ sig_fm_send, deltaf ] = mod_fm(fc, beta, fs, mt, t, W, A); fprintf('最大频偏 deltaf = %.6f Hz.n', deltaf);  % 加噪声 snr = 50;               % 信噪比 sig_fm_receive = awgn(sig_fm_send, snr, 'measured');  % 非相干解调 [ sig_fm_demod ] = demod_fm_method1(sig_fm_receive, fc, fs, t);  % 绘图 nfft = length(sig_fm_receive); freq = (-nfft/2:nfft/2-1).'*(fs/nfft); figure;set(gcf,'color','w'); plot_length = min(500, length(sig_fm_receive)); subplot(1,2,1); plot(t(1:plot_length), sig_fm_receive(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('FM接收信号'); subplot(1,2,2); plot(freq, 10*log10(fftshift(abs(fft(sig_fm_receive,nfft)/nfft))+eps));xlim([freq(1),freq(end)]); xlabel('频率/hz');ylabel('幅度/dB');title('FM接收信号双边幅度谱');  coef = mean(abs(mt))/mean(abs(sig_fm_demod)); fprintf('norm(调制信号 - %.2f * 解调信号)/norm(调制信号) = %.4f.n', coef, norm(mt-coef*sig_fm_demod)/norm(mt));  figure;set(gcf,'color','w'); plot(t(1:plot_length), mt(1:plot_length));xlim([t(1),t(plot_length)]); hold on; plot(t(1:plot_length), coef*sig_fm_demod(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('解调效果'); legend('调制信号','解调信号(放大后)'); 

附.7 文件 demod_fm_method2.m

function [ sig_fm_demod ] = demod_fm_method2(sig_fm_receive, fs, t) % DEMOD_FM_METHOD2        FM 非相干解调(鉴频器 - 希尔伯特变换法) % 输入参数: %       sig_fm_receive      FM 接收信号,行向量 %       fs                  信号采样率 %       t                   采样时间 % 输出参数: %       sig_fm_demod        解调结果,与 sig_fm_receive 等长 % @author 木三百川  % 第一步:求微分 sig_dfm = [diff(sig_fm_receive),0];  % 第二步:计算信号包络 sig_fm_envelope = abs(hilbert(sig_dfm));  % 第三步:去除直流分量 sig_fm_demod = sig_fm_envelope - mean(sig_fm_envelope);  % 绘图 nfft = length(sig_fm_receive); freq = (-nfft/2:nfft/2-1).'*(fs/nfft); figure;set(gcf,'color','w'); plot_length = min(500, length(sig_fm_receive)); subplot(3,2,1); plot(t(1:plot_length), sig_dfm(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('求微分结果'); subplot(3,2,2); plot(freq, 10*log10(fftshift(abs(fft(sig_dfm,nfft)/nfft))+eps));xlim([freq(1),freq(end)]); xlabel('频率/hz');ylabel('幅度/dB');title('求微分结果双边幅度谱');  subplot(3,2,3); plot(t(1:plot_length), sig_fm_envelope(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('计算信号包络结果'); subplot(3,2,4); plot(freq, 10*log10(fftshift(abs(fft(sig_fm_envelope,nfft)/nfft))+eps));xlim([freq(1),freq(end)]); xlabel('频率/hz');ylabel('幅度/dB');title('计算信号包络结果双边幅度谱');  subplot(3,2,5); plot(t(1:plot_length), sig_fm_demod(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('(去除直流)解调结果'); subplot(3,2,6); plot(freq, 10*log10(fftshift(abs(fft(sig_fm_demod,nfft)/nfft))+eps));xlim([freq(1),freq(end)]); xlabel('频率/hz');ylabel('幅度/dB');title('(去除直流)解调结果双边幅度谱');  end 

附.8 文件 main_demodFM_example2.m

clc; clear; close all; % FM 解调仿真(调制信号为确知信号,非相干解调/希尔伯特变换法) % @author 木三百川  % 调制参数 A = 1;                  % 载波恒定振幅 fm = 1000;              % 调制信号参数 beta = 15;              % 调频指数/调制指数 fc = 20000;             % 载波频率 fs = 8*fc;              % 采样率 total_time = 2;         % 仿真时长,单位:秒  % 采样时间 t = 0:1/fs:total_time-1/fs;  % 调制信号为确知信号 mt = sin(2*pi*fm*t)+cos(pi*fm*t); W = fm;  % FM 调制 [ sig_fm_send, deltaf ] = mod_fm(fc, beta, fs, mt, t, W, A); fprintf('最大频偏 deltaf = %.6f Hz.n', deltaf);  % 加噪声 snr = 50;               % 信噪比 sig_fm_receive = awgn(sig_fm_send, snr, 'measured');  % 非相干解调 [ sig_fm_demod ] = demod_fm_method2(sig_fm_receive, fs, t);  % 绘图 nfft = length(sig_fm_receive); freq = (-nfft/2:nfft/2-1).'*(fs/nfft); figure;set(gcf,'color','w'); plot_length = min(500, length(sig_fm_receive)); subplot(1,2,1); plot(t(1:plot_length), sig_fm_receive(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('FM接收信号'); subplot(1,2,2); plot(freq, 10*log10(fftshift(abs(fft(sig_fm_receive,nfft)/nfft))+eps));xlim([freq(1),freq(end)]); xlabel('频率/hz');ylabel('幅度/dB');title('FM接收信号双边幅度谱');  coef = mean(abs(mt))/mean(abs(sig_fm_demod)); fprintf('norm(调制信号 - %.2f * 解调信号)/norm(调制信号) = %.4f.n', coef, norm(mt-coef*sig_fm_demod)/norm(mt));  figure;set(gcf,'color','w'); plot(t(1:plot_length), mt(1:plot_length));xlim([t(1),t(plot_length)]); hold on; plot(t(1:plot_length), coef*sig_fm_demod(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('解调效果'); legend('调制信号','解调信号(放大后)'); 

附.9 文件 demod_fm_method3.m

function [ sig_fm_demod ] = demod_fm_method3(sig_fm_receive, fc, fs, t, phi0) % DEMOD_FM_METHOD3        FM 相干解调 % 输入参数: %       sig_fm_receive      FM 接收信号,行向量 %       fc                  载波中心频率 %       fs                  信号采样率 %       t                   采样时间 %       phi0                相干载波初始相位 % 输出参数: %       sig_fm_demod        解调结果,与 sig_fm_receive 等长 % @author 木三百川  % 第一步:乘以相干载波 sig_fm_ct = -sig_fm_receive.*sin(2*pi*fc*t+phi0);  % 第二步:低通滤波 sig_fm_lpf = lpf_filter(sig_fm_ct, fc/(fs/2));  % 第三步:求微分 sig_fm_demod = [diff(sig_fm_lpf),0]*fs;  % 绘图 nfft = length(sig_fm_receive); freq = (-nfft/2:nfft/2-1).'*(fs/nfft); figure;set(gcf,'color','w'); plot_length = min(500, length(sig_fm_receive)); subplot(3,2,1); plot(t(1:plot_length), sig_fm_ct(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('乘以相干载波结果'); subplot(3,2,2); plot(freq, 10*log10(fftshift(abs(fft(sig_fm_ct,nfft)/nfft))+eps));xlim([freq(1),freq(end)]); xlabel('频率/hz');ylabel('幅度/dB');title('乘以相干载波结果双边幅度谱');  subplot(3,2,3); plot(t(1:plot_length), sig_fm_lpf(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('低通滤波结果'); subplot(3,2,4); plot(freq, 10*log10(fftshift(abs(fft(sig_fm_lpf,nfft)/nfft))+eps));xlim([freq(1),freq(end)]); xlabel('频率/hz');ylabel('幅度/dB');title('低通滤波结果双边幅度谱');  subplot(3,2,5); plot(t(1:plot_length), sig_fm_demod(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('(求微分)解调结果'); subplot(3,2,6); plot(freq, 10*log10(fftshift(abs(fft(sig_fm_demod,nfft)/nfft))+eps));xlim([freq(1),freq(end)]); xlabel('频率/hz');ylabel('幅度/dB');title('(求微分)解调结果双边幅度谱');  end 

附.10 文件 main_demodFM_example3.m

clc; clear; close all; % FM 解调仿真(调制信号为确知信号,相干解调) % @author 木三百川  % 调制参数 A = 1;                  % 载波恒定振幅 fm = 2500;              % 调制信号参数 beta = 1e-6;            % 调频指数/调制指数 fc = 20000;             % 载波频率 fs = 8*fc;              % 采样率 total_time = 2;         % 仿真时长,单位:秒  % 采样时间 t = 0:1/fs:total_time-1/fs;  % 调制信号为确知信号 mt = sin(2*pi*fm*t)+cos(pi*fm*t); W = fm;  % FM 调制 [ sig_fm_send, deltaf ] = mod_fm(fc, beta, fs, mt, t, W, A); fprintf('最大频偏 deltaf = %.6f Hz.n', deltaf);  % 加噪声 snr = 150;               % 信噪比 sig_fm_receive = awgn(sig_fm_send, snr, 'measured');  % 相干解调 ini_phase = 0; [ sig_fm_demod ] = demod_fm_method3(sig_fm_receive, fc, fs, t, ini_phase);  % 绘图 nfft = length(sig_fm_receive); freq = (-nfft/2:nfft/2-1).'*(fs/nfft); figure;set(gcf,'color','w'); plot_length = min(500, length(sig_fm_receive)); subplot(1,2,1); plot(t(1:plot_length), sig_fm_receive(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('FM接收信号'); subplot(1,2,2); plot(freq, 10*log10(fftshift(abs(fft(sig_fm_receive,nfft)/nfft))+eps));xlim([freq(1),freq(end)]); xlabel('频率/hz');ylabel('幅度/dB');title('FM接收信号双边幅度谱');  coef = mean(abs(mt))/mean(abs(sig_fm_demod)); fprintf('norm(调制信号 - %.2f * 解调信号)/norm(调制信号) = %.4f.n', coef, norm(mt-coef*sig_fm_demod)/norm(mt));  figure;set(gcf,'color','w'); plot(t(1:plot_length), mt(1:plot_length));xlim([t(1),t(plot_length)]); hold on; plot(t(1:plot_length), coef*sig_fm_demod(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('解调效果'); legend('调制信号','解调信号(放大后)'); 

附.11 文件 demod_fm_method4.m

function [ sig_fm_demod ] = demod_fm_method4(sig_fm_receive, fc, fs, t, phi0) % DEMOD_FM_METHOD4        FM 数字正交解调/相干解调 % 输入参数: %       sig_fm_receive      FM 接收信号,行向量 %       fc                  载波中心频率 %       fs                  信号采样率 %       t                   采样时间 %       phi0                相干载波初始相位 % 输出参数: %       sig_fm_demod        解调结果,与 sig_fm_receive 等长 % @author 木三百川  % 第一步:乘以正交相干载波 sig_fm_i = sig_fm_receive.*cos(2*pi*fc*t+phi0); sig_fm_q = -sig_fm_receive.*sin(2*pi*fc*t+phi0);  % 第二步:低通滤波 sig_fm_i_lpf = lpf_filter(sig_fm_i, fc/(fs/2)); sig_fm_q_lpf = lpf_filter(sig_fm_q, fc/(fs/2));  % 第三步:计算相位 Pt = unwrap(atan2(sig_fm_q_lpf, sig_fm_i_lpf));  % 第四步:计算差分 sig_fm_demod = [diff(Pt),0];  % % 合并第三步与第四步:反正切近似 % sig_fm_demod = (sig_fm_i_lpf(1:end-1).*sig_fm_q_lpf(2:end)-sig_fm_i_lpf(2:end).* ... %     sig_fm_q_lpf(1:end-1))./(sig_fm_i_lpf(2:end).^2+sig_fm_q_lpf(2:end).^2); % sig_fm_demod = [sig_fm_demod, sig_fm_demod(end)];  % 绘图 nfft = length(sig_fm_receive); freq = (-nfft/2:nfft/2-1).'*(fs/nfft); figure;set(gcf,'color','w'); plot_length = min(500, length(sig_fm_receive)); subplot(2,2,1); plot(t(1:plot_length), sig_fm_i(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('乘以正交相干载波 I 路结果'); subplot(2,2,2); plot(freq, 10*log10(fftshift(abs(fft(sig_fm_i,nfft)/nfft))+eps));xlim([freq(1),freq(end)]); xlabel('频率/hz');ylabel('幅度/dB');title('乘以正交相干载波 I 路结果双边幅度谱'); subplot(2,2,3); plot(t(1:plot_length), sig_fm_q(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('乘以正交相干载波 Q 路结果'); subplot(2,2,4); plot(freq, 10*log10(fftshift(abs(fft(sig_fm_q,nfft)/nfft))+eps));xlim([freq(1),freq(end)]); xlabel('频率/hz');ylabel('幅度/dB');title('乘以正交相干载波 Q 路结果双边幅度谱');  figure;set(gcf,'color','w'); subplot(2,2,1); plot(t(1:plot_length), sig_fm_i_lpf(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('低通滤波 I 路结果'); subplot(2,2,2); plot(freq, 10*log10(fftshift(abs(fft(sig_fm_i_lpf,nfft)/nfft))+eps));xlim([freq(1),freq(end)]); xlabel('频率/hz');ylabel('幅度/dB');title('低通滤波 I 路结果双边幅度谱'); subplot(2,2,3); plot(t(1:plot_length), sig_fm_q_lpf(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('低通滤波 Q 路结果'); subplot(2,2,4); plot(freq, 10*log10(fftshift(abs(fft(sig_fm_q_lpf,nfft)/nfft))+eps));xlim([freq(1),freq(end)]); xlabel('频率/hz');ylabel('幅度/dB');title('低通滤波 Q 路结果双边幅度谱');  figure;set(gcf,'color','w'); subplot(2,2,1); plot(t(1:plot_length), Pt(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('计算相位结果'); subplot(2,2,2); plot(freq, 10*log10(fftshift(abs(fft(Pt,nfft)/nfft))+eps));xlim([freq(1),freq(end)]); xlabel('频率/hz');ylabel('幅度/dB');title('计算相位结果双边幅度谱'); subplot(2,2,3); plot(t(1:plot_length), sig_fm_demod(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('(计算差分)解调结果'); subplot(2,2,4); plot(freq, 10*log10(fftshift(abs(fft(sig_fm_demod,nfft)/nfft))+eps));xlim([freq(1),freq(end)]); xlabel('频率/hz');ylabel('幅度/dB');title('(计算差分)解调结果双边幅度谱');  end 

附.12 文件 main_demodFM_example4.m

clc; clear; close all; % FM 解调仿真(调制信号为确知信号,数字正交解调) % @author 木三百川  % 调制参数 A = 1;                  % 载波恒定振幅 fm = 1000;              % 调制信号参数 beta = 15;              % 调频指数/调制指数 fc = 20000;             % 载波频率 fs = 8*fc;              % 采样率 total_time = 2;         % 仿真时长,单位:秒  % 采样时间 t = 0:1/fs:total_time-1/fs;  % 调制信号为确知信号 mt = sin(2*pi*fm*t)+cos(pi*fm*t); W = fm;  % FM 调制 [ sig_fm_send, deltaf ] = mod_fm(fc, beta, fs, mt, t, W, A); fprintf('最大频偏 deltaf = %.6f Hz.n', deltaf);  % 加噪声 snr = 50;               % 信噪比 sig_fm_receive = awgn(sig_fm_send, snr, 'measured');  % 相干解调 ini_phase = 0; [ sig_fm_demod ] = demod_fm_method4(sig_fm_receive, fc, fs, t, ini_phase);  % 绘图 nfft = length(sig_fm_receive); freq = (-nfft/2:nfft/2-1).'*(fs/nfft); figure;set(gcf,'color','w'); plot_length = min(500, length(sig_fm_receive)); subplot(1,2,1); plot(t(1:plot_length), sig_fm_receive(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('FM接收信号'); subplot(1,2,2); plot(freq, 10*log10(fftshift(abs(fft(sig_fm_receive,nfft)/nfft))+eps));xlim([freq(1),freq(end)]); xlabel('频率/hz');ylabel('幅度/dB');title('FM接收信号双边幅度谱');  coef = mean(abs(mt))/mean(abs(sig_fm_demod)); fprintf('norm(调制信号 - %.2f * 解调信号)/norm(调制信号) = %.4f.n', coef, norm(mt-coef*sig_fm_demod)/norm(mt));  figure;set(gcf,'color','w'); plot(t(1:plot_length), mt(1:plot_length));xlim([t(1),t(plot_length)]); hold on; plot(t(1:plot_length), coef*sig_fm_demod(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('解调效果'); legend('调制信号','解调信号(放大后)'); 

附.13 文件 main_CommFM_example.m

clc; clear; close all; % FM 调制解调仿真(使用Communications Toolbox工具箱) % @author 木三百川  % 调制参数 A = 1;                  % 载波恒定振幅 fm = 2500;              % 调制信号参数 beta = 1e-6;            % 调频指数/调制指数 fc = 20000;             % 载波频率 fs = 8*fc;              % 采样率 total_time = 2;         % 仿真时长,单位:秒  % 采样时间 t = 0:1/fs:total_time-1/fs;  % 调制信号为确知信号 mt = sin(2*pi*fm*t)+cos(pi*fm*t);  % FM 调制 freqdev = beta*fm; ini_phase = 0; sig_fm_send = A*fmmod(mt, fc, fs, freqdev, ini_phase);  % 加噪声 snr = 150;               % 信噪比 sig_fm_receive = awgn(sig_fm_send, snr, 'measured');  % FM 解调 [ sig_fm_demod ] = fmdemod(sig_fm_receive, fc, fs, freqdev, ini_phase);  % 绘图 nfft = length(sig_fm_receive); freq = (-nfft/2:nfft/2-1).'*(fs/nfft); figure;set(gcf,'color','w'); plot_length = min(500, length(sig_fm_receive)); subplot(1,2,1); plot(t(1:plot_length), sig_fm_receive(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('FM接收信号'); subplot(1,2,2); plot(freq, 10*log10(fftshift(abs(fft(sig_fm_receive,nfft)/nfft))+eps));xlim([freq(1),freq(end)]); xlabel('频率/hz');ylabel('幅度/dB');title('FM接收信号双边幅度谱');  figure;set(gcf,'color','w'); plot(t(1:plot_length), mt(1:plot_length));xlim([t(1),t(plot_length)]); hold on; plot(t(1:plot_length), sig_fm_demod(1:plot_length));xlim([t(1),t(plot_length)]); xlabel('t/s');ylabel('幅度');title('解调效果'); legend('调制信号','解调信号');  fprintf('norm(调制信号 - 解调信号)/norm(调制信号) = %.4f.n', norm(mt-sig_fm_demod)/norm(mt)); 

发表评论

评论已关闭。

相关文章