`fft` 没有返回它应该返回的内容

`fft` not returning what it should

我正在尝试使用 numpy 的 fft 执行傅立叶变换,如下所示:

import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(0,1, 128)
x = np.cos(2*np.pi*t)

s_fft = np.fft.fft(x)
s_fft_freq = np.fft.fftshift(np.fft.fftfreq(t.shape[-1], t[1]-t[0]))
plt.plot(s_fft_freq, np.abs(s_fft))

我得到的结果是

这是错误的,因为我知道 FT 应该在 f = 1 达到峰值,因为 cos 的频率是 1

我做错了什么?

您有 2 或 3 处错误:

  1. 对于纯实值频率,FFT 将在两个位置达到峰值。这是正负频率。在傅立叶域中获得单峰的唯一方法是使用复值信号(或具有微不足道的直流分量)。

  2. (如果有f,你的意思是频率指数)使用DFT时,样本数将决定你有多少频率分量。在最高频率索引处,您始终接近每个样本的振荡:(-1)^t

  3. (如果带f,你的意思是振幅)有many definitions of the DFT,影响前向和后向变换。这将影响读取光谱时值的解释方式。

您只是将 fftshift 应用于 x 轴标签,而不是实际的 FFT 幅度 - 您只需要也应用 s_fft = np.fft.fftshift(np.fft.fft(x))