基本区分
- 振幅谱对应频率域的振幅
- 功率谱对应振幅的平方
- 幅度(dB)对应振幅平方的换算 【根据matlab
db2pow
帮助文档】
使用FFT计算振幅谱和功率谱(Matlab)
fs = 100;
t = 0:1/fs:2-1/fs;
x = cos(2*pi*20*t) + randn(length(t));
N = length(x);
if(mod(N, 2) == 1)
N = N - 1;
end
fft_x = fft(x, N);
fft_x = fft_x(1:N/2+1);
ampsp_x = (1/N) * abs(fft_x);
psd_x = (1/N) * abs(fft_x).^2;
ampsp_x(2:end-1) = 2 * ampsp_x(2:end-1);
psd_x(2:end-1) = 2 * psd_x(2:end-1);
注意事项
- FFT要求时间序列的长度为2的倍数
- 由于时间序列f(x)是离散信号,对应的傅里叶变换F(f)为周期信号,虽然长度相同,但F(f)包含两个周期(负频率部分和正频率部分),因此,我们只需要正频率部分即可
fft_x = fft_x(1:N/2+1);
- 由于F(f)包含两个周期,而我们仅取了一个周期,故要恢复准确的振幅和功率谱,需要对振幅(功率谱)乘以
2
;但零频率和奈奎斯特频率(fs/2)不会出现两次,故这两个频率对应的值不必乘以2
matlab计算功率谱密度(PSD)
1、对于平稳信号,可以使用FFT计算PSD(代码如上)
2、对于非平稳信号,可以使用如短时傅里叶变换、Multitaper spectral estimate等工具计算【matlab中pmtm
函数】
3、Multitaper spectral estimate对FFT的能量泄露进行了优化,能更准确稳定的求解功率谱(振幅谱直接开方即可)