首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用scipy fft计算信号的自相关与直接计算得到的结果不同

用scipy fft计算信号的自相关与直接计算得到的结果不同
EN

Stack Overflow用户
提问于 2017-12-17 07:08:19
回答 0查看 5.7K关注 0票数 5

我正在尝试使用自相关是功率谱的逆傅立叶变换的属性来计算信号的自相关。然而,当我使用scipy (或numpy) fft来做这件事,并与自相关函数的直接计算进行比较时,我得到了错误的答案,具体地说,fft版本在大延迟时间内稳定在一个小的负值,这显然是错误的。

下面是我的MWE和输出。我是不是用错了fft?

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as pl
from scipy.fftpack import fft, ifft


def autocorrelation(x) :
    xp = (x - np.average(x))/np.std(x)
    f = fft(xp)
    p = np.absolute(f)**2
    pi = ifft(p)
    return np.real(pi)[:len(xp)/2]/(len(xp))

def autocorrelation2(x):
    maxdelay = len(x)/5
    N = len(x)
    mean = np.average(x)
    var = np.var(x)
    xp = (x - mean)/np.sqrt(var)
    autocorrelation = np.zeros(maxdelay)
    for r in range(maxdelay):
        for k in range(N-r):
            autocorrelation[r] += xp[k]*xp[k+r]
        autocorrelation[r] /= float(N-r)
    return autocorrelation


def autocorrelation3(x):
    xp = (x - np.mean(x))/np.std(x)
    result = np.correlate(xp, xp, mode='full')
    return result[result.size/2:]/len(xp)

def main():
    t = np.linspace(0,20,1024)
    x = np.exp(-t**2)
    pl.plot(t[:200], autocorrelation(x)[:200],label='scipy fft')
    pl.plot(t[:200], autocorrelation2(x)[:200],label='direct autocorrelation')
    pl.plot(t[:200], autocorrelation3(x)[:200],label='numpy correlate')
    pl.legend()
    pl.show()


if __name__=='__main__':
    main()

EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47850760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档