`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 处错误:
对于纯实值频率,FFT 将在两个位置达到峰值。这是正负频率。在傅立叶域中获得单峰的唯一方法是使用复值信号(或具有微不足道的直流分量)。
(如果有f,你的意思是频率指数)使用DFT时,样本数将决定你有多少频率分量。在最高频率索引处,您始终接近每个样本的振荡:(-1)^t
(如果带f,你的意思是振幅)有many definitions of the DFT,影响前向和后向变换。这将影响读取光谱时值的解释方式。
您只是将 fftshift
应用于 x 轴标签,而不是实际的 FFT 幅度 - 您只需要也应用 s_fft = np.fft.fftshift(np.fft.fft(x))
。
我正在尝试使用 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 处错误:
对于纯实值频率,FFT 将在两个位置达到峰值。这是正负频率。在傅立叶域中获得单峰的唯一方法是使用复值信号(或具有微不足道的直流分量)。
(如果有f,你的意思是频率指数)使用DFT时,样本数将决定你有多少频率分量。在最高频率索引处,您始终接近每个样本的振荡:(-1)^t
(如果带f,你的意思是振幅)有many definitions of the DFT,影响前向和后向变换。这将影响读取光谱时值的解释方式。
您只是将 fftshift
应用于 x 轴标签,而不是实际的 FFT 幅度 - 您只需要也应用 s_fft = np.fft.fftshift(np.fft.fft(x))
。