这是本人第一次写博客,写的不好请多多担待。
本次实验是将一个已知的FM信号通过FPGA进行解调,解调出波形并进行FFT得到调制频率fm,并且每一步都通过MATLAB进行波形的验证。
开发工具
VIVADO 2019.2
MATLAB
FM解调
已知FM信号的载波频率fc为22MHZ,调制信号频率fm为8KHZ,采样率为50MHZ,在MATLAB中采样20000个点,位宽为10。FM具体的解调原理我就不说了。。。我用的方法也是正交解调,先将FM信号利用DDS IP核混频得到I路与Q路信号下变频到基带,然后通过低通滤波器进行滤波,之后再进行差分鉴频,最后进行FFT得到调制频率fm。差分鉴频的算法如下图:
输入模块
将FM信号导入VIVADO ROM IP核,首先使用MATLAB绘制出FM信号的波形,并生成coe文件,导入VIVADO的ROM IP核,
位宽为10,深度为20000。VIVADO的ROM IP核具体怎么配置我就不说了。。这样的贴子很多,不懂的可以
先去看看如何配置。MATLAB与VIVADO的图如下:
变频模块
利用DDS生成sin和cos信号,与模块一输出的FM信号进行混频。在VIVADO中配置两个DDS IP核,一个用于生成与载波频率相同的正弦信号,一个用于生成与载波频率相同的余弦信号,再配置两个乘法器IP核进行混频。DDS IP核与乘法器IP核如何配置这类的帖子很多,自己去查一查。。。混频后结果如下图,可见MATLAB与VIVADO中的波形一致。
滤波模块
利用MATLAB的filterDesigner工具箱生成fir等波纹低通滤波器,我设置的阶数为128,通带频率为0.5M-2.5M。将其生成coe文件导入VIVADO的FIR IP核中,将变频后信号中的高频信号滤除。得到基带信号。
差分鉴频模块
也是最重要最核心的一个模块,利用开头介绍的算法对FM信号进行解调,并将解调波形输出。
I(n-1), Q(n-1)就是将I路信号与Q路信号延迟一个时钟周期。
经过乘法器IP核输出后的信号位宽很大,要对其进行截短,再通过除法器IP核得到解调波形。除法器IP核如何配置还是自己去看一看这方面的帖子。。。
解调出来的波形是个正弦波。如下图,MATLAB也对其进行了验证。
FFT模块
配置FFT IP核对解调信号进行FFT运算,得到解调信号频谱。FFT IP核配置稍微麻烦一点,不过这类的帖子很多自己去查一查,我也不是特别清楚,也是边查边摸索。。。FFT之后结果如下图:
在第二张图片里可以看到VIVADO仿真的频谱图与MATLAB一致。峰值对应的地址为3,通过计算得到fm=9155。与MATLAB结果也一致。
fm计算公式为峰值对应地址*fs/N
其中fs为采样频率
N为FFT点数。
MATLAB与VIVADO FFT之后得到的调制频率fm约等于9155khz,而不是8khz。有人可能会疑惑是不是哪里出错了,我刚开始也一直认为是哪里出错了,从头检查了几遍也没有发现错误,也在网上搜索。。。
上图在解调波形中取了16384个点做FFT,FFT结果不是8khz的原因应该是fs/16384不是整数倍,或取这16384个点不是周期的整数倍,导致出现了频谱泄露。应该是这样的。。。。我也是小白一个,具体什么原因我可能说不上来。后来我再MATLAB中取了12500个点进行FFT,就能得到8k的频率,这证明我的结果是没错的。
这样就在FPGA中完成了对FM信号的解调,并通过MATLAB验证了每一步的波形,以确保无误。
这是我第一次写博客,大概就写这么多吧。。。有错误的地方欢迎大家进行指正,也请大家多多担待。
感谢大家的观看,谢谢!