摘要:本文深入探讨了功率谱(Power Spectrum, PS)与功率谱密度(Power Spectral Density, PSD)的计算方法。首先介绍了直接利用离散傅里叶变换(DFT)或快速傅里叶变换(FFT)计算功率谱的原理,接着阐述了使用MATLAB中的periodogram函数计算功率谱和功率谱密度的过程。通过可调参数的正弦信号以及真实音频信号的实例分析,验证了功率谱与功率谱密度的相关性质,包括功率谱与DFT模平方的关系、功率谱各谱线之和与信号总功率的关系、PSD积分与信号总功率的关系,以及periodogram得到的等效噪声功率谱密度(ENPSD)与功率谱之间的差异。
关键词:功率谱;功率谱密度;DFT;FFT;periodogram
在信号处理领域,功率谱和功率谱密度是描述信号频率特性的重要工具。功率谱反映了信号功率在不同频率上的分布情况,而功率谱密度则进一步考虑了频率分辨率的影响,提供了更精确的功率分布描述。本文旨在研究如何通过DFT和periodogram方法计算功率谱和功率谱密度,并通过实例分析验证相关性质。

编辑

编辑
直接利用DFT计算功率谱的步骤如下:


MATLAB中的periodogram函数可以用于估计信号的功率谱和功率谱密度。其基本原理是对信号进行分段加窗处理,然后计算每段信号的DFT,最后对各段结果进行平均。periodogram函数可以直接给出功率谱密度估计,同时也可以通过简单的转换得到功率谱。
设 x(n) 是长度为 N 的离散时间信号,periodogram函数计算的功率谱密度估计 S^(f) 可以通过以下步骤得到:
periodogram函数得到的功率谱密度实际上是等效噪声功率谱密度(ENPSD),它与功率谱之间相差一个因子 1/T,其中 T=NΔt 是信号的总持续时间,Δt 是采样间隔,频率分辨率 Δf=T1。

编辑
选择一段真实音频信号作为研究对象,对其进行采样得到离散时间信号。
本文研究了基于DFT和periodogram的功率谱和功率谱密度计算方法。通过理论分析和实例验证,得出以下结论:

编辑

编辑

编辑

编辑
部分代码:
function myPlotDFT_PS_PSD(x, Fs)
N = length(x); t = (0:N-1)/Fs; T = N/Fs;
% My DFT [X, f] = myGetDFT(x, Fs); % Periodogram Power Spectrum [px, fpx] = periodogram(x, [], N, Fs, 'centered', 'power'); % Periodogram ENPSD [psdx, fpsdx] = periodogram(x, [], N, Fs, 'centered', 'psd'); delta_fpsdx = mean(diff(fpsdx));
subplot(2,2,1);plot(t,x,'.-');xlabel('Time (s)'); title(['N = ' num2str(N) ' Fs = ' num2str(Fs) ' Hz']); text(0.98, 0.95, ['T = ' num2str(T) ' s'], 'Units', 'normalized', 'HorizontalAlignment', 'right'); text(0.98, 0.875, ['Power = ' num2str(mean(abs(x).^2))], 'Units', 'normalized', 'HorizontalAlignment', 'right');
subplot(2,2,2);stem(f,abs(X).^2,'.-');xlabel('Frequency (Hz)'); title('|DFT|^2'); text(0.98, 0.95, ['Max Strength = ' num2str(max(abs(X).^2))], 'Units', 'normalized', 'HorizontalAlignment', 'right'); text(0.98, 0.875, ['Sum = ' num2str(sum(abs(X).^2))], 'Units', 'normalized', 'HorizontalAlignment', 'right');
subplot(2,2,3);stem(fpx, px,'.-');xlabel('Frequency (Hz)'); title('Power Spectrum'); text(0.98, 0.95, ['Max Strength = ' num2str(max(px))], 'Units', 'normalized', 'HorizontalAlignment', 'right'); text(0.98, 0.875, ['Sum = ' num2str(sum(px))], 'Units', 'normalized', 'HorizontalAlignment', 'right');
subplot(2,2,4);stairs(fpsdx-0.5*delta_fpsdx, psdx);xlabel('Frequency (Hz)'); title('ENPSD'); text(0.98, 0.95, ['Max Value = ' num2str(max(psdx))], 'Units', 'normalized', 'HorizontalAlignment', 'right'); text(0.98, 0.875, ['Integral = ' num2str(sum(psdx)*delta_fpsdx)], 'Units', 'normalized', 'HorizontalAlignment', 'right');
end
文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。(文章内容仅供参考,具体效果以运行结果为准)
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删