FFT 的功率谱估计

信息处理 fft 自由度 功率谱密度
2022-02-01 02:19:35

我在 MATLAB 中绘制信号的 FFT 功率谱。我在此处的文本文件中上传了 8000 个样本时间序列信号: http ://wikisend.com/download/896484/signal.txt

我正在使用以下代码:

Fs = 500; % sampling frequency
L = length(y); %number of samples

complex = fft(y)/L; % complex signals
f = 0 : Fs/L : Fs/2; % frequency bins
amplitude = 2*abs(complex(1:L/2+1)); % amplitudes
pow = (amplitude).^2/2; % power

semilogy(f,pow,'-ro');
grid on;

我有以下情节: 在此处输入图像描述

令人困惑的是,在我工作的地方,他们正在使用他们自己修改过的 FFT 函数,如果我运行该代码,我会得到以下图:

在此处输入图像描述

如果您检查上图中的功率,我的代码和他们的代码之间的线性功率比为 16。对于其他测量,我得到的比率是 60、120 甚至 1。

如果有人可以为我绘制 FFT 并查看我的代码和绘图是否正确,我会感到困惑并需要帮助。

1个回答

不同之处在于功率谱的缩放。我想你会发现缩放的差异总是等于L/Fs,对于您问题中的数字,确实是8000/500=16.

查看Power Spectral Density Estimates Using FFT for the correct scaling。如果通过 FFT 长度对 FFT 结果进行归一化,则需要将归一化 FFT 的平方幅度缩放为L/Fs. 此外,您需要一个因素2如果你扔掉负频率(我看到你这样做了)。但是请注意,您不应该应用2对于 DC 和 Nyquist 的 bin,因为它们不是以负频率镜像的。

这是上面引用的 mathworks 页面中的一个简单的 Matlab 代码,用于使用 FFT 计算基于周期图的单边功率谱估计(我的评论):

Fs = 1000;% 采样频率 (Hz)
N = 长度(x);% 甚至!(=> bin N/2+1 是奈奎斯特)
xdft = fft(x);
xdft = xdft(1:N/2+1); % DC 至奈奎斯特(单面)
psdx = (1/(Fs*N)) * abs(xdft).^2; % 周期图缩放
psdx(2:end-1) = 2*psdx(2:end-1); 单面 PSD 的 % 缩放比例
                                    % 注:DC 和 Nyquist 没有因子 2