VIVADO IP核之FIR抽取器多相滤波仿真

VIVADO IP核之FIR抽取器多相滤波仿真(含有与MATLAB仿真数据的对比)

目录

前言

一、滤波器系数生成

二、用MATLAB生成仿真数据

三、VIVADO FIR抽取多相滤波器使用

四、VIVADO FIR抽取多相滤波器仿真

五、VIVADO工程下载

总结


前言

        关于FIR低通滤波器和多相滤波插值器的使用,我之前的文章已经介绍过了,本文将继续深入介绍FIR抽取器多相滤波的使用方法,并将FIR抽取多相滤波的结果与MATLAB仿真计算的结果比较,验证了FIR抽取器多相滤波使用正确。


提示:以下是本篇文章正文内容,欢迎各位阅读,转载请附上链接。

一、滤波器系数生成

        仿真假设有一个信号由两个正弦波叠加而成,分别是幅值为1,频率为5MHz,初相为0的正弦波和幅值为1,频率为15MHz,初相为0的正弦波。用120MHz的采样率对其进行采样,那么可以得到一个信号速率为120MSPS,包含频率为5MHz和15MHz正弦波的信号,接下来我们分别用MATLAB和FIR ip核对其进行4抽取多相滤波,滤波器的通带截止频率为10MHz,那么便可以得到一个信号速率为30MSPS,频率为5MHz的正弦波。

        滤波器设计如下,抽取之前速率为120M,所以这里滤波器的采样频率是120MHz,而不是30MHz。设计的滤波器为51阶,那么有52个系数,便于4抽取多相滤波。

 关于滤波器系数的量化成16bit以及生成coe文件可以参考我的另外一篇博客VIVADO IP核之FIR低通滤波仿真(含滤波器群延时仿真)_vivado fir滤波器-CSDN博客,里面有详细的介绍,本文就不再赘述。

二、用MATLAB生成仿真数据

        运行以下代码即可生成vivado仿真所需要的仿真数据data_decimation.txt。

rng default;
clc; 
clear;
close all;fs =  120e6;     % 采样频率 120MHz
K = 1024;       % 快拍个数
t = 0:1/fs:(K-1)/fs;
f1 = 5e6;
f2 = 15e6;
x = cos(2*pi*f1*t) + cos(2*pi*f2*t);h = fopen('data_decimation.txt','w');
for i=1:length(x)result= fi(x(i), 1, 16, 9).bin;fprintf(h,'%s\n',result);
end
fclose(h);figure(1);
plot(x(1:60));
grid on;
figure(2);
signal_frequencyspectrum(x,fs);
grid on;
ylim([-90 0]);lowpass_Fs=fs;            % 低通滤波器的采样频率
lowpass_Fpass=10000000;   % 低通滤波器的通带截止频率
lowpass_Fstop=14000000;   % 低通滤波器的阻带起始频率
% 下一行的lowpass是用fdatool设计的滤波器保存为matlab code自己修改了一下
[lowpass_b,lowpass_a] = tf(lowpass(lowpass_Fs,lowpass_Fpass,lowpass_Fstop));% 得到滤波器系数y=conv(x,lowpass_b);
x_MLPF=y(2:4:end);
% lowpass_b1=lowpass_b(1:4:end);
% lowpass_b2=lowpass_b(2:4:end);
% lowpass_b3=lowpass_b(3:4:end);
% lowpass_b4=lowpass_b(4:4:end);
% 
% x1=x(1:4:end);
% x=[0 x];
% x2=x(1:4:end);
% x=[0 x];
% x3=x(1:4:end);
% x=[0 x];
% x4=x(1:4:end);
% 
% 
% x_MLPF1=conv(x1,lowpass_b1);
% x_MLPF2=conv(x2,lowpass_b2);
% x_MLPF3=conv(x3,lowpass_b3);
% x_MLPF4=conv(x4,lowpass_b4);
% 
% x_MLPF=[x_MLPF1 0]+x_MLPF2+x_MLPF3+x_MLPF4;figure(3);
plot(x_MLPF(1:60));
grid on;
figure(4);
signal_frequencyspectrum(x_MLPF(ceil((length(lowpass_b)-1)/2)+1:end-floor((length(lowpass_b)-1)/2)),fs/4);
grid on;
ylim([-90 0]);
function Hd = lowpass(lowpass_Fs,lowpass_Fpass,lowpass_Fstop)
%LPF 返回离散时间滤波器对象。% MATLAB Code
% Generated by MATLAB(R) 23.2 and Signal Processing Toolbox 23.2.
% Generated on: 02-Aug-2024 20:04:40% Equiripple Lowpass filter designed using the FIRPM function.% All frequency values are in Hz.
Fs = lowpass_Fs;  % Sampling FrequencyFpass = lowpass_Fpass;   % Passband Frequency
Fstop = lowpass_Fstop;   % Stopband Frequency
Dpass = 0.057501127785;   % Passband Ripple
Dstop = 0.0031622776602;  % Stopband Attenuation
dens  = 20;               % Density Factor% Calculate the order from the parameters using FIRPMORD.
[N, Fo, Ao, W] = firpmord([Fpass, Fstop]/(Fs/2), [1 0], [Dpass, Dstop]);% Calculate the coefficients using the FIRPM function.
b  = firpm(N, Fo, Ao, W, {dens});
Hd = dfilt.dffir(b);% [EOF]

