【发布时间】:2014-03-06 00:12:00
【问题描述】:
我有两个信号,我预计其中一个会响应另一个信号,但会有一定的相移。
现在我想计算相干性或归一化交叉谱密度,以估计输入和输出之间是否存在因果关系,从而找出这种相干性出现在哪些频率上。
例如看这张图片(来自here),它似乎在频率 10 处具有高相干性:
现在我知道我可以使用互相关来计算两个信号的相移,但是如何使用相干性(频率为 10)来计算相移?
图片代码:
"""
Compute the coherence of two signals
"""
import numpy as np
import matplotlib.pyplot as plt
# make a little extra space between the subplots
plt.subplots_adjust(wspace=0.5)
nfft = 256
dt = 0.01
t = np.arange(0, 30, dt)
nse1 = np.random.randn(len(t)) # white noise 1
nse2 = np.random.randn(len(t)) # white noise 2
r = np.exp(-t/0.05)
cnse1 = np.convolve(nse1, r, mode='same')*dt # colored noise 1
cnse2 = np.convolve(nse2, r, mode='same')*dt # colored noise 2
# two signals with a coherent part and a random part
s1 = 0.01*np.sin(2*np.pi*10*t) + cnse1
s2 = 0.01*np.sin(2*np.pi*10*t) + cnse2
plt.subplot(211)
plt.plot(t, s1, 'b-', t, s2, 'g-')
plt.xlim(0,5)
plt.xlabel('time')
plt.ylabel('s1 and s2')
plt.grid(True)
plt.subplot(212)
cxy, f = plt.cohere(s1, s2, nfft, 1./dt)
plt.ylabel('coherence')
plt.show()
.
.
编辑:
对于它的价值,我已经添加了一个答案,也许是对的,也许是错的。我不确定..
【问题讨论】:
-
问题是您不知道如何根据相干性计算相移,还是您的代码不起作用?前者不是这里的主题问题。
-
我的问题是我不知道如何从相干计算相移。如果您能给我一些提示或建议如何做到这一点(编程或数学),我们将不胜感激
-
我不是 Python 程序员,但我很确定你不会。根据matplotlib.org/api/mlab_api.html 的文档,
plt.cohere计算由信号模量归一化的交叉谱密度的模平方,这就是为什么它是纯实值的。如果两个相同频率的正弦信号之间存在相移,则信号之间的互相关将是振荡的,并具有与之相关的相移,并且该相移在经过傅里叶变换后将保留,但随后被破坏通过取模数。 -
所以假设它只是在 en.wikipedia.org/wiki/Spectral_density#Cross-spectral_density 处对公式的绝对值进行离散化版本,你不会找到相移。有什么理由不能只对两个单独的信号进行 FFT 并使用从中获取的相位差吗?
-
为了澄清起见,当您说“一个响应另一个,但有一定的相移”时,您的意思是您期望两个信号相同(噪声除外) ,但两者之间有时间延迟?
标签: python matplotlib signal-processing cross-correlation spectral-density