python - 傅里叶变换 (np.fft) 结果中出现意外相移

标签 python numpy fft

我正在寻求傅立叶变换原理的澄清。

我尝试做一些非常简单的事情:创建一个信号(具有给定频率和相移的正弦波)并使用傅立叶变换重新创建其参数。频率估计工作得很好,但当涉及到相位时,看起来我得到了系统偏移 (-pi/2)。

import numpy as np
import matplotlib.pyplot as plt

duration = 4.0 # lenght of window (in sec)
ticks_per_sec = 400.0 # sampling interval 
samples = int(ticks_per_sec*duration)

phase_shift = np.pi / 2 # sin wave shift in angle
freq = 1 # sine wave freq in Hz

phase_shift  = round(ticks_per_sec/freq * phase_shift/(2*np.pi)) # angle value translated to no of ticks
t = np.arange(phase_shift, samples+phase_shift) / ticks_per_sec

s =  1 * np.sin(2.0 * np.pi * freq * t)
N = s.size

fig, axs = plt.subplots(1, 3, figsize=(18, 6))
axs[0].grid(True)
axs[0].set_ylabel("Amplitude")
axs[0].set_xlabel("Time [s]")
axs[0].set_title(f"F: {freq}, Phase shift: {phase_shift} ticks.")
axs[0].plot(np.arange(samples)/ticks_per_sec, s) 

f = np.linspace(0, ticks_per_sec, N)
fft = np.fft.fft(s)
peak_pos = np.argmax(np.abs(fft[:N//2])) 

axs[1].set_ylabel("Amplitude")
axs[1].set_xlabel("Frequency [Hz]")
axs[1].set_title(f"Peak bar: {peak_pos}")
barlist = axs[1].bar(f[:N // 2], np.abs(fft)[:N // 2] * (1 / (N//2)), width=1.5)  # 1 / N is a normalization factor
barlist[peak_pos].set_color('r')


axs[2].set_ylabel("Angle")
axs[2].set_xlabel("Frequency [Hz]")
axs[2].set_title(f"Peak angle: {np.angle(fft[peak_pos])}")
barlist = axs[2].bar(f[:N // 2], np.angle(fft)[:N // 2], width=1.5) 
barlist[peak_pos].set_color('r')

fig.show()

Plotted Results of the code above

如果我的代码中存在我无法注意到的错误,或者我误解了某些内容,请帮助我。

提前谢谢您。

最佳答案

您的代码很好,这不是编程问题。

让我们回想一下,正弦波可以表示为具有相移的余弦波(反之亦然),现在请记住,正弦函数是实数傅立叶基中相对于余弦的 -pi/2 的固有相移。

这意味着您的代码在替换 np.sin 时应输出 pi/2 相位角。通过np.cos返回输入 phase_shift或等效地,在指定 phase_shift = np.pi / 2 时返回零相位角, phase shift和正弦相位相互补偿。

关于python - 傅里叶变换 (np.fft) 结果中出现意外相移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64224031/

相关文章:

python - 定期切片 2D numpy 数组

fft - 生成信号的标度图

python - 替换除数字之间或后跟特定文本之外的所有点

python - 一次将数组中的每个项目分开

python - 连接 Pandas DataFrame 中的列值,用逗号替换 “NaN” 值

python - 使用预测方法时 Keras CNN 模型类型值错误

javascript - 音高检测 - Node.js

python - FFT - 峰峰值、峰值、RMS

python - 缩小输入时的空间复杂度

python - 使用python将 "string-like"列表转换为int