MATLAB原始信号如下图所示:

低通滤波4抽取后的信号为(可见FIR滤波器有群延时):

三、VIVADO FIR抽取多相滤波器使用

在vivado中搜索FIR滤波器IP核并点进去设置它。滤波器命名为FIR_polyphase_LPF,导入第一步MATLAB生成的滤波器系数文件。Filter type 选择抽取,抽取因子设置为4。

输入信号采样速率设置为120MHz,时钟频率设置为120MHz,这样抽取前每个输入持续1个时钟周期,4抽取后就变成了每4个时钟出1个数据。

滤波器系数设置为16位有符号数,输入数据也为16位有符号数,输入数据的小数位数设置为9,这是因为第二步中MATLAB量化的输入数据含有9位小数。然后点击左边的Freq.Response就能看见滤波器的幅度响应。

滤波抽取调用FIR多相抽取滤波比我们先调用FIR低通滤波后再抽取节约资源的多。

四、VIVADO FIR抽取多相滤波器仿真

在工程中建立一个名为FIR_polyphase_LPF_test的tb.v文件。其中$readmemb("data_decimation.txt", signal)用于从文本中读取二进制数据赋值给signal。

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2024/08/06 15:36:14
// Design Name: 
// Module Name: FIR_polyphase_LPF_test
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//module FIR_polyphase_LPF_test();reg clk=1;
parameter PERIOD=2;
initial
beginforever #(PERIOD/2)  clk=~clk;
endreg s_axis_data_tvalid=0;
wire s_axis_data_tready;
reg [15:0] s_axis_data_tdata=0;
wire m_axis_data_tvalid;
wire [39:0] m_axis_data_tdata;integer i=0;
reg [15:0] signal[1023:0];initial
begin$readmemb("data_decimation.txt", signal);//从data.txt中读入采样数据#(PERIOD*5)forever begin@(negedge clk) beginif(i<1024) begins_axis_data_tvalid<=1;s_axis_data_tdata <= signal[i];i <= i + 1;endelsebegins_axis_data_tvalid<=0;s_axis_data_tdata <=0;endendend 
endinteger dout_file;
initial 
begindout_file=$fopen("E:/play_vivado/FIR_polyphase_decimation_test/Readme/m_axis_data_tdata.txt"); //打开所创建的文件,修改为自己想存储的位置if(dout_file == 0)begin $display ("can not open the file!"); //创建文件失败,显示can not open the file!$stop;end
endinitial
beginforeverbegin@(posedge clk) beginif(m_axis_data_tvalid)$fdisplay(dout_file,"%d",$signed(m_axis_data_tdata)); //保存有符号数据endend
endFIR_polyphase_LPF u_FIR_polyphase_LPF (.aclk(clk),                               // input wire aclk.s_axis_data_tvalid(s_axis_data_tvalid),  // input wire s_axis_data_tvalid.s_axis_data_tready(s_axis_data_tready),  // output wire s_axis_data_tready.s_axis_data_tdata(s_axis_data_tdata),    // input wire [15 : 0] s_axis_data_tdata.m_axis_data_tvalid(m_axis_data_tvalid),  // output wire m_axis_data_tvalid.m_axis_data_tdata(m_axis_data_tdata)    // output wire [39 : 0] m_axis_data_tdata
);endmodule

接下来将第二步生成的仿真数据保存到...\FIR_polyphase_decimation_test\FIR_polyphase_decimation_test.sim\sim_1\behav\xsim文件夹下:

