matlab中的脑电带通滤波器

时间:2014-05-14 20:36:03

标签: matlab filtering signal-processing

我试图从采样率为500Hz的10分钟长的EEG信号中滤除θ范围(3-8 Hz)。这是我的代码。请帮我理解什么是错的。现在,过滤后的信号似乎已被破坏。非常感谢你!

fs=500;
Wp = [3 8]/(fs/2); Ws = [2.5 8.5]/(fs/2);
Rp = 3; Rs = 40;
[n,Wn] = buttord(Wp,Ws,Rp,Rs);
[b,a] = butter(n,Wn,'bandpass');
fdata = filter(b,a,data);
x=0:ts:((length(data)/fs)-ts);
f=-fs/2:fs/(length(data)-1):fs/2;
subplot(2,2,1)
plot(x,data)
subplot(2,2,2)
z1=abs(fftshift(fft(data)));
plot(f,z1)
xlim([0 150]);
subplot(2,2,3)
plot(x,fdata)
subplot(2,2,4)
z=abs(fftshift(fft(fdata)));
plot(f,z);
xlim([0 150]);

1 个答案:

答案 0 :(得分:4)

您的代码(第4行)给出了一个过滤器顺序n,等于37.我已经遇到了数值精度的问题,这些大订单的Butterworth过滤器;即使订单低至8.问题是butter为大订单提供了荒谬的ba值。检查您的ba向量,您会看到它们包含的值约为1e21(!)

解决方案是使用滤镜的零极点表示,而不是系数(ba)表示。您可以阅读有关此here的更多信息。特别是,

  

通常,您应该使用[z,p,k]语法来设计IIR过滤器。要分析或实施过滤器,您可以将[z,p,k]输出与zp2sos一起使用。如果使用[b,a]语法设计过滤器,则可能会遇到数值问题。这些问题是由于四舍五入的错误造成的。对于低至4的过滤器订单,可能会出现这种情况。

在您的情况下,您可以按以下方式继续:

[z, p, k] = butter(n,Wn,'bandpass');
[sos,g] = zp2sos(z,p,k);
filt = dfilt.df2sos(sos,g);
fdata = filter(filt,data)