• 【调制解调】FM 调频


    说明

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


    1. FM 调制算法

    1.1 FM 信号描述

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

    sFM(t)=Acos[ωct+Kft0m(τ)dτ]

    式中:A 为载波恒定振幅,Kf 为调频灵敏度(单位 rad/(sV)),m(t) 是调制信号(携带要发出去的信息),cosωct 是载波,ωc 是载波角频率,与载波频率 fc 之间的关系为 ωc=2πfc。由式 (1) 可得 FM 信号相对于载频 ωc 的瞬时频偏为:

    d[Kft0m(τ)dτ]dt=Kfm(t)

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

    β=kf|m(t)|maxW

    m(t) 为单一频率的正弦波(即 m(t)=Amcos(2πfmt) 时,此时 W=fm),则调制指数的表达式如下,调制指数的值正好与最大相位偏移相同,其中 Δf=βfm 表示最大频偏。

    β=KfAmωm=kfAmfm=Δffm=[Kft0m(τ)dτ]max

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

    (1)窄带调频

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

    |Kft0m(τ)dτ|π6

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

    sNBFM(t)=Acos[ωct+Kft0m(τ)dτ]=Acos(ωct)cos[Kft0m(τ)dτ]Asin(ωct)sin[Kft0m(τ)dτ]Acos(ωct)1Asin(ωct)Kft0m(τ)dτ=Acos(ωct)[AKft0m(τ)dτ]sin(ωct)

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

    SNBFM(ω)=πA[δ(ω+ωc)+δ(ωωc)]+AKf2[M(ωωc)ωωcM(ω+ωc)ω+ωc]

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

    (2)宽带调频

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

    sWBFM(t)=Acos[ωct+Kft0Amcos(ωmτ)dτ]=Acos[ωct+KfAmωmsin(ωmt)]=Acos[ωct+βsin(ωmt)]=An=Jn(β)cos[(ωc+nωm)t]

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

    SWBFM(ω)=πAn=Jn(β)[δ(ωωcnωm)+δ(ω+ωc+nωm)]

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

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

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

    BFM=2(β+1)W

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

    BFM=2(β+1)fm=2(Δf+fm)

    • β1 时(对应窄带调频),带宽可近似估计为 BNBFM2fm,这时,带宽由第一对边频分量决定,带宽只随调制频率 fm 变化,而与最大频偏 Δf 无关。
    • β1 时(对应宽带调频),带宽可近似估计为 BWBFM2Δf,这时,带宽由最大频偏 Δf 决定,而与调制频率 fm 无关。

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

    PFM=¯s2WBFM(t)=A22n=J2n(β)=A22=Pc

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

    1.3 FM 信号的调制方法

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

    (1)直接调频法

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

    (2)间接调频法

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

    Oh Shit!-图片走丢了-打个广告-欢迎来博客园关注“木三百川”

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

    xo(t)=ax2(t)=12aA2{1+cos[2ωct+2Kft0m(τ)dτ]}

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

    xo(t)=12aA2cos[2ωct+2Kft0m(τ)dτ]

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

    (3)正交调制法

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

    sFM(t)=Acos[ωct+Kft0m(τ)dτ]=Acos(ωct)cos[Kft0m(τ)dτ]Asin(ωct)sin[Kft0m(τ)dτ]

    正交调制流程如下:

    1. 对调制信号 m(t) 进行积分,得到 Φ=Kft0m(τ)dτ
    2. 对积分后的信号分别取余弦和正弦,得到 I 路数据 I(t)=cos(Φ)Q 路数据 Q(t)=sin(Φ)
    3. 分别乘以载波 Acos(ωct)Asin(ωct) 后相加,得到 FM 信号 sFM(t)=I(t)Acos(ωct)Q(t)Asin(ωct)

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

    1.4 窄带 FM 信号示例

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

    m(t)=sin(2πfmt)+cos(πfmt)

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

    Oh Shit!-图片走丢了-打个广告-欢迎来博客园关注“木三百川”

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

    Oh Shit!-图片走丢了-打个广告-欢迎来博客园关注“木三百川”

    1.5 宽带 FM 信号示例

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

    Oh Shit!-图片走丢了-打个广告-欢迎来博客园关注“木三百川”

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

    Oh Shit!-图片走丢了-打个广告-欢迎来博客园关注“木三百川”


    2. FM 解调算法

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

    2.1 非相干解调(鉴频器)

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

    sd(t)=dsFM(t)dt=d{Acos[ωct+Kft0m(τ)dτ]}dt=A[ωc+Kfm(t)]sin[ωct+Kft0m(τ)dτ]

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

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

    对 1.4 节中的 FM 信号,设定 fm=2500Hzβ=106,信噪比 SNR=150dB,非相干解调效果如下,最大频偏 Δf=βfm=0.0025Hz 过小,解调效果很差。

    Oh Shit!-图片走丢了-打个广告-欢迎来博客园关注“木三百川”

    对 1.5 节中的 FM 信号,设定 fm=2500Hzβ=4,信噪比 SNR=50dB,非相干解调效果如下,解调后幅度放大系数 k=¯|m(t)|/¯|ˆm(t)|7.61,使用这个系数放大解调信号幅值,然后计算误差,有:|m(ti)kˆm(ti)|2/|m(ti)|20.0920

    Oh Shit!-图片走丢了-打个广告-欢迎来博客园关注“木三百川”

    对 1.5 节中的 FM 信号,设定 fm=1000Hzβ=15,信噪比 SNR=50dB,非相干解调效果如下,解调后幅度放大系数 k=¯|m(t)|/¯|ˆm(t)|5.07,使用这个系数放大解调信号幅值,然后计算误差,有:|m(ti)kˆm(ti)|2/|m(ti)|20.0634

    Oh Shit!-图片走丢了-打个广告-欢迎来博客园关注“木三百川”

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

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

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

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

    对 1.4 节中的 FM 信号,设定 fm=2500Hzβ=106,信噪比 SNR=150dB,非相干解调效果如下,最大频偏 Δf=βfm=0.0025Hz 过小,解调效果很差。

    Oh Shit!-图片走丢了-打个广告-欢迎来博客园关注“木三百川”

    对 1.5 节中的 FM 信号,设定 fm=2500Hzβ=4,信噪比 SNR=50dB,非相干解调效果如下,解调后幅度放大系数 k=¯|m(t)|/¯|ˆm(t)|4.87,使用这个系数放大解调信号幅值,然后计算误差,有:|m(ti)kˆm(ti)|2/|m(ti)|20.0492

    Oh Shit!-图片走丢了-打个广告-欢迎来博客园关注“木三百川”

    对 1.5 节中的 FM 信号,设定 fm=1000Hzβ=15,信噪比 SNR=50dB,非相干解调效果如下,解调后幅度放大系数 k=¯|m(t)|/¯|ˆm(t)|3.26,使用这个系数放大解调信号幅值,然后计算误差,有:|m(ti)kˆm(ti)|2/|m(ti)|20.0433

    Oh Shit!-图片走丢了-打个广告-欢迎来博客园关注“木三百川”

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

    2.3 相干解调

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

    Oh Shit!-图片走丢了-打个广告-欢迎来博客园关注“木三百川”

    其中:

    sNBFM(t)=Acos(ωct)[AKft0m(τ)dτ]sin(ωct)

    相干载波 c(t)=sin(ωct),则相乘器的输出为:

    sp(t)=A2sin(2ωct)+[AKf2t0m(τ)dτ][1cos(2ωct)]

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

    sd(t)=AKf2t0m(τ)dτ

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

    mo(t)=AKf2m(t)

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

    1. 第一步:乘以相干载波(即乘以 sin(ωct+ϕ0)),注意载波初始相位。
    2. 第二步:低通滤波滤除高频载波,滤除 2ωc
    3. 第三步:求微分。

    对 1.4 节中的 FM 信号,设定 fm=2500Hzβ=106,信噪比 SNR=150dB,相干解调效果如下,解调后幅度放大系数 k=¯|m(t)|/¯|ˆm(t)|222.30,使用这个系数放大解调信号幅值,然后计算误差,有:|m(ti)kˆm(ti)|2/|m(ti)|20.1313。更改相干载波的初始相位为 ϕ0=π/4,π/2,或者更改相干载波的中心频率为 0.8fc,1.2fc 后,解调效果变差,说明这种方法对相干载波同频同相的要求较高,鲁棒性不够强悍,可使用锁相环技术来改善这一缺点。

    Oh Shit!-图片走丢了-打个广告-欢迎来博客园关注“木三百川”

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

    Oh Shit!-图片走丢了-打个广告-欢迎来博客园关注“木三百川”

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

    Oh Shit!-图片走丢了-打个广告-欢迎来博客园关注“木三百川”

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

    2.4 数字正交解调

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

    1. 第一步:乘以正交相干载波得到 sI(t)sQ(t),即 sI(t)=s(t)cos(ωct+ϕ0)sQ(t)=s(t)sin(ωct+ϕ0)
    2. 第二步:低通滤波器滤除 sI(t)sQ(t) 中的高频分量。
    3. 第三步:通过反正切计算相位 Φ(t)=atan[sQ(t)sI(t)]=kt0m(τ)dτ
    4. 第四步:对相位进行差分,得到解调结果 mo(t)

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

    mo(t)=sI(n1)sQ(n)sI(n)sQ(n1)s2I(n)+s2Q(n)

    对 1.4 节中的 FM 信号,设定 fm=2500Hzβ=106,信噪比 SNR=150dB,数字正交解调效果如下,解调后幅度放大系数 k=¯|m(t)|/¯|ˆm(t)|17782852.62,使用这个系数放大解调信号幅值,然后计算误差,有:|m(ti)kˆm(ti)|2/|m(ti)|20.1318

    Oh Shit!-图片走丢了-打个广告-欢迎来博客园关注“木三百川”

    对 1.5 节中的 FM 信号,设定 fm=2500Hzβ=4,信噪比 SNR=50dB,数字正交解调效果如下,解调后幅度放大系数 k=¯|m(t)|/¯|ˆm(t)|4.48,使用这个系数放大解调信号幅值,然后计算误差,有:|m(ti)kˆm(ti)|2/|m(ti)|20.0391

    Oh Shit!-图片走丢了-打个广告-欢迎来博客园关注“木三百川”

    对 1.5 节中的 FM 信号,设定 fm=1000Hzβ=15,信噪比 SNR=50dB,数字正交解调效果如下,解调后幅度放大系数 k=¯|m(t)|/¯|ˆm(t)|2.99,使用这个系数放大解调信号幅值,然后计算误差,有:|m(ti)kˆm(ti)|2/|m(ti)|20.0163

    Oh Shit!-图片走丢了-打个广告-欢迎来博客园关注“木三百川”

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


    3. FM 仿真(MATLAB Communications Toolbox)

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

    Oh Shit!-图片走丢了-打个广告-欢迎来博客园关注“木三百川”

    解调效果如下:

    Oh Shit!-图片走丢了-打个广告-欢迎来博客园关注“木三百川”

    解调信号与调制信号波形基本重回,计算误差,有:|m(ti)ˆm(ti)|2/|m(ti)|20.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));
  • 相关阅读:
    springboot+新冠疫苗预约管理系统 毕业设计-附源码241530
    详解Java的static关键字
    图论01-【无权无向】-图的基本表示-邻接矩阵/邻接表
    使用SSM为学校医务室开发一套管理系统
    python 面试算法题
    企业电子招投标采购系统源码之电子招投标的组成
    程序员不写注释的原因
    前端八股文(3)53-84
    力扣(LeetCode)算法_C++——至多包含两个不同字符的最长子串
    一篇搞定MyBatisPlus!
  • 原文地址:https://www.cnblogs.com/young520/p/17559047.html