FFT不计算傅立叶变换

时间:2016-01-12 07:28:36

标签: python numpy fft

我有一个我读过的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的幅度在频率空间的窗口上是恒定的并且具有真正的iffy。)相应的matlab代码是:

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

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

Image 1 is in Python. The fft'd data is precisely the input data

Image 2 is the same data, but fft'd in matlab

2 个答案:

答案 0 :(得分:2)

重新编写代码

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

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

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

答案 1 :(得分:0)

感谢输入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)
    y2 = flatten(y)
    # produces [y0,y1,y2,....]

解决方案是要么压扁阵列:

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

或使用其他方法读取文件:

static Set<String> methodSet(Class<?> type) {
    Set<String> result = new TreeSet<>();
    for(Method m : type.getMethods())
        result.add(m.getName());
    return result;
}

两者都产生了正确的FFT。