基于Quartus II 和MATLAB 的FIR滤波器设计与仿真(一)

        关键词:Quartus II     MATLAB     FIR 滤波器     IP 核

        整个设计与仿真过程大体分为四步:第一步在MATLAB设计滤波器系数并生成混合频率正弦信号作为仿真输入进行功能仿真;第二步在Quartus II调用IP核导入系数生成滤波器;第三步在Quartus II调用ROM IP核存入仿真输入作为正弦信号发生器进行仿真;第四步将Quartus II仿真输出导出到MATLAB绘图与输入做对比。

1     MATLAB 设计 FIR 滤波器系数与 FIR 滤波器仿真
    1.1    设计 FIR 滤波器系数

        MATLAB设计滤波器系数可以采用两种方式:方式1可调用图形化工具FDATOOL:在命令行输入fdatool --> 设置滤波器通阻带、采样频率,选择设计方法 --> 生成滤波器系数,导出到工作区 --> 量化滤波器系数,存入文本文件。具体设置网上很多教程都有,就不赘述了。


方式2就是敲代码设计滤波器系数了:

fs=8000;         %采样频率
fp=1500;  %通带最高频率
fstop=2000;  %阻带最低频率
wp=2*pi*fp/fs;
ws=2*pi*fstop/fs;
B=ws-wp;%过渡带
n=ceil(8*pi/B);%汉宁窗的过渡带宽度为8*pi/n;n阶滤波器;ceil()函数表示向上取整
wn=(wp+B/2)/pi;%wn为归一化截止频率
w=hann(n);%w为窗函数类型,汉宁窗
b=fir1(n-1,wn,w);%调用fir1函数实现n阶fir滤波器
[hw,ww]=freqz(b,1,512,fs);%b是抽头系数的分子,1是抽头系数的分母,512代表是512点fft从时域转换到频域,hw是频率响应,ww是频率向量
%绘制实际冲激响应与频率响应图
figure
m=0:n-1;
subplot(311);
stem(m,b);grid on;
xlabel('n');ylabel('h(n)');
title('实际冲激响应');
subplot(312)
plot(ww,20*log10(abs(hw)));grid on;
xlabel('frequency(Hz)');ylabel('Magnitude(dB)');
title('幅频特性');
subplot(313)
plot(ww,angle(hw));grid on;
xlabel('frequency(Hz)');ylabel('Phase');
title('相频特性');
%滤波系数进行量化
b12=round(b/max(abs(b))*(2^11-1));%12bit量化
b14=round(b/max(abs(b))*(2^13-1));%14bit量化
%将生成的滤波器系数数据写入FPGA所需的文件中
fid=fopen('D:\Altera_pro\lp_fir\b.txt','w');
fprintf(fid,'%8d\r\n',b);
fclose(fid);
fid1=fopen('D:\Altera_pro\lp_fir\b12.txt','w');
fprintf(fid1,'%d\r\n',b12);
fclose(fid1);
fid2=fopen('D:\Altera_pro\lp_fir\b14.txt','w');
fprintf(fid2,'%8d\r\n',b14);
fclose(fid2);


在这里我对滤波器系数分别做了12位和14位量化,后面我选择了12位量化;至于量化的原因就是因为FIR滤波器是数字滤波器,所以要把系数和输入的正弦信号都量化成数字信号。

    1.2 MATLAB 中滤波器的实现与仿真 

        1.2.1 混合频率正弦信号的产生(此处一定要注意设置采样频率时一定要与设计滤波器系数时的采样频率一致)

%产生混合频率输入波形
f1 = 1000;
f2 = 2500;
t = 0:1/fs:0.01-1/fs;
x1 = 1 + sin(2*pi*f1*t);
x2 = 1 + sin(2*pi*f2*t);
x = x1 + x2;
figure;
subplot(411);
plot(t,x1);
title('1000Hz正弦信号');
subplot(412);
plot(t,x2);
title('2500Hz正弦信号');
subplot(413);
plot (t,x);
title('混合频率正弦信号');
x12=round(x/max(abs(x))*(2^11-1));%12bit量化
subplot(414);
plot(t,x12);
title('量化后正弦信号波形');
X1=fft(x1);
X2=fft(x2);
X=fft(x);
X12=fft(x12);
figure;
subplot(411);
stem(abs(X1));
title('1000Hz正弦信号频谱');
subplot(412);
stem(abs(X2));
title('2500Hz正弦信号频谱');
subplot(413);
stem (abs(X));
title('混合频率正弦信号频谱');
x12=round(x/max(abs(x))*(2^11-1));%12bit量化
subplot(414);
stem(abs(X12));
title('量化后正弦信号频谱');

        同样的,由于FIR滤波器是数字滤波器,我们需要给仿真输入信号做12位量化。



图 4 中横坐标每点表示的频率是 100Hz, 可以看到输入信号包含 1000Hz、2500Hz 两个频率。  

        1.2.2 滤波器的实现与仿真

        MATLAB中滤波器的实现与仿真除了可以在simulink实现外,也可以调用filter函数实现。

%滤波器实现
y=filter(b12,1,x12);
figure;
subplot(311);
plot(x);
title('滤波前波形');
subplot(312);
plot(x1);
title('1000Hz正弦信号');
subplot(313);
plot(y);
title('滤波后波形');

%频谱分析
X1=fft(x1);
X=fft(x);
Y=fft(y);
figure;
subplot(311);
stem(abs(X1));
title('1000Hz正弦信号频谱');
subplot(312);
stem(abs(X));
title('滤波前频谱');
subplot(313);
stem(abs(Y));
title('滤波后频谱'); 

由图 6 可以看出当输入前 32 个数据时滤波器输出基本为零,这是因为这一阶段还没有把采样数据放入乘加单元,所以输出 y(n)基本为零。 由图 6 可以看出,
滤波器成功滤除频率为 2500Hz 的信号分量,而在 1000Hz 附近还存在噪声,所以不是理想的低通滤波器。


        这次就先写到这吧!下一篇将分享如何在Quartus II 实现滤波器的设计与仿真!


猜你喜欢

转载自blog.csdn.net/qq_36404252/article/details/72424969