【问题标题】:FFT not computing fourier transformFFT 不计算傅里叶变换
【发布时间】:2016-01-12 07:28:35
【问题描述】:

我有一个读取的 csv 文件(在 Jupyter 笔记本上使用 python 3,但从终端获得相同的结果)。我正在通过 numpy.fft.fft 模块计算 fft 并得到奇怪的结果,即数据的 fft 返回原始数据 - 即实部完全等于(实部)输入数据和虚部的复数向量等于0。代码如下:

with open('/Users/amacrae/Documents/PMDi/MCT/Jan10/msin287.csv', 'r') as f:
    c = csv.reader(f)
    y = np.array(list(c),dtype=float)
YF = np.fft.fft(y)
print(np.sum(YF.real-y))
print(np.sum(YF.imag))
> 0.0
> 0.0

为了确保它不仅仅是数据,我在 matlab 中绘制了具有正确结果的相同数据(数据的设计使得 fft 的幅度在频率空间中的窗口上是恒定的并且具有真正的不确定性。)对应的matlab代码为:

y = csvread('/Users/amacrae/Documents/PMDi/MCT/Jan10/msin287.csv');
plot(abs(fft(y)))

据我所知,两种语言的结果应该是相同的......导入数据的实部在两种情况下都匹配(相同的长度和值),但 fft 不匹配。数据很长 - 100,000 个样本,但如果我在 python 中创建一个随机的 100,000 个样本数组,我会得到一个实数 + 虚数 fft。有谁知道这可能是什么原因造成的?

【问题讨论】:

    标签: python numpy fft


    【解决方案1】:

    关于你的代码

    print(np.sum(YF.real-y))
    print(np.sum(YF.imag))
    

    第一部分是真的因为Parseval's theorem 第二个是正确的,因为光谱的前半部分和光谱的后半部分是共轭的。

    尝试将 Python 中的绝对值与您的 Matlab 版本进行比较。绝对值与真实值不同。在这两种情况下,请考虑定义变换的长度,即 1024、2048(因为 e^(j*1e-5) 可能会导致问题)

    【讨论】:

    • 您好,谢谢您的回复。其实这不是真的。首先,y 的第一部分和第二部分不是复共轭,因此 fft(y) 不必是实数。事实上,在这种情况下,频谱是复杂的,具有产生真实序列所需的相位。其次,Parseval 定理不能保证这一点。它的意思是 y 和 YF 的幂相等:sum(abs(y)**2) = sum(abs(Y)**2)。例如,y = [1,2,3],YF = 1.5*[4, -1+1i/sqrt(3), -1-1i/sqrt(3)]。在这里,sum(YF.real-y) = -3,而不是 0。所以这里肯定发生了其他事情......
    【解决方案2】:

    感谢您输入 Radu。最后它变成了别的东西(见上面的评论。)

    问题在于加载文件的方法产生了一个数组数组,即一个列向量。当我调用 fft 时,它只是返回原始列向量,因为它单独对每一行执行 fft。

    with open('/Users/amacrae/Documents/PMDi/MCT/Jan10/msin287.csv', 'r') as f:
        c = csv.reader(f)
        y = np.array(list(c),dtype=float)
        # y = [[y0],[y1],[y2],...]] fft(y) = [[y0+0.j],[y1+0.j],[y2+0.j],...]]
    

    解决方案是将数组展平:

    with open('/Users/amacrae/Documents/PMDi/MCT/Jan10/msin287.csv', 'r') as f:
        c = csv.reader(f)
        y = np.array(list(c),dtype=float)
        y2 = flatten(y)
        # produces [y0,y1,y2,....]
    

    或使用不同的方法读取文件:

    y2 = np.loadtxt('/Users/amacrae/Documents/PMDi/MCT/Jan10/msin287.csv')
    # also produces [y0,y1,y2,....]
    

    两者都产生了正确的 FFT。

    【讨论】:

      猜你喜欢
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 2021-05-25
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      相关资源
      最近更新 更多