这是本人第一次写博客,写的不好请多多担待。
本次实验是将一个已知的FM信号通过FPGA进行解调,解调出波形并进行FFT得到调制频率fm,并且每一步都通过MATLAB进行波形的验证。
VIVADO 2019.2
MATLAB
已知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 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验证了每一步的波形,以确保无误。
这是我第一次写博客,大概就写这么多吧。。。有错误的地方欢迎大家进行指正,也请大家多多担待。
感谢大家的观看,谢谢!
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源
我正在根据Rakefile中的现有测试文件动态生成测试任务。假设您有各种以模式命名的单元测试文件test_.rb.所以我正在做的是创建一个以“测试”命名空间内的文件名命名的任务。使用下面的代码,我可以用raketest:调用所有测试require'rake/testtask'task:default=>'test:all'namespace:testdodesc"Runalltests"Rake::TestTask.new(:all)do|t|t.test_files=FileList['test_*.rb']endFileList['test_*.rb'].eachdo|task|n
我想要像“嘿那里”这样的东西变成,例如,#316583。我希望将任意长度的字符串“归结”为十六进制颜色。我不知道从哪里开始。我在想,每个字符串的MD5散列都是不同的-但如何将该散列转换为十六进制颜色数字? 最佳答案 你可以只取几位前几位:require'digest/md5'color=Digest::MD5.hexdigest('Mytext')[0..5] 关于ruby-如何使用Ruby基于字母数字字符串生成颜色?,我们在StackOverflow上找到一个类似的问题:
文章目录1.自动驾驶实战:基于Paddle3D的点云障碍物检测1.1环境信息1.2准备点云数据1.3安装Paddle3D1.4模型训练1.5模型评估1.6模型导出1.7模型部署效果附录show_lidar_pred_on_image.py1.自动驾驶实战:基于Paddle3D的点云障碍物检测项目地址——自动驾驶实战:基于Paddle3D的点云障碍物检测课程地址——自动驾驶感知系统揭秘1.1环境信息硬件信息CPU:2核AI加速卡:v100总显存:16GB总内存:16GB总硬盘:100GB环境配置Python:3.7.4框架信息框架版本:PaddlePaddle2.4.0(项目默认框架版本为2.3
目录一、inout在设计文件中的使用方法1.1、inout的第一种使用方法1.2、inout实现的第二种使用方法1.3、inout使用总结 二、inout在仿真测试中的使用方法一、inout在设计文件中的使用方法在FPGA的设计过程中,有时候会遇到双向信号(既能作为输出,也能作为输入的信号叫双向信号)。比如,IIC总线中的SDA信号就是一个双向信号,QSPIFlash的四线操作的时候四根信号线均为双向信号。在Verilog中用关键字inout定义双向信号,这里总结一下双向信号的处理方法。1.1、inout的第一种使用方法 实际上,双向信号的本质是由一个三态门组成的,三态门可以输出高电平,低电
我想从gtk3中的Widget发出自定义信号。在GTK2中,有一个名为signal_new的函数来创建一个新信号。您可以在此处查看示例:https://github.com/ruby-gnome2/ruby-gnome2/blob/ec373f87e672dbeeaa157f9148d18b34713bb90e/glib2/sample/type-register.rb在GTK3中,这个功能似乎不再可用。那么在ruby的GTK3中创建自定义信号的新方法是什么? 最佳答案 GTK3更改为使用define_signal方法而不是si
我想知道如何连接到带参数的信号(使用Rubyblock)。我知道如何连接到一个不带参数的:myCheckbox.connect(SIGNAL:clicked){doStuff}但是,这不起作用:myCheckbox.connect(SIGNAL:toggle){doStuff}它不起作用,因为切换槽采用参数voidQAbstractButton::toggled(boolchecked)。我怎样才能让它与参数一起工作?谢谢。 最佳答案 对您的问题的简短回答是,您必须使用slots方法声明要连接的插槽的方法签名:classMainGU