MATLAB实现巴特沃斯数字滤波器

MATLAB实现巴特沃斯数字滤波器

前因:因为要准备保研面试,今年暑假就重新把烂尾的项目捡起来了。
为了提取采集到的脑电信号中有用的部分,想用数字带通滤波器实现,浏览了很多帖子。要不是只有代码,没有注释;要不就是只有理论,没有代码。索性自己写一篇,方便回顾。

1. 用↓观察频谱

f=fftshift(fft(b));                  %b表示信号值data
w=linspace(-512/2,512/2,length(b));  %根据奈奎斯特采样定理,512/2为最大频率
plot(w,abs(f));                      %Hz为单位

MATLAB实现巴特沃斯数字滤波器_第1张图片

  • k、Hz等纵坐标如何判断(5.同理)

2. 频率转化

Fs=512
fp=0.5Hz - 50Hz
fs=0.25Hz - 55Hz

///////////////////////////////
*Q:↑为何如此取值
A:为防止频谱泄露,滤波器并非完全垂直截止,需过渡衰减

MATLAB实现巴特沃斯数字滤波器_第2张图片

回归正题,然后将单位为‘Hz’的模拟频率转化为单位为‘rad’的数字角频率
基础知识见本连接
(wp,ws分别为数字滤波器的通带、阻带截止频率的归一化值。要求:0≤wp≤1,0≤ws≤1。
1表示数字频率pi。)

Fs=512;
wp=[0.5*2*pi/Fs,50*2*pi/Fs];                %设置通带数字角频率
ws=[0.25*2*pi/Fs,55*2*pi/Fs];                %设置阻带数字角频率

再设置参数
Rp=1; %通带最大衰减
Rs=30; %阻带最小衰减

*为何如此取值见 ↓
MATLAB实现巴特沃斯数字滤波器_第3张图片

3. 巴特沃斯滤波器设计

[N,Wn]=buttord(wp,ws,Rp,Rs,'s');        %求巴特沃斯滤波器阶数N和截止频率Wn
%无论是高通、带通和带阻滤波器,在设计中最终都等效于一个截止频率为Wn的低通滤波器(我现在也不是很理解为啥是这样,毕竟我也是刚接触滤波器)
fprintf('巴特沃斯滤波器 N= %4d\n',N);    %显示滤波器阶数
[bb,ab]=butter(N,Wn,'s');               %求巴特沃斯滤波器系数,即求传输函数的分子和分母的系数向量
b2=filter(bb,ab,b);                     %filter既能进行IIR滤波又能进行FIR滤波
  • 分子分母系数如何排列

*阶数N越大,变化越剧烈
*Wn是指低频、高频信号功率降低至 最大值的0.707倍(-3dB)或0.5倍的点(-6dB),即上下限截止频率 ↓
MATLAB实现巴特沃斯数字滤波器_第4张图片

4. 观察滤波器频率响应

W=-600:0.1:600;                             %设置模拟频率
[Hb,wb]=freqz(bb,ab,W,Fs);                  %求巴特沃斯滤波器频率响应
plot(wb,20*log10(abs(Hb)),'b');             %作图
xlabel('Hz');
ylabel('幅值/dB');
  • 所画频谱不正确,未明白fft()和fftshift(fft())的区别

*值得一提的是
freqs(b,a,w)是针对模拟滤波器求频率响应,输入信号w的单位为rad/s
freqz()是针对数字滤波器,当freqz(…,N,Fs)时,输入信号w的单位为fs

附官方说明

5. 观察滤波后信号频谱

f=fft(b2);                            %b2是滤波后信号
w=linspace(-512/2,512/2,length(b2));  %根据奈奎斯特采样定理,512/2为最大频率
plot(w,abs(f));

最后
附上可以参考的实验
实验

你可能感兴趣的:(脑电)