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

news2024/11/20 0:26:20

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 Frequency

Fpass = 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
begin
    forever #(PERIOD/2)  clk=~clk;
end

reg 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) 
        begin
            if(i<1024) 
                begin
                    s_axis_data_tvalid<=1;
                    s_axis_data_tdata <= signal[i];
                    i <= i + 1;
                end
            else
                begin
                    s_axis_data_tvalid<=0;
                    s_axis_data_tdata <=0;
                end
        end
    end 
end

integer dout_file;
initial 
begin
    dout_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
end

initial
begin
    forever
    begin
        @(posedge clk) 
        begin
            if(m_axis_data_tvalid)
            $fdisplay(dout_file,"%d",$signed(m_axis_data_tdata)); //保存有符号数据
        end
    end
end

FIR_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.coloradmin.cn/o/2166182.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL数据库修改authentication_string字段为显示密码后无法登录

MySQL数据库修改authentication_string字段为显示密码后无法登录 1. 本文创作背景2. 问题3. 原因分析4. 解决方案5. 附录 1. 本文创作背景 本文介绍MySQL数据库修改authentication_string字段为显示密码后无法登录的处理办法。 2. 问题 用户通过navicat修改MySQL的user表roo…

逆概率加权(R和Python案例)

逆概率加权&#xff08;Inverse Probability Weighting, IPW&#xff09;是一种统计技术&#xff0c;用于观察性研究中调整混杂变量的影响&#xff0c;以便更准确地估计因果关系。这种方法特别有用于在无法进行随机化实验的情况下&#xff0c;通过给予不同个体不同的权重&#…

[数据库实验七]事务设计

目录 一、实验目的与要求 二、实验内容 三、实验小结 实验中涉及的数据参考&#xff1a;[数据库实验一]数据库和表-CSDN博客 一、实验目的与要求 1.熟悉提交事务 2.回滚事务 3.检查点技术 注&#xff1a;可以用可视化软件来实现 二、实验内容 基于现有数据库设计事务提…

Axure-本地发布,局域网内用户访问

目录 前言内容一. 选择Axure发布路径&#xff0c;进行相应配置二.添加IIS服务配置&#xff08;不在这里赘述&#xff01;&#xff09;三&#xff1a;添加IIS配置&#xff0c;创建网站四.添加安全策略&#xff1a;实践&#xff1a; 前言 最近加入了公司的积分系统&#xff0c;由…

时尚与科技的融合,戴上更轻更悦耳的QCY C30耳夹耳机,随时享受好音乐

不知不觉&#xff0c;蓝牙耳机已经成了我日常必备的小工具了&#xff0c;尤其是这两年新出现的耳夹式耳机&#xff0c;轻松解决了入耳式耳机的舒适性难题&#xff0c;戴上一整天也不会觉得累&#xff0c;而且一款好看的耳机不仅能够提供澎湃的音质&#xff0c;还能成为时尚出街…

理解信息安全中的SOAR

在信息安全领域&#xff0c;SOAR&#xff08;Security Orchestration, Automation, and Response&#xff0c;安全编排、自动化与响应&#xff09;是一个现代化的解决方案&#xff0c;旨在通过集成和自动化的方式优化安全操作流程&#xff0c;提升威胁检测、事件响应的速度与效…

雷达原理-绪论-西电魏青

Radar 雷达&#xff1a;radio detection and ranging 无线电探测和测距 无线电&#xff1a;电磁波信号 探测&#xff1a;通过电磁波信号的一个回波特性实现物体探测 测距&#xff1a;利用回波信号&#xff08;现在技术发展&#xff0c;不单单是测距&#xff0c;还能是物体的各种…

stm32 flash无法擦除

通过bushound调试代码发现&#xff0c;当上位机发送命令到模组后flash将不能擦除&#xff0c;通过 HAL_FLASH_GetError&#xff08;&#xff09;函数查找原因是FLASH Programming Sequence error&#xff08;编程顺序错误&#xff09;&#xff0c;解决办法是在解锁后清零标志位…

构建高效房屋租赁系统:Spring Boot应用

1 绪论 1.1 研究背景 中国的科技的不断进步&#xff0c;计算机发展也慢慢的越来越成熟&#xff0c;人们对计算机也是越来越更加的依赖&#xff0c;科研、教育慢慢用于计算机进行管理。从第一台计算机的产生&#xff0c;到现在计算机已经发展到我们无法想象。给我们的生活改变很…

