Numpy 古怪的行为

Numpy 古怪的行为,numpy,scipy,fft,resampling,Numpy,Scipy,Fft,Resampling,我正在对一个真实信号进行重采样,因为我可以使用rfft中的fft,所以我想使用irfft(信号,新长度)。但我似乎无法让它工作 这是一个工作代码段,使用复fft对长度为4的信号进行重采样: from numpy.fft import fft,ifft p=array([1.,2.2,4.,1.]) pk=fft(p) pnew=ifft(pk,8)*(8./4.) 其中系数(8./4.)从原始长度重新调整为新长度。您可以检查pnew[::2]==p 现在,当我尝试用实傅里叶变换应用相同的策略时

我正在对一个真实信号进行重采样,因为我可以使用
rfft
中的fft,所以我想使用
irfft(信号,新长度)
。但我似乎无法让它工作

这是一个工作代码段,使用复fft对长度为4的信号进行重采样:

from numpy.fft import fft,ifft
p=array([1.,2.2,4.,1.])
pk=fft(p)
pnew=ifft(pk,8)*(8./4.)
其中系数
(8./4.)
从原始长度重新调整为新长度。您可以检查
pnew[::2]==p

现在,当我尝试用实傅里叶变换应用相同的策略时,我在原始点得到了错误的结果:

from numpy.fft import rfft,irfft
p=array([1.,2.2,4.,1.])
pk=rfft(p)
pnew=irfft(pk,8)*(8./4.)
我有
pnew[::2]=[1.45,1.75,4.45,0.55]=p


有人知道发生了什么事吗?我尝试过使用scipy的例程,得到了相同的结果。文档本身简要讨论了如何执行此操作,请参见页面底部的文档,您喜欢的文档内容如下:

In other words, irfft(rfft(a), len(a)) == a to within numerical accuracy.
如果执行
irfft(pk,8)
,则情况并非如此!这个问题是由于奇数样本和傅里叶变换的对称性以及填充。请注意,如果
len(p)
为奇数,则根本没有问题

为了更好地理解这一点:

>>> p = np.array([1.,2.2,4.,1.])
>>> np.fft.fft(p)
array([ 8.2+0.j , -3.0-1.2j,  1.8+0.j , -3.0+1.2j])
>>> np.fft.fftfreq(len(p))
array([ 0.  ,  0.25, -0.5 , -0.25]) # 0.5 only occurs once negative
>>> np.fft.rfft(p)
array([ 8.2+0.j , -3.0-1.2j,  1.8+0.j ])
>>> np.fft.rfftfreq(len(p)) # (not available in numpy 1.6.)
array([ 0.  ,  0.25,  0.5 ]) # 0.5 occurs, here positive, it does not matter

# also consider the odd length FFT
>>> np.fft.fftfreq(len(p)+1)
array([ 0. ,  0.2,  0.4, -0.4, -0.2]) # 0.4 is in there twice.

# And consider that this gives the result you expect:
>>> symmetric_p = np.fft.rfft(p)
>>> symmetric_p[-1] /= 2
>>> np.fft.irfft(symmetric_p, 8)[::2]*(8./4.)
array([ 1. ,  2.2,  4. ,  1. ])
这意味着如果你仔细观察。如果输入样本为偶数,则计算出的FFT频率不是对称的,而是存在额外的负频率(实际上也可以是正频率,因为它始终没有相移)

因为你正在填充(没有真正的原因?)到一个不同的频率,RFFT突然有了额外的“空间”来容纳这个频率。所以如果你从FFT的角度来看,你通常只加一次负频率,也加一次正频率(这基本上意味着它是双倍的)。如果在
symmetric\u p
上方查看,将此频率减半会得到带填充的预期结果(不带填充则不会得到预期结果)