利用FPGA的IP核实现FIR滤波器
自己在Chinaaet的第一篇博客,呵呵~
记录一下,利用Altera提供的IP核进行FIR滤波器的设计流程,以及中途遇到的一些坑。主要是按照杜勇老师编写的《数字滤波器的MATLAB与FPGA实现:Altera/Verilog版》 进行的。
一、首先是设计指标:
采用最优化设计方法(firpm),设计一个阶数为16阶(长度为17)的线性相位低通FIR滤波器,截止频率为500hz,fs=2000hz。,系数量化位数为12bit,输入数据位宽为12bit,输出数据位宽为25Bit,系统时钟为2khz。
二、设计流程:
(1)利用MATLAB设计滤波器系数,浮点数类型。
(2)Matlab测试滤波器性能,输入观察输出。
(3)利用FPGA的FIR滤波器IP核设计滤波器。
(4)编写testbench,测试滤波器性能。输入Matlab产生的激励文本文件,
输出硬件处理后的信号,写入文本文件中。
(5)Matlab分析硬件处理后保存在文本文件中的信号。
三、设计步骤:
1,利用MATLAB设计滤波器系数。代码如下:
function hn=Fir_Coefficient_Design
N=17; %滤波器长度
Sample_Freq=2000; %采样频率
fc=500; %低通滤波器的通带截止频率
B=12; %量化位数
Cut_Off_Freq=[0 500 700 Sample_Freq/2];
Cut_Off_Freq=Cut_Off_Freq./(Sample_Freq/2); %归一化
Fir_Amplitude=[1 1 0 0];
Fir_Coefficient=firpm(N-1,Cut_Off_Freq,Fir_Amplitude);
hn=Fir_Coefficient;
freqz(Fir_Coefficient,1,1024,Sample_Freq);
注意MATLAB中频率归一化是针对fs/2,即采样率的一半。
接下来将滤波器系数写入文本文件中,
fid=fopen('Fir_Coefficient.txt','w');
for k=1:length(Fir_Coefficient)
fprintf(fid,'%.14f',Fir_Coefficient(k));
if(k~=length(Fir_Coefficient) )
fprintf(fid,'\r\n');
end
end
fclose(fid