计算白噪声的功率谱密度时出现无法解释的对称性

0 投票
1 回答
783 浏览
提问于 2025-04-18 10:21

我正在尝试了解噪声、功率谱密度(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. 功率谱密度,虽然看起来很对称,但其实不应该是这样的

如果有人能帮我找出造成这种对称的原因,那将非常有帮助。我用简单的正弦波信号测试了代码,得到了预期的结果(没有对称现象)。

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()

matplotlib.mlab.psd 结果

别忘了导入

import matplotlib.mlab as ml

撰写回答