离散傅里叶变换意外峰值
Discrete Fourier Transform Unexpected Peak
我正在实施 DFT 并转换正弦波 (f = 440 Hz) 作为测试。然而,转换后的信号中有一个我不希望出现的峰值(见下图)。
有人能看出它为什么在那里吗?
我的代码:
import numpy as np
import matplotlib.pyplot as plt
t = 0.1
freq = 440
Fs = 2000
T = 1/Fs
N = int(Fs * t)
# signal information
omega = 2 * np.pi * freq # angular frequency of the sine wave
t_vec = np.arange(N) * T # time vector for plotting
y = np.sin(omega * t_vec) # sine input signal
def DFT(y, N):
dft = []
angle = (-1 * 1j * 2 * np.pi) / (N)
for k in range(int(N)):
X = 0
for n in range(int(N)):
X += y[n] * np.exp(angle * k * n)
dft.append(X)
return dft
freq_vec = Fs * np.arange((N))/N
dft_signal = np.abs(DFT(y = y, N = N))
#Plots
fig, (ax1, ax2) = plt.subplots(2)
ax1.plot(t_vec, y, label='$y = numbers')
ax1.set(ylabel='Amplitude', xlabel='Time [s]', title = 'Input Signal')
ax2.plot(freq_vec, dft_signal, linewidth=5)
ax2.set(yscale='log', xscale='log', ylabel='Amplitude', xlabel='Frequency [Hz]', title = 'DFT of Input Signal')
plt.tight_layout()
plt.show()
我觉得你的代码不错。您看到的只是负频率,因为正弦函数的傅立叶变换是由正频率的峰值和负频率的峰值组成的。不要以 xlog 比例绘制它,它会显得更明显!那么将零频率放在数组的中间或开头(如您的实现)只是fftshift
的问题。
请记住,如果您的频率范围是 Fs
,您的 DFT 只会从 -Fs/2
到 +Fs/2
我正在实施 DFT 并转换正弦波 (f = 440 Hz) 作为测试。然而,转换后的信号中有一个我不希望出现的峰值(见下图)。 有人能看出它为什么在那里吗?
我的代码:
import numpy as np
import matplotlib.pyplot as plt
t = 0.1
freq = 440
Fs = 2000
T = 1/Fs
N = int(Fs * t)
# signal information
omega = 2 * np.pi * freq # angular frequency of the sine wave
t_vec = np.arange(N) * T # time vector for plotting
y = np.sin(omega * t_vec) # sine input signal
def DFT(y, N):
dft = []
angle = (-1 * 1j * 2 * np.pi) / (N)
for k in range(int(N)):
X = 0
for n in range(int(N)):
X += y[n] * np.exp(angle * k * n)
dft.append(X)
return dft
freq_vec = Fs * np.arange((N))/N
dft_signal = np.abs(DFT(y = y, N = N))
#Plots
fig, (ax1, ax2) = plt.subplots(2)
ax1.plot(t_vec, y, label='$y = numbers')
ax1.set(ylabel='Amplitude', xlabel='Time [s]', title = 'Input Signal')
ax2.plot(freq_vec, dft_signal, linewidth=5)
ax2.set(yscale='log', xscale='log', ylabel='Amplitude', xlabel='Frequency [Hz]', title = 'DFT of Input Signal')
plt.tight_layout()
plt.show()
我觉得你的代码不错。您看到的只是负频率,因为正弦函数的傅立叶变换是由正频率的峰值和负频率的峰值组成的。不要以 xlog 比例绘制它,它会显得更明显!那么将零频率放在数组的中间或开头(如您的实现)只是fftshift
的问题。
请记住,如果您的频率范围是 Fs
,您的 DFT 只会从 -Fs/2
到 +Fs/2