簡體   English   中英

使用Matlab查找復雜信號中的峰值頻率

[英]Finding peak frequency in a complex signal using Matlab

我試圖在指定范圍(25-140Hz)內找到兩個信號“ CA1”和“ PFC”的峰值頻率。

到目前為止,在Matlab中,我已經為每個信號繪制了FFT(參見下圖)。 這些FFT表示每個信號在25-140Hz之間的峰值頻率是不同的,但是我想對此進行量化(例如CA1峰值為80Hz,而PFC峰值為55Hz)。 但是,我認為FFT不夠平滑,因此當我嘗試提取峰值頻率時,由於我的代碼提取了很多值,因此沒有意義。 我只期望有幾個值-每次FFT峰值時一個值(大約2Hz,5Hz和〜60Hz)。

我想知道在25-140Hz之間,與“ PFC”相比,“ CA1”中的峰值頻率是多少。 “ 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

在此處輸入圖片說明

請幫忙!! 我如何從FFT計算“主要”峰值頻率,而忽略所有“次要”峰值(因為FFT未平滑)。

FFT假定信號沒有趨勢(這被稱為平穩信號),如果有,則將給出0Hz的主導頻率分量。 嘗試使用MATLAB函數detrend ,您會發現這解決了您的問題。

類似於以下內容:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM