低通,带通,高通滤波器的设计

转载链接:https://blog.csdn.net/u010451580/article/details/51460331

这是之前用到的几个简单的滤波器的程序,滤波器的设计比较简单。可以直接使用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); 

猜你喜欢

转载自blog.csdn.net/Jum_Summer/article/details/81253378