python - 使用 scipy.fftpack.fft 如何解释傅里叶变换的数值结果

标签 python scipy fft

正弦信号的解析傅立叶变换为 purely imginary 。然而,当数值计算离散傅立叶变换时,结果却并非如此。

Tldr:找到此问题的所有答案 here .

因此请考虑以下代码

import matplotlib.pyplot as plt
import numpy as np
from scipy.fftpack import fft, fftfreq

f_s = 200 # Sampling rate = number of measurements per second in [Hz]
t = np.arange(0,10000, 1 / f_s)
N = len(t)
A = 4 # Amplitude of sinus signal 
x = A * np.sin(t)
X = fft(x)[1:N//2]
freqs = (fftfreq(len(x)) * f_s)[1:N//2]

fig, (ax1,ax2) = plt.subplots(2,1, sharex = True)
ax1.plot(freqs, X.real, label = "$\Re[X(\omega)]$")
ax1.plot(freqs, X.imag, label = "$\Im[X(\omega)]$")
ax1.set_title("Discrete Fourier Transform of $x(t) = A \cdot \sin(t)$")
ax1.legend()
ax1.grid(True)

ax2.plot(freqs, np.abs(X), label = "$|X(\omega)|$")
ax2.legend()
ax2.set_xlabel("Frequency $\omega$")
ax2.set_yscale("log")
ax2.grid(True, which = "both")
ax2.set_xlim(0.15,0.175)
plt.show()

figure

显然,绝对值|X(w)|可以用作分析结果的良好近似。然而,函数 X(w) 的虚值和实值是不同的。已经another question on SO提到了这个事实,但没有解释原因。那么我只能使用绝对值和相位吗?

另一个问题是振幅与数值结果有何关系。从数学上来说应该是|X(w)|曲线下的积分除以归一化(据我所知,应该由 N 给出),即大约除以

A_approx = np.sum(np.abs(X)) / N
print(f"Numerical value: {A_approx:.1f}, Correct value: {A:.1f}")

Numerical value: 13.5, Correct value: 4.0

事实似乎并非如此。有什么见解吗?有想法吗?

没有帮助的相关问题是 herehere .

最佳答案

FFT 不会产生您期望的结果,因为它的长度有限,因此更类似于正弦曲线上矩形窗口的傅立叶变换。该矩形窗口的长度和位置将影响FFT结果的相位和幅度。

关于python - 使用 scipy.fftpack.fft 如何解释傅里叶变换的数值结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54691481/

相关文章:

python - 如何使用argparse python为两个类别设置不同的强制性参数?

python - 二维列表的排列 (Python)

python - 如何隔离 scipy.integrate.quad 函数的结果,而不是计算结果和错误?

fft - 亲吻 FFT 线程安全

machine-learning - 哪些FFT描述符应用作实现分类或聚类算法的功能?

java - JTransforms FFT DC 分量与 Matlab 不同

python - 每次使用不同的切片范围沿不同的暗淡对数组求和

python - 为什么这不起作用?这是 apscheduler 错误吗?

python - 获取 Matplotlib 单选按钮的状态

python - 如何在Python中创建嵌套矩阵