我试图通过改变给定数组(r
)的傅立叶系数的相位来生成一些随机1d序列(y
)。我假设这两个序列(y
和r
)的幅度谱在这样做后不会发生变化,如果我使用numpy.fft.fft()
,他们确实不会这样做,就像这样:
import numpy as np
import numpy.fft as fft
n=512
x=np.linspace(0,10*np.pi,n)
y=np.sin(x)+2*np.sin(2*x)+2*np.sin(5*x)
#-------------Get Fourier coefficients-------------
cf1=fft.fft(y)
amp1=np.abs(cf1)
theta1=np.angle(cf1)
#-Randomly alter phase keeping amplitude unchanged-
theta2=np.random.normal(0,1.,size=theta1.shape)+theta1
cf2=amp1*np.cos(theta2)+1j*amp1*np.sin(theta2)
#-----------------------IFFT-----------------------
y2=fft.ifft(cf2)
#------------Compare amplitude spectrum------------
cf3=fft.fft(y2)
amp2=np.abs(cf3)
import matplotlib.pyplot as plt
figure=plt.figure()
ax=figure.add_subplot(111)
ax.plot(amp1-amp2,'k-')
plt.show(block=False)
得到的图是1e-13的随机序列。所以实际上没有改变。
但我对生成随机实际数据而非复杂感兴趣。改为使用numpy.fft.rfft()
和numpy.fft.irfft()
,幅度在所有频率上都是一致的,但是最后一个(amp1[-1]
和amp2[-1]
),差异大约是0.1。根据文档,这对应于奈奎斯特频率,如果数据大小是奇数,则差异不会消失。我不明白造成差异的原因或我应该如何生成具有相同幅度谱的实值阵列。
提前致谢。
答案 0 :(得分:2)
我认为(单曲)" Nyquist bin" rfft
的问题是问题,看起来你不应该在rfft
使用的假设下改变它的阶段:
当我修补最后一个rfft bin以保持原始阶段时,当输入纯粹为真时,其变换为Hermitian,即频率为f_k的分量是频率为-f_k的分量的复共轭,这意味着对于实数输入,负频率分量中没有信息尚未从正频率组件中获得。 rfft函数族设计用于实际输入,并通过仅计算正频率分量(包括奈奎斯特频率)来利用这种对称性。因此,n个输入点产生n / 2 + 1个复数输出点。该族的反转假定其输入具有相同的对称性,并且对于n个点的输出使用n / 2 + 1个输入点。
情节看起来很好
cf1=fft.rfft(y)
amp1=np.abs(cf1)
theta1=np.angle(cf1)
tlast=theta1[-1] # quick patch, save last (Nyquist) phase
#-Randomly alter phase keeping amplitude unchanged-
theta2=np.random.normal(0,1.,size=theta1.shape)+theta1
theta2[-1] = tlast # restore Nyquist bin original phase
cf2=amp1*np.cos(theta2)+1j*amp1*np.sin(theta2)