我想生成一个具有规定光谱形状的随机时间序列。为此,我将从适当的光谱分布中绘制随机复数傅里叶系数,然后将频率转换为时域。
要生成实时序列,傅立叶频谱必须具有实际的DC和奈奎斯特系数,并具有对称的负频率。
当我这样做时,我会从numpy的ifft
与irfft
的行为中获得不同的行为。
例如,这里有32个白色光谱样本:
import numpy as np
Nsamp = 2**5
Nfreq = (Nsamp-1)//2 # num pos freq bins not including DC or Nyquist
DC = 0.
f_pos = np.random.randn(Nfreq) + 1j*np.random.randn(Nfreq)
Nyquist = np.random.randn() # this is real
f_neg = f_pos[::-1] # mirror pos freqs
f_tot = np.hstack((DC, f_pos, Nyquist, f_neg))
f_rep = np.hstack((DC, f_pos, Nyquist))
t1 = np.fft.ifft(f_tot)
t2 = np.fft.irfft(f_rep)
print(t1)
print(t2)
我希望t1
都是真实的,t1
和t2
同意(在机器精度范围内)。两者都不是。
我正确使用ifft
吗?查看np.fft.fftfreq(Nsamp)
输出的频率,让我觉得我正确地构建f_tot
输入。
irfft
是正确的结果,所以我会使用它......但我想知道如何使用ifft
来构建未来。
A[0]
包含零频率项(信号之和),对于实际输入,它总是纯粹实际的。然后A[1:n/2]
包含正频率项,A[n/2+1:]
包含负频率项,按负频率递减。对于偶数个输入点,A[n/2]
表示正和负奈奎斯特频率,对于实际输入也是纯粹的。