【问题标题】:getting output ifft at a different resolution以不同的分辨率获得输出ifft
【发布时间】:2013-06-04 00:05:40
【问题描述】:

我正在尝试使用 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)

我还能够以此处演示的相同分辨率手动重新创建该系列 Recreating time series data using FFT results without using ifft

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

提前致谢

尼尔

【问题讨论】:

    标签: python scipy fft fftpack


    【解决方案1】:

    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 的长度进行归一化,我们人为地将其延长。因此,要校正幅度,您需要乘以 len(f_)/len(f)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 2014-04-02
    • 2016-07-09
    • 2020-07-24
    • 2011-12-17
    • 1970-01-01
    相关资源
    最近更新 更多