基于FPGA的FIR滤波器的实现(1)—采用fir1函数设计

前言

在FPGA或其他硬件平台上按所需结构设计满足要求的FIR滤波器,关键在于设计出滤波器的单位脉冲响应,或者说是FIR滤波器各级延时单元的加权系数,这步便是在matlab中实现设计的,所以第一步要做的就是如何在matlab中设计出符合要求的滤波器的单位脉冲响应。本篇文章采用fir1函数设计滤波器相关参数。

一、函数功能

matlab中的fir1函数可以设计低通、带通、高通、带阻等类型的严格线性相位的FIR滤波器,fir1函数是采用了窗函数设计方法。
fir1函数的形式种类

b=fir1(n,wn)
b=fir1(n,wn,'ftype')
b=fir1(n,wn,'ftype',window)
b=fir1(...,'noscale')

各参数表达的意义如下

  1. b:返回的FIR滤波器单位脉冲响应,脉冲响应为偶对称,长度为n+1
  2. n:滤波器的阶数,设计出来的滤波器长度为n+1
  3. wn:滤波器的截止频率,wn的取值范围为0<wn<Fs/2(Fs为采样频率),
  4. ftype:确定设计的是低通(low)、高通(high)、带阻(stop)、带通滤波器(bandpass),当wn是一个数值,那么表示的就是截止频率为wn的低通或高通滤波器,取决于ftype的选择;当wn是两个数值,那么表示的就是带阻或带通滤波器;如果wn是由多个数组成的向量,则表示根据ftype的值设计多个通带或阻带范围的滤波器,ftype为DC-1,表示设计的第一个频带为通带,ftype为DC-0,表示设计的第一个频带为阻带
  5. window:指定使用的窗函数,默认为Hamming海明窗,还有常用的汉宁窗(Hanning)、布拉克曼窗(Blackman)、凯塞窗(Kaiser),可以在matlab中输入help window 命令查看各种窗函数的名称
  6. noscale:指定是否归一化滤波器的幅度

二、函数的简单案例

如要设计一个归一化截止频率为0.5,阶数为13的海明窗低通滤波器

b=fir1(13,0.5)
h=20*log(abs(fft(b)))/log(10)
plot(h)

即可获得滤波器的单位脉冲响应及滤波器的幅频响应图

三、采用fir1函数进行滤波器设计的案例

eg:采用海明窗,分别设计长度为41的低通(截止频率为200Hz)、高通(截止频率为200Hz)、带通(通带为200-400Hz)、带阻(阻带为200-400Hz的滤波器),采样频率为2000Hz,画出脉冲响应及幅频响应图

N=41;               %滤波器长度
fs=2000;            %采样频率

%各种滤波器的特征频率
fc_lpf=200;
fc_hpf=200;
fp_bandpass=[200 400];
fc_stop=[200 400];

%以采样频率的一半,对频率进行归一化处理
wn_lpf=fc_lpf*2/fs;
wn_hpf=fc_hpf*2/fs;
wn_bandpass=fp_bandpass*2/fs;
wn_stop=fc_stop*2/fs;

%采用fir1函数设计FIR滤波器
b_lpf=fir1(N-1,wn_lpf);
b_hpf=fir1(N-1,wn_hpf,'high');
b_bandpass=fir1(N-1,wn_bandpass,'bandpass');
b_stop=fir1(N-1,wn_stop,'stop');

%求滤波器的幅频响应
m_lpf=20*log(abs(fft(b_lpf)))/log(10);
m_hpf=20*log(abs(fft(b_hpf)))/log(10);
m_bandpass=20*log(abs(fft(b_bandpass)))/log(10);
m_stop=20*log(abs(fft(b_stop)))/log(10);

%设置幅频响应的横坐标单位为Hz
x_f=[0:(fs/length(m_lpf)):fs/2];

