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浮点数,可选
时间序列 x 和 y 的采样频率。默认为 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
函数。如果它是一个函数,则它获取一个片段并返回一个去趋势片段。如果detrend
是 False,则不进行去趋势。默认为“常数”。- return_onesided布尔值,可选
如果为 True,则返回实数数据的单边频谱。如果为 False,则返回双边频谱。默认为 True,但是对于复杂数据,始终返回双边频谱。
- scaling{ ‘density’, ‘spectrum’ },可选
选择计算交叉功率谱密度(“密度”)其中Pxy的单位为V**2/Hz和计算交叉谱(“谱”)其中Pxy的单位为V**2,如果x和y用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()