我需要使用给定的 PSD 生成随机数。为此,我找到了这个食谱。如果它在付费墙后面,现在它可以工作了:
给定您的功率谱与使用时间步长的时间序列生成的点,您定义
其中中均匀随机选择。的傅里叶变换。这里的想法是,由于 PSD 丢弃了相位信息,我们只需为变换生成随机相位,以获得生成 PSD 的时间序列的可能实现。
但是,为了确保所有得到的时间点都是真实的,作者给出了的条件,或者等价。
然而,当我实现这个时,我没有得到真正的信号,所以我似乎做错了什么。我马上看到了一个问题:对于,FFT 假定一个周期信号,因此满足条件的唯一方法是。然后您可以按如下方式生成其余阶段(在 python 中):
def gen_phase(N):
phase = np.zeros(N)
randoms = np.random.random(size=N/2)*2*np.pi
phase[1:N/2+1] = randoms
phase[N/2+1:] = np.flipud(-randoms)
return phase
另一个问题是不可能满足给定的条件是是偶数,据我所知。这实际上很痛苦,因为 fft 对于奇数来说非常慢(尤其是 ... 形式的)
有人可以建议我可能做错了什么吗?我得到的信号看起来或多或少是幅度的正确离子项,但它具有大致相等的实部和虚部,所以有些地方是错误的。其余的代码太简单了,我认为是罪魁祸首:
def main():
psd = read_psd()
N = len(psd)
phase = gen_phase(N)
h = 0.24e-6
A = np.sqrt(psd/(2*N*h)) * np.exp(1j*phase)
timeseries = np.fft.fft(A)
pl.plot(np.real(timeseries))
pl.show()
if __name__=='__main__':
main()
编辑:我误解了。因为取决于,所以我首先没有选择的自由,因为我无法控制幅度。有任何想法吗?