numpy 中信号的 PSD 以及如何缩放它

use*_*478 3 python signal-processing numpy fft scale

我正在尝试计算并绘制随机信号的功率谱密度(PSD)。阅读的numpy 文档np.fft.fft,它提到 if A = fft(a)thennp.abs(A)是其幅度谱,np.abs(A)**2是其功率谱。

我的问题是,它是否负责对箱数等进行必要的划分(通常必须在 Matlab 中进行)以正确缩放?

例如,如果x我的原始信号以 V(伏特)为单位,我会这样做:

X = np.fft(x)
X = np.abs(X) #is that in Volts/Hz too? 
              #Do I have to divide by len(X) or anything else to scale it?
P = X**2      #is that in V^2/Hz? Do i have do do anything to scale it properly?
Run Code Online (Sandbox Code Playgroud)

我相信 numpy doc 可以对此进行更详细的阐述。在Matlab中我知道你必须自己处理它,但是在numpy中情况又如何呢?

Ram*_*hah 5

天哪,“必要的划分”是一种痛苦,但你必须这样做。对于诸如功率谱密度之类的东西,定义到处都是,在物理和电气工程之间有所不同,等等。它们在不同领域之间差异很大,您必须自己计算出所需的前置因子。值得庆幸的是,中使用的约定np.fft有详细的说明:

http://docs.scipy.org/doc/numpy/reference/routines.fft.html

之前,我自己在自己的(物理)应用程序中也需要大量研究 numpy FFT 的前置因素。值得庆幸的是,我可以证明这些文档是准确的。拿出一些铅笔和纸,祝你好运!

编辑:对于您询问 V / Hz 和 V^2 / Hz 的评论,答案肯定是否定的。只要看看单位就可以了。如果您有电压时间序列,其(离散)傅立叶变换仍然以伏特为单位。您必须粘贴时间步长等才能获得所需的尺寸。我经常首先尝试弄清楚如何从 numpy FFT 过渡到正式(积分)傅里叶变换,这通常在您正在从事的理论工作中定义。从那里开始通常会相对顺利。

编辑#2:对于后代来说,np.fft 和 matlab fft 是相同的,只是前者具有从零开始的索引,后者具有从一开始的索引。因此,如果您在 matlab 中实现了所需的行为,是的,只需按长度等进行除法,就可以了。请记住,在检索值或设置绘图的 x 轴时,对于A[0]python 和A(1)matlab,零频率会出现。