matlab可以使用fir1函数设计低通、高通、低通、带通等具有严格线性相位特性的滤波器。
fir1函数的几种语法如下:
b=fir1(n,wn);
b=fir1(n,wn,'ftype');
b=fir1(n,wn,'ftype',window)
b=fir1(...,'noscale')
各个参数的含义:
设计滤波器,采用汉明窗,长度41(阶数40),采样频率2000hz:
clear all; close all; clc;
% 滤波器长度
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(4,2,1);stem(b_lpf);xlabel('n');ylabel('h(n)');legend('lpf');
subplot(4,2,3);stem(b_hpf);xlabel('n');ylabel('h(n)');legend('hpf');
subplot(4,2,5);stem(b_bandpass);xlabel('n');ylabel('h(n)');legend('bandpass');
subplot(4,2,7);stem(b_stop);xlabel('n');ylabel('h(n)');legend('stop');
% 幅频响应
subplot(4,2,2);plot(x_f,m_lpf(1:length(x_f)));xlabel('频率(hz)');ylabel('幅度(db)','fontsize',8);legend('lpf')
subplot(4,2,4);plot(x_f,m_hpf(1:length(x_f)));xlabel('频率(hz)');ylabel('幅度(db)','fontsize',8);legend('hpf')
subplot(4,2,6);plot(x_f,m_bandpass(1:length(x_f)));xlabel('频率(hz)');ylabel('幅度(db)','fontsize',8);legend('bandpass')
subplot(4,2,8);plot(x_f,m_stop(1:length(x_f)));xlabel('频率(hz)');ylabel('幅度(db)','fontsize',8);legend('stop');
前面已经设计了低通,带通,高通的滤波器,根据参数设置得到了滤波器系数:
b_lpf、b_hpf、b_bandpass、b_stop
假设我们现在由原始数据xx,要对xx进行滤波,得到数据yy,在matlab应该怎么操作呢
就一句:
yy=filter(b_lpf,1,xx);