计算白噪声的功率谱密度时出现无法解释的对称性
我正在尝试了解噪声、功率谱密度(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:
计算前的噪声时间特征
从时间特征计算出的自相关函数(我知道x轴的刻度是错的,但这对代码没有影响)
功率谱密度,虽然看起来很对称,但其实不应该是这样的
如果有人能帮我找出造成这种对称的原因,那将非常有帮助。我用简单的正弦波信号测试了代码,得到了预期的结果(没有对称现象)。
1 个回答
0
首先,你的函数写得不对,你是从自相关函数中取傅里叶变换,而不是从你最开始的信号数组中取。搞笑的是,由于舍入误差的特性,你会得到类似白噪声的功率谱密度(psd)。
其次,你计算频率轴的方式也错了,频率轴应该扩展到 N/(t*2)(这就是奈奎斯特频率)。而你现在的 freq_axis 数组长度是 N,所以你从信号数组中取了 N 个元素,因此你读取的是负频率的值,而这些负频率的功率谱密度和正频率的是一样的,这就导致了对称性(取对数会把你的变量变成实数,而所有负频率的傅里叶系数只是正频率的共轭)。
用下面的代码替换你的代码,可以得到一个非常好的结果:
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()
别忘了导入
import matplotlib.mlab as ml