Matlab FFT结果:属于功率谱密度还是振幅谱密度?
背景知识
FFT的原始振幅结果与信号长度L直接相关,若要得到与长度无关的频域结果,通常会使用功率谱密度(PSD)或振幅谱密度(ASD),计算公式如下:
- 原始FFT振幅:$Y$
- 信号长度:$L$
- 功率谱密度:$\text{PSD} = \frac{|Y|^2}{L}$
- 振幅谱密度:$\text{ASD} = \frac{|Y|}{\sqrt{L}}$
问题描述
Matlab官方示例中,对时长50s和500s的同构信号执行FFT后,得到的振幅结果几乎一致。代码中使用了P2 = abs(FFTcomplex)/L进行归一化,再对单侧谱(除直流和奈奎斯特频率)做2倍修正,但这个归一化公式和PSD、ASD的公式均不相同,为何仍能得到与信号长度无关的振幅?
示例代码
% Signal 1 sps = 1000; % 采样频率 T = 1/sps; % 采样周期 Frequency1 = 150; % 频率1 [Hz] SignalAmplitude1 = 1; % mm/s Frequency2 = 45; % 主频率 [Hz] SignalAmplitude2 = 1.2; % mm/s L = 50; % 信号时长,秒 L = L*1000; % 转换为毫秒 time = (0:L-1)*T; % 时间向量 Signal = cos(2*pi*Frequency1*time)*SignalAmplitude1 + sin(2*pi*Frequency2*time)*SignalAmplitude2; f = sps*(0:(L/2))/L; FFTcomplex = fft(Signal); P2 = abs(FFTcomplex)/L; P1 = P2(:,round(1:L/2+1)); P1(:,2:end-1) = 2*P1(:,2:end-1); Ampl_FFT_1 = P1; % Signal 2 sps = 1000; % 采样频率 T = 1/sps; % 采样周期 Frequency1 = 150; % 频率1 [Hz] SignalAmplitude1 = 1; % mm/s Frequency2 = 45; % 主频率 [Hz] SignalAmplitude2 = 1.2; % mm/s L = 500; % 信号时长,秒 L = L*1000; % 转换为毫秒 time = (0:L-1)*T; % 时间向量 Signal = cos(2*pi*Frequency1*time)*SignalAmplitude1 + sin(2*pi*Frequency2*time)*SignalAmplitude2; f = sps*(0:(L/2))/L; FFTcomplex = fft(Signal); P2 = abs(FFTcomplex)/L; P1 = P2(:,round(1:L/2+1)); P1(:,2:end-1) = 2*P1(:,2:end-1); Ampl_FFT_2 = P1; sum(Ampl_FFT_2)-sum(Ampl_FFT_1)
问题解析
1. 原始FFT的幅值特性
对于纯正弦信号 $x(t) = A\cos(2\pi ft)$,其N点FFT的双侧谱中,对应频率点的复数幅值为 $\frac{N \cdot A}{2}$。此时用abs(Y)/N归一化后,得到的是 $\frac{A}{2}$,再对单侧谱(除直流和奈奎斯特频率)乘以2,就直接还原了时域信号的真实振幅A——这个值仅由原始信号的振幅决定,和信号长度N无关。
2. 与PSD/ASD的本质区别
PSD和ASD的核心是描述信号功率/振幅在频域的密度分布,单位带有“每赫兹”的维度(例如PSD为$\text{mm}2/\text{s}2/\text{Hz}$,ASD为$\text{mm/s}/\sqrt{\text{Hz}}$),目的是让不同频率带宽下的谱特性具备可比性。而Matlab示例中的归一化逻辑,是还原时域信号的真实振幅,结果单位与原始信号一致(示例中为mm/s),和频率带宽无关,二者的设计目标完全不同。
3. 长度不影响结果的原因
无论信号长度是50s还是500s,原始信号的振幅A固定不变。FFT的幅值会随采样点数N线性增大(因为N越大,频域求和的累计值越高),因此除以N后刚好抵消了N的影响,再通过2倍修正还原单侧谱的振幅,最终结果自然与信号长度无关。
内容的提问来源于stack exchange,提问作者Daniele F.

