对于两个正弦波,它们的相干性大小告诉我们什么,为什么周期图和 csd 命令会产生不正确的结果?

信息处理 功率谱密度 连贯性
2022-02-12 17:15:05

假设我有 2 秒以 1000 Hz 采样的数据,并且两个正弦曲线仅在幅度和相移上有所不同:

import numpy as np
from matplotlib import pyplot as plt
from scipy.signal import csd,periodogram

t = np.arange(0, 2, 0.001);
x = np.sin(2*np.pi*200*t)
y = 3*np.sin(2*np.pi*200*(t-np.pi/2))
fig,ax = plt.subplots()
ax.cohere(x, y)

得到的相干图如下所示。

在此处输入图像描述

Q1:我是否正确,相干性始终等于 1,并且频率轴实际上是从 0 到 500 Hz,即奈奎斯特频率?

Q2:对于简单的正弦曲线,相干性等于 1 是否意味着它们的幅度本质上不同,并且具有相同的频率和固定的相位差?

现在我尝试使用 x 和 y 的交叉谱密度以及它们各自的功率谱密度来计算相干性:

f,Pxx=periodogram(x)
f,Pyy=periodogram(y)
f,Pxy=csd(x,y)

Coh=np.zeros(len(f))
for i in range(len(f)):
    Coh[i]=abs(Pxy[i])**2/(Pxx[i]*Pyy[i])

fig,ax = plt.subplots()
ax.plot(f,Coh)

这导致了下图。

Q3:图表不应该相同吗?我错过了什么?

在此处输入图像描述

2个回答

csd我怀疑and之间有什么不同periodogram相反,如果我csd用于所有计算:

f,Pxx=csd(x , x )
f,Pyy=csd(y , y)
f,Pxy=csd(x , y)

Coh=np.zeros(len(f))
for i in range(len(f)):
    Coh[i]=abs(Pxy[i])**2/(abs(Pxx[i]*Pyy[i]))

fig,ax = plt.subplots()
ax.plot(f,Coh)

然后我得到下图,这似乎更接近您期望看到的。

仅使用 csd 计算的相干性

periodogram可能使用了一些对相干性计算没有帮助的平均值。默认情况下,它看起来csd不使用 averaging,但在调用计算periodogram时使用 averaging 。

您在这里尝试做的事情定义不明确。在大多数频率Pxx,PyyPxy基本上为零,所以相干性主要是00这是未定义的。

实际代码中发生的情况在很大程度上取决于估计器的实现方式(频谱泄漏、窗口化、跳点大小、缩放等)和良好的老式数值噪声。

在您的第二张图中,您的 Y 轴刻度似乎是1056这是一些严重的数值问题的有力指标。