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

时间:2014-05-11 13:39:06

标签: python numpy scale signal-processing fft

我正在尝试计算并绘制随机信号的功率谱密度(PSD)。 阅读np.fft.fft的{​​{3}},它提到如果A = fft(a)那么np.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?

我相信numpy doc可能会对此进行详细阐述。在Matlab中我知道你必须自己照顾它,但numpy的情况是什么?

2 个答案:

答案 0 :(得分:3)

哦,男人,"必要的分工"是一种痛苦,但你必须这样做。对于诸如功率谱密度之类的东西,在物理学和电气工程之间变化等等,定义很多。它们在不同的场之间变化很大,并且你必须自己计算出所需的前因子。值得庆幸的是,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轴时,对于python,零频率显示为A[0],对于matlab显示为A(1)

答案 1 :(得分:1)

scipy.signal.periodogram将以V ** 2 / Hz(假设您输入伏特)和以Hz为单位的箱子返回结果。