我在MATLAB中有一个简单的EEG信号,如下图所示。我想要的是根据下表提取脑电图的组成部分。
在第一次尝试解决这个问题时,我尝试用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);
有什么建议我可以解决这个问题吗?
感谢所有
答案 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)构建高通滤波器,提取伽玛。