python中的计算一致性

python中的计算一致性,python,signal-processing,fft,Python,Signal Processing,Fft,我正在学习跨光谱和连贯性。据我所知,相干性类似于相关性的模拟,通过单个功率谱的乘积对互谱进行归一化: 下面是我当前的python实现 import numpy def crossSpectrum(x,y): #-------------------Remove mean------------------- xp=x-numpy.mean(x) yp=y-numpy.mean(y) n=len(x) # Do FFT cfx=numpy.f

我正在学习跨光谱和连贯性。据我所知,相干性类似于相关性的模拟,通过单个功率谱的乘积对互谱进行归一化:

下面是我当前的python实现

import numpy

def crossSpectrum(x,y):

    #-------------------Remove mean-------------------
    xp=x-numpy.mean(x)
    yp=y-numpy.mean(y)
    n=len(x)

    # Do FFT
    cfx=numpy.fft.fft(xp)/n
    cfy=numpy.fft.fft(yp)/n
    freq=numpy.fft.fftfreq(n)

    # Get cross spectrum
    cross=cfx.conj()*cfy

    return cross,freq


#-------------Main---------------------------------
if __name__=='__main__':

    x=numpy.linspace(-250,250,500)
    noise=numpy.random.random(len(x))
    y=10*numpy.sin(2*numpy.pi*x/10.)+5*numpy.sin(2*numpy.pi*x/5.)+\
            2*numpy.sin(2*numpy.pi*x/20.)+10
    y+=noise*10
    y2=5*numpy.sin(2*numpy.pi*x/10.)+5+noise*50

    p11,freq=crossSpectrum(y,y)
    p22,freq=crossSpectrum(y2,y2)
    p12,freq=crossSpectrum(y,y2)

    # coherence
    coh=numpy.abs(p12)**2/p11.real/p22.real
    print coh
我计算的相干性是一个1的数组。我做错了什么

此外,有时相干图有向下的尖峰(如
scipy.signal.coherence
的输出),在其他指向上的地方(例如)。我对相干的解释有点困惑,较大的相干不应该意味着该频率下两个时间序列之间的协变性吗


提前感谢。

您应该使用welch方法。作为示例,随附的代码与您的代码类似(经过一些简化),并具有预期的结果

import numpy 
from matplotlib.pyplot import plot, show, figure, ylim, xlabel, ylabel
def crossSpectrum(x, y, nperseg=1000):

#-------------------Remove mean-------------------
cross = numpy.zeros(nperseg, dtype='complex128')
for ind in range(x.size / nperseg):

    xp = x[ind * nperseg: (ind + 1)*nperseg] 
    yp = y[ind * nperseg: (ind + 1)*nperseg] 
    xp = xp - numpy.mean(xp)
    yp = yp - numpy.mean(xp)

    # Do FFT
    cfx = numpy.fft.fft(xp)
    cfy = numpy.fft.fft(yp)

    # Get cross spectrum
    cross += cfx.conj()*cfy
freq=numpy.fft.fftfreq(nperseg)
return cross,freq

#-------------Main---------------------------------
if __name__=='__main__':

x=numpy.linspace(-2500,2500,50000)
noise=numpy.random.random(len(x))
y=10*numpy.sin(2*numpy.pi*x)
y2=5*numpy.sin(2*numpy.pi*x)+5+noise*50

p11,freq=crossSpectrum(y,y)
p22,freq=crossSpectrum(y2,y2)
p12,freq=crossSpectrum(y,y2)

# coherence
coh=numpy.abs(p12)**2/p11.real/p22.real
plot(freq[freq > 0], coh[freq > 0])
xlabel('Normalized frequency')
ylabel('Coherence')
和可视化