计算白噪声功率谱密度时的不明原因对称性

时间:2014-06-19 11:09:44

标签: python signals symmetric

我试图了解更多有关噪音,功率谱拒绝(PSD)和统计差异的信息。关于这一点,我试图计算白噪声的功率谱密度,然而,当我这样做时,我得到一个非常奇怪的对称性。我的频谱似乎围绕中心频率值对称,这显然是不正确的。我对使用自相关和功率谱密度感到陌生,所以如果有人能帮助我向错误方向推动我,我会很感激。

计算PSD的代码:

import numpy as np 
from math import sin, pi, log10
from allan_noise import white,pink,brown, violet
import acor
import numpy as np


#METHOD ONE: AUTOCORRELATION FUNCTION METHOD
def psd1(time_dats):
    #auto_corr = acor.function(time_dats)
    auto_corr = np.correlate(time_dats,time_dats,mode="same")

    #To check autocorrelation
    for i in range(len(auto_corr)):
        print i*.0000001 ,auto_corr[i]

    return fft(auto_corr) 

#DEFINE VARIABLES
t = .0001       #simulation time
N = 100000  #number of data points 
dt = t/N    #time interval between data points

#CREATE SIGNAL
sig = white(N)
df = 1.0/(t)
freq_axis = np.arange(0,N/t,df)

spec = psd1(sig)

#OPEN UP OUTPUT FILE
f = open('data/psdtest_f','w')
g = open('data/psdtest_t','w')

#PRINT OUT DATA
for i in range(N):
    f.write('%g %g\n' %(freq_axis[i],log10(abs(spec[i]))))
    g.write('%g %g\n' %(i*dt, sig[i]))

使用此代码,我会生成以下图表,可在此处https://drive.google.com/#folders/0B8BdiIhqTYw7Vk1EaDFMQW84RHM访问:

  1. 计算前噪音的时间曲线

  2. 根据时间曲线计算出的自相关函数(我知道x轴刻度是错误的,但是对任何其他地方的代码都没有贡献

  3. Power Spectral Denisty,虽然不应该是美丽的对称

  4. 任何人都可以提供任何有关导致这种对称性的帮助将是最有帮助的。我用简单的sin波信号测试了代码,得到了预期的结果(没有对称性)

1 个答案:

答案 0 :(得分:0)

首先,您的函数写错了,您从autocorr获取fft,这不是您的初始信号数组。有趣的是,由于舍入错误的性质,你也会得到像psd一样的白噪声。 其次,你计算频率轴是错误的,因为它们应该扩展到N /(t * 2)(这是Nyquist fr。)。相反,由于你的freq_axis数组长度是N,你可以从你的sig数组中检索N个元素,因此你只需要读取具有相同psd的负频率,这会导致对称性(将日志转换为变量为真实和所有傅里叶负频率的系数只是正数的共轭。 用下面的代码替换你的代码给出了一个非常好的结果:

sig = white(N,1,N/t)
(siglog,freq_axis)=ml.psd(sig,N,(N/t), detrend=ml.detrend_none,
   window=ml.window_hanning, noverlap=0, pad_to=None,
    sides='default', scale_by_freq=None)
plt.plot(freq_axis,np.log10(siglog))
plt.show()

matplotlib.mlab.psd result

不要忘记导入

import matplotlib.mlab as ml