scipy.signal.

csd#

scipy.signal.csd(x, y, fs=1.0, window='hann', nperseg=None, noverlap=None, nfft=None, detrend='constant', return_onesided=True, scaling='density', axis=-1, average='mean')[源代码]#

利用 Welch 方法估计相互功率谱密度,Pxy。

参数:
x类型为数组的对象

测量值的时序

y类型为数组的对象

测量值的时序

fs浮点数,可选

时间序列 xy 的采样频率。默认为 1.0。

window字符串或元组或类数组,可选

要使用的目标窗口。如果 window 是字符串或元组,则将其传递给 get_window 以生成窗口值,默认情况下 DFT 偶对称。有关窗口和所需参数的列表,请参阅 get_window 。如果 window 类似数组,则直接用作窗口,其长度必须是 nperseg。默认为 Hann 窗口。

nperseg整数,可选

每个片段的长度。默认为无,但如果 window 为字符串或元组,则设置为 256,如果 window 为类似数组,则设置为窗口的长度。

noverlap: int, optional

重叠片段之间的点数。如果为 None,则 noverlap = nperseg // 2。默认为 None

nfft整数,可选

如果需要零填充 FFT,则使用 FFT 的长度。如果为 None,则 FFT 长度为 nperseg。默认为 None

detrend字符串或函数或 False,可选

指定如何对每个片段进行去趋势。如果 detrend 是字符串,则将其作为 type 参数传递给 detrend 函数。如果它是一个函数,则它获取一个片段并返回一个去趋势片段。如果 detrendFalse,则不进行去趋势。默认为“常数”。

return_onesided布尔值,可选

如果为 True,则返回实数数据的单边频谱。如果为 False,则返回双边频谱。默认为 True,但是对于复杂数据,始终返回双边频谱。

scaling{ ‘density’, ‘spectrum’ },可选

选择计算交叉功率谱密度(“密度”)其中Pxy的单位为V**2/Hz和计算交叉谱(“谱”)其中Pxy的单位为V**2,如果xy用V测量,fs用Hz测量。默认为“密度”

axisint,可选值

CSD对两个输入计算的轴;默认为最后一个轴(即axis=-1

average{ 'mean', 'median' },可选值

对周期图取平均时使用的方法。如果频谱是复数,则实部和虚部的平均值是分开计算的。默认为“平均值”。

从版本1.2.0中添加。

返回:
fndarray

采样频率的数组

Pxyndarray

x,y的交叉功率谱密度或交叉功率谱。

另请参见

periodogram

简单的,可选的修改周期图

lombscargle

用于不均匀采样数据的Lomb-Scargle周期图

welch

通过Welch方法计算功率谱密度。[等于 csd(x, x)]

coherence

通过Welch方法计算幅值平方相干性。

注意

按照惯例,Pxy使用X的共轭FFT乘以Y的FFT来计算。

如果输入序列长度不同,则较短的序列将会填充零以匹配。

适当的重叠量取决于窗口的选择和您的要求。对于默认的汉宁窗口,计算信号功率的重叠百分比为50%是合理的折衷,同时不能对任何数据进行多次计算。较窄的窗口可能需要更大的重叠。

有关频谱密度和(幅度)频谱的缩放讨论,请参阅Spectral Analysis部分,SciPy User Guide

从版本0.16.0中添加。

参考

[1]

P. Welch,“使用快速傅里叶变换估计功率谱:基于在短的修改周期图上进行时间平均的一种方法”,IEEE Trans. Audio Electroacoust。卷 15,第 70-73 页,1967 年。

[2]

Rabiner,Lawrence R.,和 B. Gold。“数字信号处理的理论与应用”Prentice-Hall,第 414-419 页,1975 年

示例

>>> import numpy as np
>>> from scipy import signal
>>> import matplotlib.pyplot as plt
>>> rng = np.random.default_rng()

生成具有某些共同特征的两个测试信号。

>>> fs = 10e3
>>> N = 1e5
>>> amp = 20
>>> freq = 1234.0
>>> noise_power = 0.001 * fs / 2
>>> time = np.arange(N) / fs
>>> b, a = signal.butter(2, 0.25, 'low')
>>> x = rng.normal(scale=np.sqrt(noise_power), size=time.shape)
>>> y = signal.lfilter(b, a, x)
>>> x += amp*np.sin(2*np.pi*freq*time)
>>> y += rng.normal(scale=0.1*np.sqrt(noise_power), size=time.shape)

计算并绘制交叉功率谱密度的幅度。

>>> f, Pxy = signal.csd(x, y, fs, nperseg=1024)
>>> plt.semilogy(f, np.abs(Pxy))
>>> plt.xlabel('frequency [Hz]')
>>> plt.ylabel('CSD [V**2/Hz]')
>>> plt.show()
../../_images/scipy-signal-csd-1.png