然后点击run simulation。将s_axis_data_tdata的数据格式设置为定点有符号数,小数位数为9位。将m_axis_data_tdata_real的数据格式设置为定点有符号数,小数位数为26位。然后就能看见输入的数据依次为2.0,1.6738,0.8652...,和MATLAB生成的信号数据是对的上的。滤波后的数据依次为0.0116,-0.0245,-0.0466,...,和MATLAB滤波后的信号数据也是对的上的。

这里注意一下FIR 抽取多相滤波IP核是从第二个数据开始抽取的。

将输入输出设置为波形显示如下:

可知FIR 抽取多相滤波IP核既完成了滤波,又完成了抽取操作,抽取后是每4个clk出一个数据。

五、VIVADO工程下载

https://download.csdn.net/download/m0_66360845/89797080icon-default.png?t=O83Ahttps://download.csdn.net/download/m0_66360845/89797080


总结

        本文讲解了VIVADO中FIR抽取多相滤波器IP核的使用,通过仿真,与MATLAB计算的数据相比较,验证了VIVADO中FIR抽取多相滤波器本身是没有考虑滤波器的群延时的,以上的仿真结果很好的说明了如何使用VIIVADO FIR抽取多相滤波器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/432087.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony(鸿蒙南向)——平台驱动开发【Regulator】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 Regulator模块用于控制系统中各类设备的电压/电流…

有关shell指令练习2

写一个shell脚本&#xff0c;将以下内容放到脚本中 在家目录下创建目录文件&#xff0c;dir dir下创建dir1和dir2 把当前目录下的所有文件拷贝到dir1中&#xff0c; 把当前目录下的所有脚本文件拷贝到dir2中 把dir2打包并压缩为dir2.tar.xz 再把dir2.tar.xz移动到dir1中 …

excel快速入门(二)

Excel的概念说明 文章目录 Excel的概念说明常见术语说明单元格/单元格区域活动单元格/单元格区域行或列单元格引用相对引用绝对引用混合引用 Excel的常见格式说明单元格格式数字格式 Excel 工作表编辑鼠标指针介绍1.白色十字状2.单向黑色箭头状3.双向单竖线箭头状4.双向双竖线箭…

Linux下的git开篇第一文:git的意义

1.git版本控制器 git其实就是一个版本控制器&#xff0c;程序员在写代码的时候&#xff0c;利用git工具保存每一个版本&#xff0c;在程序员需要任何一个版本的时候&#xff0c;都可提供。 2.git gitee&&github github其实上就是国外的gitee&#xff0c;网址在国外&am…

C++——关联式容器(5):哈希表

7.哈希表 7.1 哈希表引入 哈希表的出现依旧是为了查找方便而设计的。在顺序结构中&#xff0c;查询一个值需要一一比较&#xff0c;复杂度为O(N)&#xff1b;在平衡树中&#xff0c;查询变为了二分查找&#xff0c;复杂度为O(logN)&#xff1b;而对于哈希表&#xff0c;我们可…

JavaWeb - 7 - SpringBootWeb入门

Spring 官网&#xff1a;Spring | Home Spring发展到今天已经形成了一种开发生态圈&#xff0c;Spring提供了若干个子项目&#xff0c;每个项目用于完成特定的功能 SpringBoot SpringBoot可以帮助我们非常快速的构建应用程序、简化开发、提高效率 一.SpringBootWeb入门 需求…

【React】样式控制

1.react组件样式控制方式 行内样式&#xff08;通过style属性&#xff09;&#xff1a;不推荐class类名控制 function App() {const style {color: skyblue,fontSize: 20px}return (<div className"App"><span style{{ color: "pink", fontSiz…

N诺计算机考研-错题

B A.LLC&#xff0c;逻辑链路控制子层。一个主机中可能有多个进程在运行&#xff0c;它们可能同时与其他的一些进程&#xff08;在同一主机或多个主机中&#xff09;进行通信。因此在一个主机的 LLC子层的一个服务访问点&#xff0c;以便向多个进程提供服务。B.MAC地址&#xf…

VSCode#include头文件时找不到头文件:我的解决方法

0.前言 1.在学习了Linux之后&#xff0c;我平常大部分都使用本地的XShell或者VSCode连接远程云服务器写代码&#xff0c;CentOS的包管理器为我省去了不少繁琐的事情&#xff0c;今天使用vscode打开本地目录想写点代码发现#include头文件后&#xff0c;下方出现了波浪线&#…

