这是之前用到的几个简单的滤波器的程序,滤波器的设计比较简单。可以直接使用matlab里的FDA,导出滤波器系数即可。
再就是参考数字信号处理课本里面三种滤波器设计的方法,由过渡带和所选的窗函数推导出滤波器阶数,进一步根据firl和filter函数编写即可。
下面给出三种滤波器的简单代码:
低通:用的hanning窗
function [y]=fir_lpf(x,Fs,fs,fp)
%该函数采用hanning窗实现低通滤波
%x为输入信号,fs,为采样频率
%fs,fp分别为阻带截至频率和通带截至频率
%20150615 by boat
%求对应角频率
ws=fs*2*pi/Fs;
wp=fp*2*pi/Fs;
%求滤波器的最小阶数
B=ws-wp; %过渡带宽取二者中较小的
N=ceil(6.2*pi/B);
%计算滤波器系数
wc=(ws+wp)/2;
hn=fir1(N-1,wc,hanning(N));
y=filter(hn,1,x);
freqz(hn)
带通:这里用的布拉克曼窗
function [y]=fir_bpf(x,fs,fs2,fp2,fp1,fs1)
%该函数采用blackman窗实现带通滤波
%x为输入信号,fs,为采样频率
%fs2,fp2分别为阻带上截至频率和通带上截至频率
%fp1,fs1分别为通带下截止频率和阻带下截至频率
%ps:输入时以上四个滤波参数按从大到小输入即可
%20150615 by boat
%求对应角频率
ws2=fs2*2*pi/fs;
wp2=fp2*2*pi/fs;
wp1=fp1*2*pi/fs;
ws1=fs1*2*pi/fs;
%求滤波器的阶数
B=min(ws2-wp2,wp1-ws1); %求过渡带宽
N=ceil(12*pi/B);
%计算滤波器系数
wc2=(ws2+wp2)/2;
wc1=(ws1+wp1)/2;
wp=[wc1,wc2];
hn=fir1(N-1,wp,blackman(N));
y=filter(hn,1,x);
高通:这里用的凯泽窗
function [y]=fir_hpf(x,Fs,As,fp,fs)
%该函数采用kaiser窗设计高通滤波器
%输入:x 输入信号
% Fs 采样频率
% As 阻带最小衰减
% fp通带截止频率 fs阻带截止频率(单位Hz)
% 20150615 by boat
%设定各种参数
b=fp-fs; % 求取过渡带
M0=round((As-7.95)/(14.36*b/Fs))+2; % 计算窗长
M=M0+mod(M0+1,2); % 保证窗长为奇数
wp=2*fp/Fs*pi; ws=2*fs/Fs*pi;
wc=(wp+ws)/2; % 求截止频率
%求kaiser窗的系数beta的值
if As>50
beta=0.1102*(As-8.7);
elseif As>=21&&As<=50
beta=0.5842*(As-21)^0.4+0.07886*(As-21);
else
beta=0;
end
%设定滤波器参数
N=M-1; %设定滤波器阶数
hd=fir1(N,wc,’high’,kaiser(M,beta));
%滤波
x=x-mean(x); % 消除直流分量
y=filter(hd,1,x);