一,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格式,在表格里面建图去看。



FIR滤波器&spm=1001.2101.3001.5002&articleId=147152742&d=1&t=3&u=fbd2fd19bedf4992a2e51b931cbb1e18)
1264

被折叠的 条评论
为什么被折叠?



