VIVADO IP核之FIR插值器多相滤波仿真

news2024/11/15 7:10:26

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

目录

前言

一、滤波器系数生成

二、用MATLAB生成仿真数据

三、VIVADO FIR插值多相滤波器使用

四、VIVADO FIR插值多相滤波器仿真

五、VIVADO工程下载

总结


前言

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


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

一、滤波器系数生成

        仿真假设有一个幅值为1,频率为5MHz,初相为0的正弦波,用30MHz的采样率对其进行采样,那么可以得到一个信号速率为30MSPS,频率为5MHz的正弦波,接下来我们分别用MATLAB和FIR ip核对其进行2插值多相滤波,那么便可以得到一个信号速率为60MSPS,频率为5MHz的正弦波。

        滤波器设计如下,插值之后速率为60M,所以这里滤波器的采样频率是60MHz,而不是30MHz。设计的滤波器为49阶,那么有50个系数,便于2插值多相滤波。

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

二、用MATLAB生成仿真数据

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

rng default;
clc; 
clear;
close all;

fs =  30e6;     % 采样频率 30MHz
K = 1024;       % 快拍个数
t = 0:1/fs:(K-1)/fs;
f = 5e6;
x = cos(2*pi*f*t);

figure(1);
plot(x(1:30));
grid on;

I=2;
x_up=zeros(1,length(x)*I-I+1);
x_up(1:I:end)=x;

lowpass_Fs_up=30000000*I;    % 低通滤波器的采样频率
lowpass_Fpass_up=10000000;   % 低通滤波器的通带截止频率
lowpass_Fstop_up=14000000;   % 低通滤波器的阻带起始频率
% 下一行的lowpass是用fdatool设计的滤波器保存为matlab code自己修改了一下
[lowpass_b_up,~] = tf(lowpass_1(lowpass_Fs_up,lowpass_Fpass_up,lowpass_Fstop_up));% 得到滤波器系数

x_up_LPF=conv(x_up,lowpass_b_up);
figure(2);
plot(x_up_LPF(1:30*I));
grid on;

h = fopen('data_interpolation_real.txt','w');
for i=1:length(x)
    result= fi(x(i), 1, 16, 9).bin;
    fprintf(h,'%s\n',result);
end
fclose(h);



function Hd = lowpass_1(lowpass_Fs,lowpass_Fpass,lowpass_Fstop)
%LOWPASS_1 返回离散时间滤波器对象。

% MATLAB Code
% Generated by MATLAB(R) 23.2 and Signal Processing Toolbox 23.2.
% Generated on: 12-Sep-2024 16:14:34

% 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 1dB
% Dpass = 0.028774368332;  % Passband Ripple 0.5dB
Dpass = 0.0063320243772;  % Passband Ripple 0.11dB
% Dpass = 0.0057563991496; % Passband Ripple 0.1dB
Dstop = 0.0001;          % Stopband Attenuation 80dB
% Dstop = 0.0031622776602;  % Stopband Attenuation 50dB
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原始信号如下图所示:

2插值低通滤波后的信号为(可见FIR滤波器有群延时):

三、VIVADO FIR插值多相滤波器使用

在vivado中搜索FIR滤波器IP核并点进去设置它。滤波器命名为FIIR_polyphase_interpolation_LPF(多打了一个I,自己可以去掉),导入第一步MATLAB生成的滤波器系数文件。Filter type 选择插值,插值因子设置为2。

 输入信号采样速率设置为30MHz,时钟频率设置为60MHz,这样插值前每个输入持续两个时钟周期,2插值后就变成了每个时钟出一个数据

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

插值时调用FIR 插值滤波比我们自己给数据插0后再调用FIR低通滤波更节约资源。 

四、VIVADO FIR插值多相滤波器仿真

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