MySQL purge逻辑分析与调测

目录 purge逻辑分析与调测 一、purge线程 1、什么是purge线程&#xff1f; 2、为什么需要purge&#xff1f; 3、purge哪些内容&#xff1f; 4、什么时候purge&#xff1f; 5、purge内存结构 二、purge主要步骤 1、确认可见性 2、获取需要purge的undo记录 …

开源鸿蒙OpenHarmony系统修改屏幕旋转方法 深圳触觉智能RK3566开发板

本文提供OpenHarmony4.0系统竖屏修改为旋转时的操作方法&#xff0c;在此为大家介绍了两种方法&#xff01;第一种方式是将修改过的文件重新编译后烧录至开发板中实现屏幕旋转&#xff0c;第二种方式则是通过覆盖原文件的方式实现屏幕旋转。 1、源码下载 首先进入触觉智能官网…

【C语言从不挂科到高绩点】22-指针04-结构体指针【重点知识】

Hello!彦祖们,俺又回来了!!!,继续给大家分享 《C语言从不挂科到高绩点》课程!! 本节将为大家讲解C语言中非常重要的知识点-指针: 本套课程将会从0基础讲解C语言核心技术,适合人群: 大学中开设了C语言课程的同学想要专升本或者考研的同学想要考计算机等级证书的同学想…

UART开发基础

目录 前言 同步传输与异步传输 1.概念与示例 2.差别 UART协议与操作方法 1.UART协议 2.STM32H5 UART硬件结构 3.RS485协议 UART编程 1.三种编程方式 2.查询方式 3.中断方式 4.DMA 方式 效率最高的UART编程方法 1.IDLE中断 2.DMA 发送/DMAIDLE 接收 在RTOS里使…

L2 Loss介绍及梯度计算说明

L1 Loss介绍及梯度计算说明-CSDN博客 L2 Loss&#xff08;MS&#xff0c;也称为均方误差损失或平方误差损失&#xff09;是一种常用的损失函数&#xff0c;广泛应用于回归任务中。它通过计算预测值与真实值之间的平方差来评估模型的性能。 1. L2 Loss 的定义 L2 Loss 的数…

Python | Leetcode Python题解之第437题路径总和III

题目&#xff1a; 题解&#xff1a; class Solution:def pathSum(self, root: TreeNode, targetSum: int) -> int:prefix collections.defaultdict(int)prefix[0] 1def dfs(root, curr):if not root:return 0ret 0curr root.valret prefix[curr - targetSum]prefix[cu…

Golang | Leetcode Golang题解之第436题寻找右区间

题目&#xff1a; 题解&#xff1a; func findRightInterval(intervals [][]int) []int {n : len(intervals)type pair struct{ x, i int }starts : make([]pair, n)ends : make([]pair, n)for i, p : range intervals {starts[i] pair{p[0], i}ends[i] pair{p[1], i}}sort.…

第四届工业母机高质量发展论坛在浙江温岭召开

9月24日&#xff0c;由工业和信息化部产业发展促进中心&#xff08;以下简称产促中心&#xff09;主办的“第四届工业母机高质量发展论坛”在浙江温岭成功召开。 中国工程院院士周济、郭东明、王国庆&#xff0c;工业和信息化部装备工业一司一级巡视员苗长兴&#xff0c;中国企…

C语言 | Leetcode C语言题解之第437题路径总和III

题目&#xff1a; 题解&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ //递归遍历树节点&#xff0c;判断是否为有效路径 int dfs(struct TreeNode * root, int ta…

C++ -函数重载-详解

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【C】 欢迎点赞&#x1f44d;收藏⭐关注❤️ C -函数重载-详解 1.是什么2.怎么用2.1示例 3.原理3.1C/C编译链接过程3.2函数名修饰规则3.3过程1.调用函数的过程2.编译阶段的函数调用 总结 1.是什么 如果在百度中搜索重载这…

Adobe Bridge简体中文版百度云下载与安装(附教程)

如大家所熟悉的&#xff0c;Adobe Bridge常常简称为BR&#xff0c;是一款数字资产管理软件&#xff0c;可以帮助用户浏览、组织、搜索和管理各种类型的媒体文件&#xff0c;如照片、音频、视频等。 Bridge发展至今有许多个版本&#xff0c;目前来说常用的版本有Bridge 2018、2…