功率谱密度与傅立叶变换

信息处理 信号分析 傅里叶变换 功率谱密度 频谱估计
2022-02-03 02:07:44

我试图了解功率谱密度和傅里叶变换之间的区别。具体来说,我试图理解为什么功率谱密度有用以及在什么情况下有用。

例如,假设我有一些时间序列,我想更好地了解时间序列的频率内容。我可以进行傅里叶变换(例如 FFT),也可以计算功率谱密度。功率谱密度涉及开窗、计算每个窗口的自动功率和求和。它似乎比直接的 FFT 涉及更多的步骤。

下面是我写的一个 MATLAB 脚本来检查这个;

T = 1; %Length of time series in seconds
Fs = 1000; %sample frequency
dt = 1/Fs; %sample length
N = T/dt; %Number of time samples
t = (0:N-1)*dt; %Time vector
f = (0:N/2)*Fs/N; %Frequency vector

%Frequency content of the signal (three frequencies in Hz)
F1 = 200;  F2 = 400;  F3 = 350;
sigma = 3; %Standard deviation of the noise to be added

%Create time series
r = sin(2*pi*F1*t)+sin(2*pi*F2*t)+sin(2*pi*F3*t)+sigma*randn(1,N); %Time series

%Compute one-sided FFT
R = fft(r); %Fourier transform of time series
R2 = abs(R/N);
R1 = R2(1:N/2+1);
R1(2:end-1) = 2*R1(2:end-1);

%Compute power spectral density (autospectrum)
[pxx,fxx] = cpsd(r,r,bartlett(256),128,2048,Fs);

%Plot results
subplot(3,1,1)
plot(t,r,'-'); %Time Series
title('Time series');
xlabel('Time (s)');
ylabel('Amplitude');

subplot(3,1,2)
plot(f,R1,'-') %One-sided FFT amplitude spectrum
title('Fourier transform');
xlabel('Frequency (Hz)');
ylabel('Amplitude');
axis([0 Fs/2 0 1.1])

subplot(3,1,3)
plot(fxx,2*pi*pxx) %Autospectrum
title('Power Spectral Density')
xlabel('Frequency (Hz)')
ylabel('Power / Hz')

该脚本的输出如下图:

在此处输入图像描述

FFT 频谱和自功率频谱均在 200、350 和 400 Hz 处显示峰值,这很好,因为这是真实信号所包含的。但 FFT 中的峰值更为明显。那么我为什么要使用功率谱密度法呢?

谁能提供一个简单的例子,其中 FFT 无法显示正确的频谱但自动电源能够恢复它?

0个回答
没有发现任何回复~