我的MWE低于输出.我使用fft错了吗?
import numpy as npimport matplotlib.pyplot as plfrom scipy.fftpack import fft,ifftdef 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 autocorrelationdef 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()解决方法 离散FT假定信号是周期性的.因此,在基于fft的代码中,您正在计算环绕自相关.为了避免这种情况,你必须做一些0-padding形式:
def autocorrelation(x): xp = ifftshift((x - np.average(x))/np.std(x)) n,= xp.shape xp = np.r_[xp[:n//2],np.zeros_like(xp),xp[n//2:]] f = fft(xp) p = np.absolute(f)**2 pi = ifft(p) return np.real(pi)[:n//2]/(np.arange(n//2)[::-1]+n//2)总结
以上是内存溢出为你收集整理的python – 使用scipy fft计算信号的自相关性可以得到直接计算的不同答案全部内容,希望文章能够帮你解决python – 使用scipy fft计算信号的自相关性可以得到直接计算的不同答案所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)