在MATLAB中从Signal中提取EEG成分

时间:2011-05-05 17:39:56

标签: matlab signal-processing

我在MATLAB中有一个简单的EEG信号,如下图所示。我想要的是根据下表提取脑电图的组成部分。

  • Delta - 最高4 Hz;
  • Theta - 4 - > 8 Hz
  • Alpha - 8 - > 13 Hz
  • Beta - 13 - > 30 Hz
  • Gamma - 30 - > 100赫兹

在第一次尝试解决这个问题时,我尝试用MATLAB中的'fdatool'构建一个带通滤波器,以提取组件'theta'信号,但没有成功。

附上使用'fdatool'获得的过滤器的代码。

function Hd = filt_teta
%FILTROPARA TETA Returns a discrete-time filter object.

%
% M-File generated by MATLAB(R) 7.9 and the Signal Processing Toolbox 6.12.
%
% Generated on: 05-May-2011 16:41:40
%

% Butterworth Bandpass filter designed using FDESIGN.BANDPASS.

% All frequency values are in Hz.
Fs = 48000;  % Sampling Frequency

Fstop1 = 3;           % First Stopband Frequency
Fpass1 = 4;           % First Passband Frequency
Fpass2 = 7;           % Second Passband Frequency
Fstop2 = 8;           % Second Stopband Frequency
Astop1 = 80;          % First Stopband Attenuation (dB)
Apass  = 1;           % Passband Ripple (dB)
Astop2 = 80;          % Second Stopband Attenuation (dB)
match  = 'stopband';  % Band to match exactly

% Construct an FDESIGN object and call its BUTTER method.
h  = fdesign.bandpass(Fstop1, Fpass1, Fpass2, Fstop2, Astop1, Apass, ...
                      Astop2, Fs);
Hd = design(h, 'butter', 'MatchExactly', match);

有什么建议我可以解决这个问题吗?

感谢所有

2 个答案:

答案 0 :(得分:4)

一种更简单的方法可能是简单地将FFT和零输出除了您可能感兴趣的特定范围之外的频率分量,然后反向FFT以返回到时域。

Keep in mind that you'll have to zero out the positive frequency and negative frequency to maintain that the signal in the frequency domain is conjugate symmetric about the 0 frequency.如果你不这样做,你会在计算逆FFT时得到一个复杂的信号。

编辑: 例如,以下代码在时域中产生两个正弦曲线,相应的DFT(用FFT计算),然后去除其中一个峰值。

t = 0:0.01:0.999;
x = sin(t*2*pi*4) + cos(t*2*pi*8);
subplot(2,2,1);
plot(x)
title('time domain')
subplot(2,2,2);
xf = fft(x);
plot(abs(xf))
title('frequency domain');
subplot(2,2,3);
xf(9) = 0; xf(93) = 0;  % manual removal of the higher frequency
plot(abs(xf));
title('freq. domain (higher frequency removed)');
subplot(2,2,4);
plot(ifft(xf));
title('Time domain (with one frequency removed)')

有几点需要注意。 DFT中的频域具有几个不同的范围:DC偏移(常数),其为0频率;正频率范围,(对于长度为N的原始信号),条目从1到N / 2;负频率范围,是从N / 2到N-1的条目;注意,这不是拼写错误,最高频率(N / 2处的频率)是重复的,并且对于正频率和负频率都是相同的值。 (有些人使用fftshift来表明这一点,因为人类可能会将其绘制出来,但这只是为了看起来/理解。)

至于要删除的频率,你必须自己解决这个问题,但我可以给你一个提示。最高频率(频率位置N / 2)将对应于系统可表示的最高频率,即fs / 2,其中fs是您的采样率。您可以相应地缩放以找出哪些要否定。

如果你没有正确地否定相应的负频率,你会在逆fft时得到一个虚数信号。

最后一条评论。只有当您需要在整个信号上使用DFT时,才能提前获得所有信号,这种方法才有效。如果你想实时做这件事,你需要像以前一样创建某种过滤器。

答案 1 :(得分:1)

如果过滤器对其长度没有任何限制,请为过滤器选择更清晰的边缘。如果我在你的鞋子里,我将构建不同的滤波器(低通和高通)并在傅里叶变换中处理结果,以查看任何高频或低频与频率范围混合。 1)建立低通,提取delta 2)为theta alpha beta构建带通 3)构建高通滤波器,提取伽玛。