Python 以不同的分辨率获取输出ifft

Python 以不同的分辨率获取输出ifft,python,scipy,fft,fftpack,Python,Scipy,Fft,Fftpack,我试图使用scipy.fftp在python中平滑和插入一些周期性数据。我已经设法对数据进行fft,去除wn以上的高阶频率(通过执行myfft[wn:-wn]=0),然后使用ifft(myfft)重建数据的“平滑”版本。ifft创建的阵列具有与原始数据相同的点数。如何使用该fft创建具有更多点的阵列 x = [i*2*np.pi/360 for i in range(0,360,30)] data = np.sin(x) #get fft myfft = fftp.fft(data) #kill

我试图使用scipy.fftp在python中平滑和插入一些周期性数据。我已经设法对数据进行fft,去除wn以上的高阶频率(通过执行myfft[wn:-wn]=0),然后使用ifft(myfft)重建数据的“平滑”版本。ifft创建的阵列具有与原始数据相同的点数。如何使用该fft创建具有更多点的阵列

x = [i*2*np.pi/360 for i in range(0,360,30)]
data = np.sin(x)
#get fft
myfft = fftp.fft(data)
#kill feqs above wn
myfft[wn:-wn] = 0
#make new series
newdata = fftp.ifft(myfft)
我还能够以这里演示的相同分辨率手动重新创建该系列

但是当我尝试提高x值数组的分辨率时,它也没有给我正确的答案

提前谢谢


Niall

np.fft.fft返回的结果是直流分量位于位置0,然后是所有正频率,然后是奈奎斯特频率(仅当元素数为偶数时),然后是负频率,顺序相反。因此,要增加更多分辨率,可以在奈奎斯特频率的两侧添加零:

import numpy as np
import matplotlib.pyplot as plt

y = np.sin(np.linspace(0, 2*np.pi, 32, endpoint=False))

f = np.fft.fft(y)
n = len(f)
f_ = np.concatenate((f[0:(n+1)//2],
                     np.zeros(n//2),
                     [] if n%2 != 0 else f[(n+1)//2:(n+3)//2],
                     np.zeros(n//2),
                     f[(n+3)//2:]))
y_ = np.fft.ifft(f_)
plt.plot(y, 'ro')
plt.plot(y_, 'bo')
plt.show()

感谢Jaime的回复,唯一的问题是振幅会发生变化,我想保留这一点。是不是很简单,你把fft的长度增加了一倍,振幅就减半了?嗨,杰米。对于记录(正如您可能知道的),要获得正确的振幅,您只需要整理归一化。ifft通过fft的长度进行归一化,我们人为地延长了fft的长度。所以要修正振幅,你需要乘以len(f_u)/len(f)