从MATLAB中的信号中提取EEG成分

4
我有一个简单的EEG信号在MATLAB中,如下图所示。我想要根据以下表格提取EEG的组成部分。
  • Delta - 最高4赫兹;
  • Theta - 4 -> 8赫兹
  • Alpha - 8 -> 13赫兹
  • Beta - 13 -> 30赫兹
  • 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个回答

3

一个更简单的方法可能是仅对FFT进行操作,并将除了您感兴趣的特定频率范围之外的频率分量清零,然后进行逆FFT以返回到时域。

请记住,您必须将正频率和负频率清零,以保持频域中的信号关于0频率共轭对称。 如果不这样做,计算逆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中的频域有几个不同的范围:直流偏移(常数)是0频率;正频率范围是原始信号长度N的1到N/2条目;负频率范围是从N/2到N-1的条目;请注意,这不是笔误,最高频率(在N/2处)被复制,并且对于正负频率具有相同的值。(有些人使用fftshift以人类可能绘制的方式显示它,但那只是为了美观/理解。)
至于要删除哪些频率,你需要自己弄清楚,但我可以给你一个提示。最高频率(在频率位置N/2处)将对应于系统可表示的最高频率,即fs/2,其中fs是采样率。您可以按比例缩放以确定要否定哪些频率。
如果没有正确否定相应的负频率,则会在逆fft时得到虚数信号。

最后一点评论。这种方法只有在您提前拥有所有信号的情况下才能起作用,因为您需要在整个信号上使用DFT。如果您想实时执行此操作,则需要像以前一样创建某种过滤器。


嗨,Chris A.,谢谢你的回答!你能否在一个 MATLAB 代码片段中给我一些指导,告诉我如何“将特定范围以外的频率分量归零”?我对 FFT 和信号处理不太熟悉 :S - rflmota

1

如果滤波器在长度方面没有任何限制,请选择更锐利的边缘进行滤波。如果我是你,我会构建不同的滤波器(低通和高通),并在傅里叶变换中处理结果,以查看任何高频或低频是否与频率范围混合。 1)构建低通滤波器,提取δ波 2)为θ、α、β构建带通滤波器 3)构建高通滤波器,提取γ波。


嗨,Hephaestus,感谢你的回答!你所说的“滤波器边缘锐化”是什么意思?也许是降低阻带频率的值吗? - rflmota
1
你使用了 Fstop1 = 3;,但是你的信号范围是0到4 kHz。因此,在边缘处会丢失一些信号。我会选择3.98作为例子。这会使滤波器变得更大。然而,精度会更好,差异可能会很大。 - Hephaestus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接