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

Python 使用scipy.fftpack.fft如何解释傅里叶变换的数值结果,python,scipy,fft,Python,Scipy,Fft,正弦信号的解析傅里叶变换是。然而,当数值计算离散傅里叶变换时,结果并非如此 Tldr:找到这个问题的所有答案 因此,请考虑以下代码 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,

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

Tldr:找到这个问题的所有答案

因此,请考虑以下代码

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()

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

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

A_approx = np.sum(np.abs(X)) / N
print(f"Numerical value: {A_approx:.1f}, Correct value: {A:.1f}")
数值:13.5,正确值:4.0

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


没有帮助的相关问题是和。

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

这些问题更适合信号处理堆栈交换站点。要真正理解你的计算与(连续时间)傅里叶变换的关系,请学习数字信号处理、离散时间傅里叶变换(DTFT)和离散傅里叶变换(DFT)的教科书。你是对的,但我不知道会存在这样的堆栈交换站点。