我试图通过改变给定数组的Fourier系数的相位来生成一些随机的1d序列(r
)。我假设这两个序列(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级。根据文档,这与Nyquist频率相对应,如果数据大小为奇数,则差异不会消失。我不知道是什么造成了这种差异,也不知道如何生成一个具有相同振幅谱的实值阵列。在
提前谢谢。在
我认为}使用的假设下,您不应该改变它的相位:
rfft
的(单个)“Nyquist-bin”就是问题所在,在{当我修补最后一个rfft bin以保持原始相位时,图看起来不错
相关问题 更多 >
编程相关推荐