使用MATLAB设计FIR滤波器

时间:2018-06-22 20:34:16   收藏:0   阅读:6693

1.      采用fir1函数设计,fir1函数可以设计低通、带通、高通、带阻等多种类型的具有严格线性相位特性的FIR滤波器。语法形式:

b = fir1(n, wn)

b = fir1(n, wn, ‘ftype’)

b = fir1(n, wn, ‘ftype’, window)

b = fir1(n, wn, ‘ftype’, window, ‘noscale’)

参数的意义及作用:

示例:

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)‘);

subplot(423);stem(b_hpf);xlabel(‘n‘);ylabel(‘h(n)‘);

subplot(425);stem(b_bandpass);xlabel(‘n‘);ylabel(‘h(n)‘);

subplot(427);stem(b_stop);xlabel(‘n‘);ylabel(‘h(n)‘);

%绘制幅频响应曲线

subplot(422);plot(x_f,m_lpf(1:length(x_f)));xlabel(‘频率(Hz)‘,‘fontsize‘,8);ylabel(‘幅度(dB)‘,‘fontsize‘,8);

subplot(424);plot(x_f,m_hpf(1:length(x_f)));xlabel(‘频率(Hz)‘,‘fontsize‘,8);ylabel(‘幅度(dB)‘,‘fontsize‘,8);

subplot(426);plot(x_f,m_bandpass(1:length(x_f)));xlabel(‘频率(Hz)‘,‘fontsize‘,8);ylabel(‘幅度(dB)‘,‘fontsize‘,8);

subplot(428);plot(x_f,m_stop(1:length(x_f)));xlabel(‘频率(Hz)‘,‘fontsize‘,8);ylabel(‘幅度(dB)‘,‘fontsize‘,8);

技术分享图片

 

 

 

2.      采用fir2函数设计,函数算法是:首先根据要求的幅频响应向量形式进行插值,然后进行傅里叶变换得到理想滤波器的单位脉冲响应,最后利用窗函数对理想滤波器的单位脉冲响应激进型截断处理,由此得到FIR滤波器系数。fir2函数的语法形式:

b = fir2(n, f, m)

b = fir2(n, f, m, window)

b = fir2(n, f, m, npt)

b = fir2(n, f, m, npt, window)

b = fir2(n, f, m, npt, lap)

b = fir2(n, f, m, npt, lap, window)

各项参数的意义及作用:

示例:

N=120;                  %滤波器阶数

fc=[0 0.125 0.125 0.25 0.25 0.5 0.5 1];   %截止频率

mag=[1 1 0.5 0.5 0.25 0.25 0.125 0.125 ]; %理想滤波器幅度

b=fir2(N,fc,mag);      %设计海明窗滤波器

freqz(b);              %绘制频率响应曲线

技术分享图片

 

 

 

3.      采用kaiserord函数设计,凯塞窗具有可调参数选项,可根据相关算法,先选择过渡带、容限参数,并根据这些参数计算出凯塞窗的值,以及滤波器阶数,语法形式:

[n, wn, beta, filtype] = kaiserord(f, a, dev, fs)

各项参数的意义和作用:

 

4.      采用firpm函数设计,采用最大误差最小准则进行滤波器设计,语法形式:

b = firpm(n, f, a)

b = firpm(n, f, a,w)

b = firpm(n, f, a,’ftype’)

b = firpm(n, f, a, w, ‘ftype’)

[b, delta] = firpm(…)

各项参数的意义及作用:

 

示例:

       利用凯塞窗函数设计低通FIR滤波器,过渡带为1000~1500Hz,采样频率为8000Hz,通带容限最大为0.01,阻带容限最大为0.05.利用海明窗及firpm函数设计相同的低通滤波器,截止频率为1500Hz,滤波器阶数为凯塞窗函数求取的值。

fs=8000;         %采样频率

fc=[1000 1500];  %过渡带

mag=[1 0];       %窗函数的理想滤波器幅度

dev=[0.01 0.05]; %纹波

[n,wn,beta,ftype]=kaiserord(fc,mag,dev,fs);  %获取凯塞窗参数

fpm=[0 fc(1)*2/fs fc(2)*2/fs 1];  %firpm函数的频段向量

magpm=[1 1 0 0];                  %firpm函数的幅值向量

 

%设计凯塞窗及海明窗滤波器

h_kaiser=fir1(n,wn,ftype,kaiser(n+1,beta));

h_hamm=fir1(n,fc(2)*2/fs);

%设计最优滤波器

h_pm=firpm(n,fpm,magpm);

%求滤波器的幅频响应

m_kaiser=20*log(abs(fft(h_kaiser,1024)))/log(10);

m_hamm=20*log(abs(fft(h_hamm,1024)))/log(10);

m_pm=20*log(abs(fft(h_pm,1024)))/log(10);

 

%设置幅频响应的横坐标单位为Hz

x_f=[0:(fs/length(m_kaiser)):fs/2];

%只显示正频率部分的幅频响应

m1=m_kaiser(1:length(x_f));

m2=m_hamm(1:length(x_f));

m3=m_pm(1:length(x_f));

%绘制幅频响应曲线

plot(x_f,m1,‘-‘,x_f,m2,‘-.‘,x_f,m3,‘--‘);

xlabel(‘频率(Hz)‘);ylabel(‘幅度(dB)‘);

legend(‘凯塞窗‘,‘海明窗‘,‘最优滤波器‘);

grid;

 技术分享图片

 

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!