我有一个我读过的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。有没有人知道可能导致这种情况的原因?
答案 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。