FFT后如何获得特定频段的功率?

信息处理 matlab fft 频谱 频率 信号功率
2022-02-14 01:28:34

我需要有关我的 matlab 代码的帮助。我已经记录了脑电图数据,现在我想在 matlab 中对其进行分析。我想找到特定频率范围的平均功率(theta:4-8 Hz,alpha:8-12Hz 等)。为此,我执行了 fft。接下来,我使用 interp1 函数来查找特定频率范围内的幅度。但我不确定我是否做得正确......如果有人可以查看代码,那就太好了。

感谢您的帮助!

%p2 is the data in the time domain
% Variables

fftlength = 1024;                                % Set FFT length
stepsize = 32;                                   % Set step size
samples = fftlength:stepsize:length(p2);    % create an index array 
c = 1:fftlength;

%Specify hanning window

hanning = [1:fftlength]'; 
hanning_in = 2* pi() * (hanning - (fftlength+1)/2)/(fftlength+1);

%rescaled x-axis to match sample length?

hanning1 = (sin(hanning_in)./hanning_in).^2;    

f=[128/fftlength:128/fftlength:128];   % frequency index for the spectral
array

bp_p2=cell(1,1);

channel=1;

for kk = 1:length(samples) 

k = samples(kk);

spectrum = fft(p2(k-fftlength+1:k,:) .* hanning1)/fftlength; % apply window
to filtered data


spectrum2 =(sqrt(spectrum .* conj(spectrum)));  % get magnitude uV

% theta (4-8),alpha (8-12),beta low(12-16), beta high(16-25)

theta=mean(interp1(f,spectrum2(:,channel),[4:f:8]));
alpha=mean(interp1(f,spectrum2(:,channel),[8:f:12]));
betalow=mean(interp1(f,spectrum2(:,channel),[12:f:16]));
betahigh=mean(interp1(f,spectrum2(:,channel),[16:f:25])); 

%creating an array
%store all iteration loop outputs in a matrix

m(kk,:)=[theta alpha betalow betahigh];

end
1个回答

要获得跨箱的总功率,请将每个箱中的功率相加。如果你想要一个准确的结果,你还需要补偿你的窗口损失。

对于矩形窗口,每个 DFT bin 中的功率为:

P=Y[k]Y[k]N2=(|Y[k]|N)2

PdB=20Log10(|Y[k]|N)

一系列此类垃圾箱的总功率为:

Pk=Σk(|Y[k]|2)N2

窗口损失

当我们应用一个窗口时,相干增益和非相干增益会受到不同的影响。如果 N 个样本是相干的(例如完全包含在 bin 中的频率),则输出以 N 速率增长(直接求和)。如果 N 个样本是非连贯的(跨 bin 分布),则输出以N(有效值总和)。

如果我们只关心每个 bin 中的信号功率,我们将使用给出的相干增益

Gc=Σw[n]N

在哪里w[n]是窗口系数。(例如 Blackman(30) 窗口的相干增益为 0.406 或 -7.83 dB):

相干增益

同样,非相干样本在N. 非相干增益是指非相干样本(如白噪声)的 DFT 输出电平因窗函数而发生的变化。

归一化非相干增益是窗口权重的 rms 值,如下所示:

Gnc=Σw[n]2N

窗口的 SNR 变化或处理增益将是两者的比率,以 dB 为单位,这将是:

PG=20log10(GcGnc)

如果您只对信号功率电平感兴趣而不是信噪比,那么您只需补偿通过使用计算的功率Gc.

某些人可能会感到困惑,单个音调的功率如何受窗口的影响与如上所述均匀分布在多个音调上的信号中的功率不同。对此的直观解释是,对时域函数进行加窗会导致 FFT 中的每个 bin 具有超过一个 bin 的等效噪声带宽 (ENBW)。相比之下,矩形窗口的 ENBW 正好是一个 bin,因此当我们将频域中所有 bin 的功率相加时,Parseval 定理证明是正确的,因为该求和的总功率等于时域中的总功率信号。但是,如果我们使用矩形窗口以外的时间窗口,则更宽 ENBW 的影响意味着频率中的每个 bin 现在报告该 bin 加上相邻 bin 的功率。因此,在这种情况下,当我们对所有 bin 报告的功率求和时,总和将高估实际噪声功率。在单音或音调比 ENBW 更宽的情况下,当我们将结果按Wn在哪里W是窗口函数。(对于矩形窗口,此缩放结果为1/N)。