基于FPGA的FM调制(载波频率、频偏、峰值、DAC输出)-带仿真文件-上板验证正确

news/2024/12/4 21:14:48/

基于FPGA的FM调制-带仿真文件-上板验证正确

  • 前言
  • 一、FM调制储备知识
        • 载波频率
        • 频偏
        • 峰值
        • 个人理解
  • 二、代码分析
    • 1.模块分析
    • 2.波形分析
  • 总结


前言

FM、AM等调制是学习FPGA信号处理一个比较好的小项目,通过学习FM调制过程熟悉信号处理的一个简单流程,进而熟悉信号变换的一些基本方法。

一、FM调制储备知识

载波频率

载波频率是指在调制过程中未被调制(或是未被输入信息影响)的频率。也就是说,载波频率是FM信号中不含信息的那部分信号的频率。在调频广播中,通常会选择一个固定的载波频率,比如88 MHz到108 MHz(调频广播的常见范围)。

载波频率是基带信号的载体,信号的频率会围绕这个载波频率上下偏移,偏移的幅度和方向取决于输入的信号的特性

频偏

频偏是指调制过程中,载波的频率偏离原始载波频率的幅度。FM调制中,信息信号(如音频信号)通过改变载波频率的偏移量来传递信息。频偏越大,表示信号的频率变化范围越广。频偏大小直接影响FM信号的带宽和质量。频偏较大时,带宽较宽,且信号可以携带更多的信息量。

峰值

在FM调制中,峰值通常指的是信号的最大变化值,尤其是指调制信号的最大频率偏移值。峰值反映了调频过程中信号的最大频率变化幅度。

个人理解

首先明确对象,一个是调制信号,一个是载波信号,另一个就是频偏幅度。其次再深一层次就是频率控制字的控制了,首先载波频率是固定的,所以频率控制字也是固定的,而频偏是根据调制信号进行变化的,所以主要就是频偏控制字的实现。
重点考察:DDS的使用、DAC模块的使用

二、代码分析

本模块中涉及到fft频谱分析,所以增加了一些端口,fft的按键控制、输出有效、持续、标志等。
本文产生载波频率为50k,频偏3k

1.模块分析

模块输入:时钟、复位、调制信号
模块输出:FM调制信号
载波信号的产生是基于ROM读取进行产生的,深度是1024 宽度是8位。基础时钟是50mhz,所以如果正常读取信号的话,这个频率是50m/1024=48.8khz左右。通过这个基础的变化进行其他频率信号的产生。
本文要产生一个50k的载波信号,因此50k/48.8k=1.024左右,得出来这个系数之后怎么获取频率字?首先这个系数是一个小数,FPGA本身是处理不了小数的,因此我们需要进行放大,本文选择放大2的22次方倍,1.024*2^22=4294967,得到了频率字,同时因为1024和放大倍数,频率字的位宽是10+22=32。
频偏控制,首先确定范围是3k,因此按照上面的方法算出来3k的频率控制字:255852,其次通过调用一个乘法器ip核将调制信号与3k频率字进行想乘,进而得到随调制信号变化的频偏数值,最后将这个频偏数值作用到载波频率上,就完成了FM的调制工作。
本篇文章的大致实现方法参考了:FM调制讲解DDS

module FM_Mod(input	clk,input	rst_n,input  signed	[7:0]	adc_data,input   key_fft,output  reg   last,output  reg   s_axis_data_tvalid,output  reg   fft_flag,output	signed  [7:0]	FM_Mod
);parameter signed Freq_I = 32'd4294967;		//  1.024 * 2的22次方
parameter signed Freq_Word = 20'd255852;	  //  0.061 * 2的22次方
wire	signed	[27:0]	mult_data;             //0.061*adc_data
wire	signed	[20:0]	Freq_Offset;           
reg             [14:0]  count;MULT	b2v_inst6(.CLK(clk),.A(adc_data),.B(Freq_Word),.P(mult_data)
);
assign	Freq_Offset = mult_data[27:7];	//移位  除法   2的7次方reg   signed  [31:0] cnt_I;//22+10
wire    [9:0]   addr_I;
always @(posedge clk or negedge rst_n) beginif(!rst_n)	begincnt_I <= 0;endelse	begincnt_I <= cnt_I + Freq_I + Freq_Offset;end
endalways @(posedge clk or negedge rst_n) beginif(!rst_n)	beginfft_flag <= 1'b0;endelse if(key_fft==1'b0)	beginfft_flag <= ~fft_flag;endelse beginfft_flag <= fft_flag;end
endalways @(posedge clk or negedge rst_n) beginif(!rst_n)	begincount <= 15'd0;last <=1'b0;s_axis_data_tvalid<=1'b0;endelse if(fft_flag && count<2048)	begins_axis_data_tvalid <=1'b1;count <= count + 1'b1;last <= 1'b0;endelse if(fft_flag && count==2048)	begins_axis_data_tvalid= 1'b0;count <= 15'd0;last <=1'b1;end
endassign  addr_I = cnt_I[31:22] ; //移位  除法   2的16次方ROM	b2v_inst(.clka(clk),.addra(addr_I),.douta(FM_Mod)
);endmodule

2.波形分析

下面是500hz 的调制信号,上面是FM调制完的信号。
3k的频偏对于50k的载波信号来说比较不明显,但是通过观看不同位置的周期能够看出明显差距,通过选取500hz信号的低谷和峰谷测量fm信号周期,能够看出明显的差距。如果需要明显的调制效果,可以将频偏增加。
在这里插入图片描述

总结

能够学习真好,需要学习的太多了,时不时的记录一下,好记性不如烂笔头。因为来医院了一周多没有学习了,没那个精力也没有那个氛围,所以还是想说活着就好,能够学习真好,感谢一切吧。


http://www.ppmy.cn/news/1552376.html

相关文章

使用Native AOT发布C# dll 提供给C++调用

Native AOT&#xff0c;即提前本地编译&#xff08;Ahead-Of-Time Compilation&#xff09;&#xff0c;是一种将托管代码&#xff08;如 C#&#xff09;编译为本机可执行文件的技术&#xff0c;无需在运行时进行任何代码生成。 &#xff08;Native AOT 优缺点截图摘自张善友博…

机器人控制系统 ROS2 学习笔记

第1章 环境搭建 &#xff08;一&#xff09;ROS2 的安装和配置 &#xff08;二&#xff09;ROS2快速体验 构建 C 源文件、构建 Python 源文件&#xff1b;5个步骤&#xff1a;创建功能包、编辑源文件、修改配置文件、编译、执行&#xff1b; &#xff08;三&#xff09;集成…

Zookeeper的通知机制是什么?

大家好&#xff0c;我是锋哥。今天分享关于【Zookeeper的通知机制是什么?】面试题。希望对大家有帮助&#xff1b; Zookeeper的通知机制是什么? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Zookeeper的通知机制主要通过Watcher实现&#xff0c;它是Zookeeper客…

QT实战-qt各种菜单样式实现

本文主要介绍了qt普通菜单样式、带选中样式、带子菜单样式、超过一屏幕菜单样式、自定义带有滚动条的菜单样式&#xff0c; 先上图如下&#xff1a; 1.普通菜单样式 代码&#xff1a; m_pmenu new QMenu(this);m_pmenu->setObjectName("quoteListMenu"); qss文…

手撸了一个文件传输工具

在日常的开发与运维中&#xff0c;文件传输工具是不可或缺的利器。无论是跨服务器传递配置文件&#xff0c;还是快速从一台机器下载日志文件&#xff0c;一个高效、可靠且简单的文件传输工具能够显著提高工作效率。今天&#xff0c;我想分享我自己手撸一个文件传输工具的全过程…

【C#】书籍信息的添加、修改、查询、删除

文章目录 一、简介二、程序功能2.1 Book类属性&#xff1a;方法&#xff1a; 2.2 Program 类 三、方法&#xff1a;四、用户界面流程&#xff1a;五、程序代码六、运行效果 一、简介 简单的C#控制台应用程序&#xff0c;用于管理书籍信息。这个程序将允许用户添加、编辑、查看…

顶刊算法 | 鱼鹰算法OOA-BiTCN-BiGRU-Attention多输入单输出回归预测(Maltab)

顶刊算法 | 鱼鹰算法OOA-BiTCN-BiGRU-Attention多输入单输出回归预测&#xff08;Maltab&#xff09; 目录 顶刊算法 | 鱼鹰算法OOA-BiTCN-BiGRU-Attention多输入单输出回归预测&#xff08;Maltab&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实…

vue中如何获取public路径

在Vue项目中获取public路径的方法有多种&#xff0c;主要通过以下1、使用相对路径、2、使用环境变量、3、使用webpack配置三种方式来实现。这些方法可以帮助开发者在项目中更灵活地使用静态资源。下面将详细解释每种方法以及如何使用它们。 一、使用相对路径 在Vue项目中&#…