python - python和FFT的相位谱
问题描述
我正在尝试计算正弦曲线的相位谱。以下代码生成初始相位为零的 1Hz 正弦波。
import numpy
from numpy import pi, sin, arange
from pylab import plot, show, xlabel, ylabel, xlim, grid
sampling_rate = 500
sampling_time = 1 / sampling_rate
length = 1 # in seconds
n = sampling_rate * length # number of points
time = arange(0, n * sampling_time, sampling_time)
# Generate sinusoid: frequency=1Hz, phase=0
signal = sin(2 * pi * time)
fft = numpy.fft.fft(signal)
fft_phase = numpy.angle(fft)
fft_freq = numpy.arange(n) * sampling_rate / n
plot(fft_freq, fft_phase)
ylabel("FFT Angle")
xlabel("Frequency (Hz)")
xlim(left=0, right=5)
grid(True)
show()
但结果与我的预期不符。它具有 1 Hz 分量的非零相位:
它显示 1 Hz 谐波的不正确相位。代码(或方法)有什么问题?
解决方案
当幅度为零时,相位由数值不精确给出。
如果您显示由 计算的值,fft
您会看到您期望为 0 的值实际上是 1e-16 或类似的顺序。这是由浮点计算中的舍入引起的数值不精确。
解决方案是计算幅度和相位,如果幅度太小则忽略相位分量。
推荐阅读
- java - 如果接口上的这个定义对 Java 初学者是正确的
- crystal-reports - 水晶报告图片或二维码不出现
- android - React Native:构建缺少的 iOS + Android 文件夹
- c# - 从表达式返回所有实体
> 实体框架核心 - jenkins - 如何在 jenkins build 中运行 shell 脚本
- c# - 从 HTML 或命令提示符链接向独立的 Unity 应用程序发送消息?
- mime - MimeReader 的软件包或参考是什么?
- ios - 除了代码之外,是否可以检查位置是否已启用?
- javascript - 从另一个文件夹导入 SVG 图标
- svn - 用户访问 SVN 上下文菜单