使用Matlab查找复杂信号中的峰值频率

时间:2015-06-09 13:35:09

标签: matlab fft frequency-analysis

我试图找到两个信号的峰值频率' CA1'和' PFC',在指定范围内(25-140Hz)。

在Matlab中,到目前为止,我为每个信号绘制了一个FFT(见下图)。这些FFT表明每个信号的25-140Hz之间的峰值频率是不同的,但我想量化这个(例如,CA1峰值在80Hz,而PFC峰值在55Hz)。但是,我认为FFT不够平滑,所以当我尝试提取峰值频率时,由于我的代码拉出了大量的值,因此它没有意义。我只期待一些值 - 每次FFT峰值(大约2Hz,5Hz和~60Hz)时都会有一个值。

我想知道,在25-140Hz之间,CA1'中的峰值频率是多少?与PFC'相比。 ' CA1'和' PFC'是记录的152401 x 7 EEG数据矩阵 来自7个独立的人。我想要每个数据集的MEAN峰值频率(即CA1和PFC的7个测试对象的平均值)。

到目前为止我的代码(基于Matlab的帮助文件和代码,我已经在线拼凑):

Fs = 508;

%notch filter
[b50,a50] = iirnotch(50/(Fs/2), (50/(Fs/2))/70);
CA1 = filtfilt(b50,a50,CA1);
PFC = filtfilt(b50,a50,PFC); 

%FFT
L = length(CA1); 

NFFT = 2^nextpow2(L);

%FFT for each of the 7 subjects
for i = 1:size(CA1,2);

    CA1_FFT(:,i) = fft(CA1(:,i),NFFT)/L;

    PFC_FFT(:,i) = fft(PFC(:,i),NFFT)/L;

end

%Average FFT across all 7 subjects - CA1
Mean_CA1_FFT = mean(CA1_FFT,2);
% Mean_CA1_FFT_abs = 2*abs(Mean_CA1_FFT(1:NFFT/2+1));

%Average FFT across all 7 subjects - PFC
Mean_PFC_FFT = mean(PFC_FFT,2);
% Mean_PFC_FFT_abs = 2*abs(Mean_PFC_FFT(1:NFFT/2+1));

f = Fs/2*linspace(0,1,NFFT/2+1);

%LEFT HAND SIDE FIGURE
plot(f,2*abs(Mean_CA1_FFT(1:NFFT/2+1)),'r');
set(gca,'ylim', [0 2]);
set(gca,'xlim', [0 200]);

[C,cInd] = sort(2*abs(Mean_CA1_FFT(1:NFFT/2+1)));
CFloor = 0.1; %CFloor is the minimum amplitude value (ignore small values)
Amplitudes_CA1 = C(C>=CFloor); %find all amplitudes above the CFloor
Frequencies_CA1 = f(cInd(1+end-numel(Amplitudes_CA1):end)); %frequency of the peaks

%RIGHT HAND SIDE FIGURE
figure;plot(f,2*abs(Mean_PFC_FFT(1:NFFT/2+1)),'r');
set(gca,'ylim', [0 2]);
set(gca,'xlim', [0 200]);

[P,pInd] = sort(2*abs(Mean_PFC_FFT(1:NFFT/2+1)));
PFloor = 0.1; %PFloor is the minimum amplitude value (ignore small values)
Amplitudes_PFC = P(P>=PFloor); %find all amplitudes above the PFloor
Frequencies_PFC = f(pInd(1+end-numel(Amplitudes_PFC):end)); %frequency of the peaks

enter image description here

请帮忙!!我如何计算主要'来自FFT的峰值频率,并忽略所有的“次要”和#39;峰值(因为FFT没有平滑)。

1 个答案:

答案 0 :(得分:2)

FFT假设信号没有趋势(这称为静止信号),如果确实如此,那么这将给出0Hz处的主频率分量。尝试使用MATLAB函数detrend,您可能会发现这可以解决您的问题。

有些事情:

x = x - mean(x)
y = detrend(x, 'constant')