`timescale 1ns / 1ps
//
// Company: cq university
// Engineer: clg
// 
// Create Date: 2024/09/12 21:05:57
// Design Name: 
// Module Name: FIIR_polyphase_interpolation_LPF_test
// Project Name: 
// Target Devices: 
// Tool Versions: 2018.3
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//

module FIR_polyphase_interpolation_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_real=0;
wire m_axis_data_tvalid;
wire [31:0] m_axis_data_tdata_real;
reg [15:0] s_axis_data_tdata_imag=0;
wire [31:0] m_axis_data_tdata_imag;

integer i=0;
reg [15:0] signal_real[1023:0];
reg [15:0] signal_imag[1023:0];

reg clk_divide2=1;
always @(posedge clk)
begin
    clk_divide2=!clk_divide2;
end
 
initial
begin
    $readmemb("data_interpolation_real.txt", signal_real);//读入采样数据
    $readmemb("data_interpolation_imag.txt", signal_imag);//读入采样数据
    #(PERIOD*5)
    forever 
    begin
        @(posedge clk) 
        begin
            if(i<1024&&clk_divide2==1) 
                begin
                    s_axis_data_tvalid<=1;
                    s_axis_data_tdata_real <= signal_real[i];
                    s_axis_data_tdata_imag <= signal_imag[i];
                    i <= i + 1;
                end
            else
                begin
                    s_axis_data_tvalid<=0;
                    s_axis_data_tdata_real <= s_axis_data_tdata_real;
                    s_axis_data_tdata_imag <= s_axis_data_tdata_imag;
                end
        end
    end 
end

integer dout_file_real;
integer dout_file_imag;
initial 
begin
    dout_file_real=$fopen("E:/play_vivado/FIR_polyphase_interpolation_test/Readme/m_axis_data_tdata_real.txt"); //打开所创建的文件,修改为自己想存储的位置
    dout_file_imag=$fopen("E:/play_vivado/FIR_polyphase_interpolation_test/Readme/m_axis_data_tdata_imag.txt"); //打开所创建的文件,修改为自己想存储的位置
    if(dout_file_real == 0 || dout_file_imag == 0)
    begin 
        $display ("can not open the file!"); //创建文件失败,显示can not open the file!
        $stop;
    end
end

initial
begin
    #(PERIOD*33)
    forever
    begin
        @(posedge clk) 
        begin
            $fdisplay(dout_file_real,"%d",$signed(m_axis_data_tdata_real)); //保存有符号数据
            $fdisplay(dout_file_imag,"%d",$signed(m_axis_data_tdata_imag)); //保存有符号数据
        end
    end
end

FIIR_polyphase_interpolation_LPF u_FIIR_polyphase_interpolation_LPF_real (
  .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_real),    // 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_real)    // output wire [31 : 0] m_axis_data_tdata
);

FIIR_polyphase_interpolation_LPF u_FIIR_polyphase_interpolation_LPF_imag (
  .aclk(clk),                              // input wire aclk
  .s_axis_data_tvalid(s_axis_data_tvalid),  // input wire s_axis_data_tvalid
  .s_axis_data_tready( ),  // output wire s_axis_data_tready
  .s_axis_data_tdata(s_axis_data_tdata_imag),    // input wire [15 : 0] s_axis_data_tdata
  .m_axis_data_tvalid( ),  // output wire m_axis_data_tvalid
  .m_axis_data_tdata(m_axis_data_tdata_imag)    // output wire [31 : 0] m_axis_data_tdata
);

endmodule

然后点击run simulation。将s_axis_data_tdata_real的数据格式设置为定点有符号数,小数位数为9位。将m_axis_data_tdata_real的数据格式设置为定点有符号数,小数位数为25位。然后就能看见输入的数据依次为1,0.5,-0.5...,和MATLAB生成的信号数据是对的上的。滤波后的数据依次为-0.000396,0.001586,...,和MATLAB滤波后的信号数据也是对的上的。

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

 分析下图,可知输入原本一个周期的正弦波只有6个点,但经过2插值后一个周期输出便有了12个点。

五、VIVADO工程下载

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


总结

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

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

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

相关文章

生信初学者教程(五):R语言基础

文章目录 数据类型整型逻辑型字符型日期型数值型复杂数数据结构向量矩阵数组列表因子数据框ts特殊值缺失值 (NA)无穷大 (Inf)非数字 (NaN)安装R包学习材料R语言是一种用于统计计算和图形展示的编程语言和软件环境,广泛应用于数据分析、统计建模和数据可视化。1991年:R语言的最…

webpack4 target:“electron-renderer“ 打包加速配置

背景 昨天写得一篇Electron-vue asar 局部打包优化处理方案——绕开每次npm run build 超级慢的打包问题-CSDN博客文章浏览阅读754次&#xff0c;点赞19次&#xff0c;收藏11次。因为组员对于 Electron 打包过程存在比较迷糊的状态&#xff0c;且自己也没主动探索 Electron-vu…

CX8903:电动车手机充电器降压芯片,搭配协议实现快充

CX8903&#xff1a;一款专用于电动车手机充电器的降压芯片&#xff0c;搭配协议实现快充。 在城市的车水马龙中&#xff0c;电动自行车如灵动的精灵&#xff0c;便捷着我们的出行生活。在骑行的路上&#xff0c;随时保持连接&#xff0c;电动自行车手机充电器让手机电量满满。…

汽车应用生态系统的飞跃

在过去的几年里&#xff0c;汽车系统经历了前所未有的变革&#xff0c;驾驶员和乘客对于车内体验的期待已远远超越了传统的驾驶范畴。随着技术的不断进步&#xff0c;基于Android Automotive OS&#xff08;AAOS&#xff09;和Google Automotive Services&#xff08;GAS&#…

在 Python 中使用 JSON

了解如何在 Python 中使用 JSON&#xff0c;从基础到高级技术。本指南涵盖解析、序列化、API 集成和最佳实践。 1. JSON 简介 1.1. 什么是 JSON&#xff1f; JSON&#xff08;JavaScript 对象表示法&#xff09;是一种轻量级数据交换格式&#xff0c;人类可以轻松读取和写入…

线性规划中可行域为什么一定是凸的--证明

线性规划中的凸性证明 线性规划中可行域是凸的&#xff0c;这是自然能够想到和容易理解的道理。直观上&#xff0c;线性约束定义的可行域是由半平面的交集构成的&#xff0c;这些半平面的交集总是形成凸区域。 这么一个自然想到、容易理解的道理&#xff0c;怎么从数学上完备…

机器翻译与数据集_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录介绍机器翻译下载和预处理数据集词元化词表加载数据集训练模型对上述代码中出现的Vocab进行总体解释和逐行解释使用场景 小结练习答案1. num_examples 参数对词表大小的影响2. 对于没有单词边界的语言&#xff0c;单词级词元化的有效性 介绍…

低代码平台后端搭建-阶段完结

前言 最近又要开始为跳槽做准备了&#xff0c;发现还是写博客学的效率高点&#xff0c;在总结其他技术栈之前准备先把这个专题小完结一波。在这一篇中我又试着添加了一些实际项目中可能会用到的功能点&#xff0c;用来验证这个平台的扩展性&#xff0c;以及总结一些学过的知识。…

Ngnix 在windows上的简单使用

安装 下载链接: nginx: download 选择页面中 Stable version 下的windows版本直接下载解压到本地。 运行nginx: 解压到本地后,结构如图: cmd 进入到上图的根目录,运行 start nginx ,即可开启。 打开 http://localhost 进行查看,如果正常打开nginx的测试页面,则说…

Nvidia的高级研究科学家Jim Fan预计在未来两到三年内,机器人技术将取得重大进展

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

pcdn盒子连接方式

连接方式 大部分连接方式如下 光猫拨号 → 路由器 → 盒子 优点&#xff1a;光猫负责拨号&#xff0c;路由器只需做路由转发&#xff0c;性能要求不高缺点&#xff1a;光猫会有一层nat&#xff0c;路由器还有一层nat&#xff0c;两层nat需要在两个设备上都做nat优化注意&…

mysql通过binlog做数据恢复

1 介绍 binlog&#xff08;二进制日志&#xff09;在 MySQL 中具有非常重要的作用。它记录了数据库的所有更改操作&#xff0c;主要用于数据恢复、复制和审计等方面。以下是 binlog 的主要作用&#xff1a; 1.数据恢复 binlog 可以用于恢复数据库中的数据。当数据库发生故障时…

Activiti7《第三式:破刀式》——工作流中的刀锋利刃

冲冲冲&#xff01;开干 这篇文章将分为九个篇章&#xff0c;带你逐步掌握工作流的核心知识。欢迎来到 “破刀式” 篇章&#xff01;在工作流的开发过程中&#xff0c;锋利的利器就是 精湛的设计与代码优化。本篇文章将探讨如何像一把利刃一样&#xff0c;用最直接的方式切入复…

phpword读取word docx文档文本及图片转html格式

最近在做一个PHP读取word文档功能&#xff0c;搜索一圈后决定选择用phpword第三方组件。 composer安装phpWord composer require phpoffice/phpword如果你的文件是doc格式&#xff0c;直接另存为一个docx就行了&#xff1b;如果你的doc文档较多&#xff0c;可以下一个批量转…

ZXing.Net:一个开源条码生成和识别器,支持二维码、条形码等

推荐一个跨平台的非常流行的条码库&#xff0c;方便我们在.Net项目集成条码扫描和生成功能。 01 项目简介 ZXing.Net是ZXing的.Net版本的开源库。支持跨多个平台工作&#xff0c;包括 Windows、Linux 和 macOS&#xff0c;以及在 .NET Core 和 .NET Framework 上运行。 解码…

Qwen 个人笔记

Qwen 个人笔记 Qwen的整体架构与Llama2类似&#xff0c;如下图所示: 1 Qwen2Config 1.1 Model 1.1.1 初始化 设置了模型的两个属性:padding_idx&#xff08;用于指定填充标记的索引&#xff09;&#xff0c;vocab_size&#xff08;词汇表的大小&#xff09;初始化了模型的…

基于MATLAB的安全帽检测系统

课题名称 课题介绍 众所周知&#xff0c;在一些施工工地&#xff0c;必须明确佩戴安全帽。可以对生命安全起到保障作用。该课题为常见的安全帽的识别&#xff0c;主要分为红色&#xff0c;蓝色&#xff0c;黄色三类安全帽。而安全帽的主要是红色&#xff0c;蓝色&…

Dell PowerEdge 网络恢复笔记

我有一台Dell的PowerEdge服务器&#xff0c;之前安装了Ubuntu 20 桌面版。突然有一天不能开机了。 故障排查 Disk Error 首先是看一下机器的正面&#xff0c;有一个非常小的液晶显示器&#xff0c;只能显示一排字。 上面显示Disk Error&#xff0c;然后看挂载的硬盘仓&#…

【Mysql-索引总结】

文章目录 什么是索引索引类型索引的数据结构Hash索引有序数组二叉搜索树平衡二叉树B树B索引 索引使用规则索引失效的情况如何选择正确的列进行索引&#xff1f; 什么是索引 索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构&#xff0c;它是某个表中…

【第34章】Spring Cloud之SkyWalking分布式日志

文章目录 前言一、准备1. 引入依赖 二、日志配置1. 打印追踪ID2. gRPC 导出 三、完整日志配置四、日志展示1. 前端2. 后端 总结 前言 前面已经完成了请求的链路追踪&#xff0c;这里我们通过SkyWalking来处理分布式日志&#xff1b; 场景描述&#xff1a;我们有三个服务消费者…