- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面是比较 fft 相位图与 2 种不同方法的代码:
import numpy as np
import matplotlib.pyplot as plt
import scipy.fftpack
phase = np.pi / 4
f = 1
fs = f*20
dur=10
t = np.linspace(0, dur, num=fs*dur, endpoint=False)
y = np.cos(2 * np.pi * t + phase)
Y = scipy.fftpack.fftshift(scipy.fftpack.fft(y))
f = scipy.fftpack.fftshift(scipy.fftpack.fftfreq(len(t)))
p = np.angle(Y)
p[np.abs(Y) < 1] = 0
fig, ax = plt.subplots(2, 1)
ax[0].plot(t, y)
ax[1].plot(f*fs, p, label='from fft')
ax[1].phase_spectrum(y, fs, window=None, label='from phase_spectrum')
plt.legend()
plt.show()
这是结果:
这是当信号周期数不是整数时的结果:
我有几个问题:
最佳答案
在回答之前,先简单说明一下:
删除p[np.abs(Y) < 1] = 0
线。您的频谱的大部分幅度都低于 1,这就是为什么使用这条线,您的频谱看起来大多像零处的平坦线。
现在回答:
phase_spectrum
做了三件事与你不同:
np.unwrap(np.angle(Y))
即可.angle_spectrum
相反。sides='twosided'
到phase_spectrum
打电话。现在,关于获取频率 f
的相位:
为此,您必须使用阶段而不展开。
你是对的,如果没有整数个周期,则无法直接提取单音信号的相位。这是因为信号的频率并不正好落在 FFT 中任何频率仓的顶部。不过,您可以通过最近的 bin 的相位获得近似值。您还可以对频谱进行正弦插值,以获得所需频率处的值。
如果您只关心单个频率的相位f
,那么你根本不应该使用 FFT。 FFT 计算所有频率的相位和幅度。如果你只关心单个频率,就做 Y_at_f = y @ np.exp(2j * np.pi * f * t)
并通过 np.angle(Y_at_f)
获得该阶段.
关于python - 绘制和提取 fft 相位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60284232/
下面是比较 fft 相位图与 2 种不同方法的代码: import numpy as np import matplotlib.pyplot as plt import scipy.fftpack p
我使用 apache commons 数学库来转换我的音频样本缓冲区上的 FFt 和 IFFT。 FFT 的输出给了我一组复数。频率在中间镜像。样本缓冲区大小为 4096 个样本,我得到 2048 个
我是一名优秀的程序员,十分优秀!