2010-11-16 73 views
1

亲爱的全部 我正在寻找一种numpy/scipy函数来计算双向相干性和自动双相干性,研究三波相互作用。 谢谢所有可能的帮助 尼古拉函数计算双相干

回答

1

也许这Matlab toolbox将帮助;通常,将Matlab转换为Python非常容易。

3

这在Python土地最佳的解决方案是http://pypi.python.org/pypi/nitime

它有几个相干估计,但我并没有在那些非常仔细。它是一个神经影像学软件包,但是算法只是故意使用numpy和scipy,所以它可以被其他应用程序使用。

1

这是一个依赖于scipy.spectrogram函数(scipy version> 0.17)并计算两个信号之间的双相干函数。从2001年Hagihira和林2007。参见Wikipedia-bicoherence

希望

定义有所帮助。

问候,

def compute_bicoherence(s1, s2, rate, nperseg=1024, noverlap=512): 
    """ Compute the bicoherence between two signals of the same lengths s1 and s2 
    using the function scipy.signal.spectrogram 
    """ 
    from scipy import signal 
    import numpy 
    # compute the stft 
    f1, t1, spec_s1 = signal.spectrogram(s1, fs = rate, nperseg = nperseg, noverlap = noverlap, mode = 'complex',) 
    f2, t2, spec_s2 = signal.spectrogram(s2, fs = rate, nperseg = nperseg, noverlap = noverlap, mode = 'complex') 

    # transpose (f, t) -> (t, f) 
    spec_s1 = numpy.transpose(spec_s1, [1, 0]) 
    spec_s2 = numpy.transpose(spec_s2, [1, 0]) 

    # compute the bicoherence 
    arg = numpy.arange(f1.size/2) 
    sumarg = arg[:, None] + arg[None, :] 
    num = numpy.abs(
     numpy.mean(spec_s1[:, arg, None] * spec_s1[:, None, arg] * numpy.conjugate(spec_s2[:, sumarg]), 
     axis = 0) 
     ) ** 2 
    denum = numpy.mean(
     numpy.abs(spec_s1[:, arg, None] * spec_s1[:, None, arg]) ** 2, axis = 0) * numpy.mean(
      numpy.abs(numpy.conjugate(spec_s2[:, sumarg])) ** 2, 
      axis = 0) 
    bicoh = num/denum 
    return f1[arg], bicoh 

# exemple of use and display 
freqs, bicoh = compute_bicoherence(s1, s2, rate) 
f = plt.figure(figsize = (9, 9)) 
plt.pcolormesh(freqs, freqs, bicoh, 
    # cmap = 'inferno' 
    ) 
plt.colorbar() 
plt.clim(0, 0.5) 
plt.show()