手机解压软件加密指南:让文件更安全

在数字化时代&#xff0c;文件加密对于保护个人隐私和敏感信息的重要性不言而喻。随着互联网的飞速发展&#xff0c;我们的生活和工作越来越依赖于数字设备和网络。 然而&#xff0c;这也带来了一系列的安全风险&#xff0c;如黑客攻击、数据泄露等。文件加密技术成为了保护我…

keil软件开发流程

1.先建一个文件 2.然后打开keil&#xff0c;打开keil软件新建keil工程 3.确定保存的位置以及工程的名字 4.确定开发工程所用的单片机芯片 5.复制启动文件到工程中选择否 6.创建新的C文件 7.保存C文件 8.写一个代码 9.编译代码 10.勾选设置&#xff0c;生成可执行文件 10.构建代…

无人机之可承受风速的影响因素

无人机可承受风速的影响因素是多方面的&#xff0c;这些因素共同决定了无人机在特定风速条件下的飞行稳定性和安全性。以下是一些主要的影响因素&#xff1a; 一、无人机设计与结构 无人机的大小、形状和重量都会直接影响其抗风能力。大型无人机由于具有更大的表面积和质量&am…

HAproxy-7层负载均衡集群根据不同服务请求分配服务器

搭建HAproxy----7层负载均衡集群的补充 https://blog.csdn.net/qq_73990369/article/details/142500451?spm1001.2014.3001.5501 一、再准备两台虚拟机进行测试 192.168.229.15/24 ----php1 192.168.229.16/24 ----php2 1、PHP1 & php2(192.168.229.15/24 ,192…

SVG之path详解,全面解析椭圆弧命令A

前言&#xff1a; 转载于b站深坑妙脆角&#xff0c;讲解清晰明了&#xff0c;对初使用path圆弧命令非常友好 作者&#xff1a;深坑妙脆角 https://www.bilibili.com/read/cv35872299/?jump_opus1 出处&#xff1a;bilibili 简述&#xff1a; SVG 中的 <path> 元素用于创…

大数据Flink(一百二十三):五分钟上手Flink MySQL连接器

文章目录 五分钟上手Flink MySQL连接器 一、创建数据库表 二、​​​​​​创建session集群 三、源表查询 四、​​​​​窗口计算 五、​​​​​​结果数据写回数据库 五分钟上手Flink MySQL连接器 MySQL Connector可以将本地或远程的MySQL数据库连接到Flink中&#x…

16【Protues51单片机仿真】智能洗衣机倒计时系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 用直流电机转动模拟洗衣机。要求 有弱洗、普通洗、强洗三种模式&#xff0c;可通过按键选择。可以设置洗衣时长&#xff0c;通关按键选择15、30、45、60、90分钟。时间到蜂鸣器报警提示。LCD 显示…

Koa (下一代web框架) 【Node.js进阶】

koa (中文网) 是基于 Node.js 平台的下一代 web 开发框架&#xff0c;致力于成为应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石&#xff1b; 利用 async 函数 丢弃回调函数&#xff0c;并增强错误处理&#xff0c;koa 没有任何预置的中间件&#xff0c;可快速…

大数据Hive组件安装

组件版本 组件版本Hadoop3.3.0JDK1.8.0_241Mysql5.7.25Hive3.1.2 Hadoop集群服务分布 Node1Node2Node3NameNode DataNode DataNodeDataNode NodeManager NodeManagerResourceManagerSecondaryNameNode 安装前请确定Hadoop集群服务全部启动&#xff0c;不然后续测试时会报…

Python面向对象编程:类和对象①

文章目录 一、什么是面向对象编程1.1 面向对象编程的基本概念1.2 Python中的类和对象 二、定义类和创建对象2.1 定义类2.2 创建对象2.3 __init__方法2.4 self参数 三、类的属性和方法3.1 类的属性3.1.1 实例属性3.1.2 类属性 3.2 类的方法3.2.1 实例方法3.2.2 类方法3.2.3 静态…

解锁HTML的力量:从基础标签到完整网页构建

在整个学习编程技能的过程中&#xff0c;我们会始终基于编程的本质&#xff1a;输入-》函数处理-》输出 和编程语言的本质&#xff1a;语法糖、变量、基础函数&#xff0c;去理解各种编程技术和学习相关的技能。 今天开始学习编程的第一个技能点&#xff1a;HTML。正如编程的本…