Scipy周期图术语混淆

时间:2014-03-11 22:54:22

标签: scipy signal-processing

我对scipy.signal.periodogram中使用的术语感到困惑,即:

缩放:{'density','spectrum'},可选         在计算功率谱密度('密度')之间进行选择         其中Pxx的单位为V * 2 / Hz,如果在V和计算中测量x         功率谱('频谱'),Pxx的单位为V * 2,如果x是         用V.测量默认为'密度'

(见:http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.periodogram.html

1)一些测试表明,选项“密度”的结果取决于信号和窗口长度以及采样频率(当信号长度增加时增长)。怎么会?我会说密度应该不依赖于这些东西。如果我采取更长的信号,我应该得到更准确的估计,而不是不同的结果。更不用说对窗口长度的依赖也是非常令人惊讶的。 结果在无限信号的极限上发散,这可能是能量的一个特征,但不是功率的特征。当长度增加时,周期图是否应该收敛到真正的理论PSD?如果,那么,我是否应该在signal.periodogram方法之外执行另一个归一化?

2)相反,我看到替代选项'频谱'给出了我以前称之为功率谱密度,也就是说,它给出了与窗口段和窗口长度无关的结果并且与理论计算一致。例如,对于Asin(2PIft),双侧溶液在-f和f处产生两个峰,每个峰的高度为0.25 * A ^ 2。

有很多关于这个主题的文献,但我得到的印象是,还有很多不兼容的术语,所以我要感谢任何澄清。直截了当的问题是如何解释这些选项及其单位。 (我习惯于看到标有“功率谱密度”的V ^ 2 / Hz。)

3 个答案:

答案 0 :(得分:1)

  1. scipy.signal.peridogram使用scipy.signal.welch函数(重叠0)。因此,缩放比例类似于韦氏函数,密度或光谱提供的缩放比例。
  2. 在密度缩放的情况下,幅度将随窗口长度而变化,因为窗口越长,频率分辨率越高,例如。 \ Delta_f较小。由于估计的密度是平均密度,\ Delta_f越小,平均中考虑的零能量就越少。
  3. 您已经提到频谱缩放是能量密度在频谱上的积分,以产生能量。因此,零值的积分不会影响最终值。

答案 1 :(得分:1)

让我们采用一个名为data的真实数组,该数组的长度为N,采样频率为fs。我们将时间箱dt = 1 / fs称为T = N * dt。在频域中,频率仓df = 1 / T = fs / N。

功率谱PS (在scipy.periodogram中为scaling ='spectrum')计算如下:

import numpy as np
import scipy.fft as fft
dft = fft.fft(data)
PS = np.abs(dft)**2 / N ** 2

它的单位为V ^ 2。可以理解为如下。与连续傅立叶变换类似,信号的能量E为:

E:= np.sum(data ** 2)* dt = 1 / N * np.sum(np.abs(dft)** 2)* dt

(根据Parseval定理)。信号的功率P是总能量E除以信号的持续时间T:

P:= E / T = 1 / N ** 2 * np.sum(np.abs(dft)** 2)

功率P仅取决于离散傅里叶变换(DFT)和样本数N。不直接取决于采样频率fs或信号持续时间T。因此,每个频道的功率即功率谱SP由上式给出:

PS = np.abs(dft)**2 / N ** 2

对于功率谱密度PSD (scipy.periodogram中的scaling ='density'),需要将PS除以DFT的频率段df:

PSD:= PS / df = PS * N * dt = PS * N / fs

因此:

PSD = np.abs(dft)**2 / N * dt

这具有V ^ 2 / Hz = V ^ 2 * s的单位,现在取决于采样频率。这样,在整个频率范围内对PSD进行积分可以得到与将PS的各个值相加相同的结果。

这应该说明您在更改窗口,采样频率,持续时间时看到的关系。

答案 2 :(得分:0)

    傅立叶变换实际上需要在无限的时间序列持续时间内产生有限的能量(例如衰减)。因此,如果只是通过“复制”使时间序列样本更长,则能量将无限长且持续时间无限。
  1. 我的主要困惑是scipy.signal.periodogram的“ spectrum”选项,即使时间序列变长,它似乎也会创建一个恒定的能谱。 通常,0.5 * A ^ 2 = S(f)* delta_f,其中S(f)是功率密度谱。 S(f)* delta_f,如果A为常数,则表示能量为常数。但是,当使用较长的时间序列时,基于FFT程序,delta_f(即增量频率)会相应降低。例如,100s的时间序列将导致delta_f = 0.01Hz,而1000s的时间序列将导致delta_f = 0.001Hz。表示密度的S(f)将相应地发生变化。