基于FPGA的数字信号处理系统开发笔记(二)FIR滤波器

想深耕嵌入式?这个专辑值得收藏

MCU、FPGA、工控、传感器一站式学习,实战项目直接抄

一,matlab产生初始信号并混合

主文件代码如下,引用的fft_plot函数为自己定义的函数,在第二段代码

特别注意:考虑到上次结尾遗留的图像突变的问题,本次采样点数(数据深度)N改为1000 

这样就可以保证上一个周期最后一个点,和下一个周期第一个点都为0,此时图像会连续不跳变。

clear;
    Fs=10000;%采样频率
    N=1000; %采样点数
    Ts=1/Fs; %采样周期

%%输入信号参数
    A = 3;              %幅值
    t =(0:N-1)*Ts;   %采样时间长度
    ft_0 = 100;         %信号1频率
    vi_0 = zeros(1,N);  %创建一个1*N的全零数组
    ft_1 = 2000;        %信号1频率
    vi_1 = zeros(1,N);  %创建一个1*N的全零数组
    vi = zeros(1,N);    %创建一个1*N的全零数组
    
    for n = 1:N
        vi_0(n) = A * sin(2*pi*ft_0*t(n)); %输入信号1
        vi_1(n) = A * sin(2*pi*ft_1*t(n)); %输入信号2
        vi(n) = vi_0(n) + vi_1(n);         %混合信号1和信号2
    end
    
    %%作图
    figure(1)
    subplot(3,1,1);% 3行1列第一个
    plot(t,vi_0,'k');
    subplot(3,1,2);% 3行1列第二个
    plot(t,vi_1,'k');
    subplot(3,1,3);% 3行1列第三个
    plot(t,vi,'k');
    
    %%快速傅里叶变换
    [Fre0,Amp0] = fft_plot(vi_0,Fs,N); %%fft_plot是自己定义的函数
    [Fre1,Amp1] = fft_plot(vi_1,Fs,N);
    [Fre,Amp] = fft_plot(vi,Fs,N);

    %%作图
    figure(2)
    subplot(3,1,1);% 3行1列第一个
    plot(Fre0,Amp0,'k');
    subplot(3,1,2);% 3行1列第二个
    plot(Fre1,Amp1,'k');
    subplot(3,1,3);% 3行1列第三个
    plot(Fre,Amp,'k');
    


fft_plot代码如下

function [Fre, Amp] = fft_plot(signal, fs, num_samples)
    % 计算FFT
    f_fft = fft(signal);
    N = length(f_fft); % FFT之后的序列长度
    
    % 提取频谱正半部分
    Y = f_fft(1:N/2+1);
    Y(2:end-1) = 2*Y(2:end-1); % 除了直流和Nyquist频率,其他频率成分乘以2
    
    % 计算幅值
    Y_amp = abs(Y)/N;
    
    % 计算频率向量
    df = fs/N;  %%fs采样频率 N为FFT的点数
    Fre = (0:1:N/2)*df;
    
    % 输出幅值
    Amp = Y_amp;
    
    % 如果需要在此函数中绘制图形,可以取消注释以下代码
    % 但通常最好在主脚本中处理绘图
    % figure;
    % plot(Fre, Amp);
    % title('Frequency Spectrum');
    % xlabel('Frequency (Hz)');
    % ylabel('Amplitude');
end

运行结果如下

二,在Simulink上进行设计、仿真

(1)matlab数据输入

首先我们数据的输入是还是采用与上次一样的方式,为计数器+ROM的形式;

ROM参数如下,计数器参数不用修改

(2)添加FIR滤波器IP核

位置如下

再在如下位置添加FDATool工具

双击FIR Compiler 7.2,打开其参数设置使其与FDATool工具进行关联

xlfda_numerator('FDATool')

(3)用FDATool工具对FIR滤波器IP核进行参数设置

双击打开(2024版的好处,中文,嘿嘿嘿嘿嘿)

设置参数如下,本次设计的为低通滤波器:

(4)进行Simulink仿真验证

结果如下,蓝色为输入的混合信号,黄色为经过FIR滤波器的低频信号

看的不是很明显,点击上面的视图按钮,将两个信号分开显示

结果如下:

较好的分离出了低频信号。

三,用Vivado进行仿真,并且下载到FPGA开发板

(1)用Simulink导出工程

将如下红框圈中的部分封装为一个子系统

随后进行HDL Code Advisor检查(详情见第一章)

在这里要注意一点,封装子系统的时候data_tready我们用不到,创建子系统的时候会给它分配一个out1,要删除,保证子系统就有使能输出和数据输出,两个输出

正常情况下,只报以下一个错;

导出流程详情见第一篇文章基于FPGA的数字信号处理系统开发笔记(一)

(2)用Vivado打开生成好的工程

如下,后续步骤见第一篇文章;

简单总结一下:1.添加IP核心:集成逻辑分析仪(ILA);实例化,并且将输出信号传入ILA中

                         2.进行RTL分析

                         3.配置管教约束文件

                         4.生成比特流文件,并下载

我这边直接展示最后的效果了;

上述两个有out1就是因为没有在Simulink中删除data_tready转换的输出。

这样就🆗了,不然生成比特流文件会报错。

(3)ILA结果

不知道为什么,按照上一篇文章,调整了数据类型为无符号小数,并且选择模拟信号,这次不用导出就看到了波形图,如果各位不是如下结果,可以导出ILA数据,以CSV格式,在表格里面建图去看。

想深耕嵌入式?这个专辑值得收藏

MCU、FPGA、工控、传感器一站式学习,实战项目直接抄

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值