python中的功率谱 - 显着性水平

时间:2016-10-19 18:24:09

标签: python fft

有很多例子可以用python计算功率谱,例如: Plotting power spectrum in python

from __future__ import division
import numpy as np
import matplotlib.pyplot as plt

data = np.random.rand(301) - 0.5
ps = np.abs(np.fft.fft(data))**2

time_step = 1 / 30
freqs = np.fft.fftfreq(data.size, time_step)
idx = np.argsort(freqs)

plt.plot(freqs[idx], ps[idx])

但是如何计算功率谱的95%或99%显着性水平(零假设:白噪声)?我找到scipy.stats.chisquare,但是测试了分类数据具有给定频率的零假设。

1 个答案:

答案 0 :(得分:0)

我发现以下公式根据[1]和[2]中功率谱的所有谱峰的白色(或红色)噪声的零假设来计算显着性水平:

\frac{\chi^{2}_{\phi,\alpha}{\phi}

具有白色(或红色)噪声Sp_{T}的理论功率谱,显着性水平\alpha和自由度\phi。功率谱的频率为\alpha h = 0,1,... M n是数据点的数量

在Python中:

   import pylab as plt
   import numpy as np
   from scipy.stats import chi2

   ### 
   fft=np.fft.fft(data) ; n=len(fft)
   abs=np.absolute(fft)**2

   ## frequencies (30min resolution)
   f_u01=np.zeros(n/2+1,float)
   f_u01=np.linspace(0,1,num=(n/2.+1))/(30*60*2)  
   ### Variance of data as power spectrum of white noise
   var=N.var(data)
   ### degrees of freedom
   M=n/2
   phi=(2*(n-1)-M/2.)/M       
   ###values of chi-squared
   chi_val_99 = chi2.isf(q=0.01/2, df=phi) #/2 for two-sided test
   chi_val_95 = chi2.isf(q=0.05/2, df=phi)



   ### normalization of power spectrum with 1/n
   plt.figure(figsize=(5,5))
   plt.plot(fft[0:n/2],abs[0:n/2]/n, color='k')  
   plt.axhline(y=(var/n)*(chi_val_99/phi),color='0.4',linestyle='--')
   plt.axhline(y=(var/n)*(chi_val_95/phi),color='0.4',linestyle='--')

[1]:Schönwiese,C.-D。,Praktische Statistik,1985,公式(11-41)

[2]:Pankofsky,H.A。和Brier,G.W。,统计学在气象学中的一些应用。宾夕法尼亚州立大学,1958年