%绘制单位脉冲响应
subplot(421);
stem(b_lpf);xlabel('n');ylabel('h(n)');title('低通滤波器的单位脉冲响应');
subplot(423);
stem(b_hpf);xlabel('n');ylabel('h(n)');title('高通滤波器的单位脉冲响应');
subplot(425);
stem(b_bandpass);xlabel('n');ylabel('h(n)');title('带通滤波器的单位脉冲响应');
subplot(427);
stem(b_stop);xlabel('n');ylabel('h(n)');title('带阻滤波器的单位脉冲响应');

%绘制幅频响应曲线
subplot(422);
plot(x_f,m_lpf(1:length(x_f)));xlabel('频率(Hz)');ylabel('幅度(dB)');title('低通滤波器的幅频响应');
subplot(424);
plot(x_f,m_hpf(1:length(x_f)));xlabel('频率(Hz)');ylabel('幅度(dB)');title('高通滤波器的幅频响应');
subplot(426);
plot(x_f,m_bandpass(1:length(x_f)));xlabel('频率(Hz)');ylabel('幅度(dB)');title('带通滤波器的幅频响应');
subplot(428);
plot(x_f,m_stop(1:length(x_f)));xlabel('频率(Hz)');ylabel('幅度(dB)');title('带阻滤波器的幅频响应');

在这里插入图片描述

四、各种窗函数性能的比较

在这里插入图片描述
矩形窗的过渡带最窄,但其旁瓣峰值最高,阻带衰减最少,与汉宁窗相比,海明窗的过渡带与汉宁窗相同,但其旁瓣峰值更小,且阻带衰减更大,因此性能比汉宁窗更好;当凯塞窗函数的β取7.856时,与布莱克曼窗相比,表现出了更好的性能

eg:采用各种窗函数,分别设计截止频率为200Hz、采样频率为2000Hz的FIR低通滤波器,滤波器长度为81阶,并绘出各滤波器的幅度频率响应曲线

N=81;                   %滤波器长度
fs=2000;                %采样频率
fc=200;                 %低通滤波器的截止频率

%生成各种窗函数
w_rect=rectwin(N)';
w_hann=hann(N)';
w_hamm=hamming(N)';
w_blac=blackman(N)';
w_kais=kaiser(N,7.856)';

%采用fir1函数设计FIR滤波器
b_rect=fir1(N-1,fc*2/fs,w_rect);
b_hann=fir1(N-1,fc*2/fs,w_hann);
b_hamm=fir1(N-1,fc*2/fs,w_hamm);
b_blac=fir1(N-1,fc*2/fs,w_blac);
b_kais=fir1(N-1,fc*2/fs,w_kais);

%求滤波器的幅频响应
m_rect=20*log(abs(fft(b_rect,512)))/log(10);
m_hann=20*log(abs(fft(b_hann,512)))/log(10);
m_hamm=20*log(abs(fft(b_hamm,512)))/log(10);
m_blac=20*log(abs(fft(b_blac,512)))/log(10);
m_kais=20*log(abs(fft(b_kais,512)))/log(10);

%设置幅频响应的横坐标单位为Hz
x_f=[0:(fs/length(m_rect)):fs/2];
%只显示正频率部份的幅频响应
m1=m_rect(1:length(x_f));
m2=m_hann(1:length(x_f));
m3=m_hamm(1:length(x_f));
m4=m_blac(1:length(x_f));
m5=m_kais(1:length(x_f));

%绘制幅频响应曲线
plot(x_f,m1,'.',x_f,m2,'*',x_f,m3,'x',x_f,m4,'--',x_f,m5,'-');
xlabel('频率(Hz)');ylabel('幅度(dB)');
legend('矩形窗','汉宁窗','海明窗','布拉克曼窗','凯塞窗');
grid;

在这里插入图片描述
从仿真结果看,相同滤波器阶数情况下的凯塞窗函数有更好的性能,在设计的200Hz截止频率处,幅度衰减为-6.4dB,滤波器的3dB带宽实际约为184.3Hz

总结

本篇文章是FPGA设计FIR滤波器的第一部分文章,虽然matlab自带的Filter Design & Analysis可以使用图形化界面直接设计出滤波器来,但是往往有的时候使用代码编写滤波器可以更灵活的解决问题。

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值