python - FFT 未返回正确的幅度

标签 python numpy fft

我正在尝试使用简单的 FFT 对某些函数进行傅里叶变换,但显然 numpy 和 scipy FFT 即使对于 1024 点也不能很好地工作。

例如,假设我想对 sin(50x)+cos(80x) 进行 FFT。那么,在 k=50 点应该是纯虚数,而 k=80 应该是纯实数。通常会出现一些错误,但使用大至 1024 的点通常会给出相当令人满意的输出。但这里的输出有相当多的错误。随着点数的增加,结果并没有太大改善。

谁能解释一下这是什么原因吗?

我在Python中尝试了以下代码:

from __future__ import division
import numpy as np
import matplotlib.pyplot as plt
import scipy.fftpack

pi = np.pi

#no. of points
N = 1024

#real axis
x = np.linspace(0,2*pi,N)

#real fn
f_x = np.sin(50*x)+np.cos(80*x)

f_k = (2/N)*scipy.fftpack.fft(f_x)

print f_k[50]
print f_k[80]

它给出以下输出:

(0.155273271152-0.983403030451j)
(0.960302223459+0.242617561413j)

应该是0-1j1+0j。有了 1024 分,我期望得到更准确的结果。

我还尝试使用显式 FT 公式和 numpy 而不是 scipy 进行转换。两者给出相同的准确度。

最佳答案

对于理想的无限长度信号,它将是 0-1j1+0j。然而,这是一个有限长度的数字信号。由于窗口和计算机上表示 float 的限制,它永远不会完美匹配理想情况。

关于python - FFT 未返回正确的幅度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29365367/

相关文章:

python - 在使用管理面板插入模型字段之前对其进行预处理

c++ - 使用 Eigen 和 FFTW 进行二维傅里叶变换

algorithm - 如何计算离散傅里叶变换?

signal-processing - DSP - 使用 DFT 过滤频率

python - 为什么我的函数要修改输入变量?

Python : ( msg = email. message_from_string(aaa) ) 值在尝试从原始电子邮件源解析内容时返回 ( None )

python - 如何通过 id(beautifulsoup 中的数字)选择 HTML 元素

python - numpy 数组元素是否自动舍入?

python - 非常嘈杂信号的 Scipy FFT 频率分析

python - Jupyter Notebook 内存管理