【问题标题】:Why numpy fft return incorrect phase information?为什么 numpy fft 返回不正确的相位信息?
【发布时间】:2018-10-18 00:21:04
【问题描述】:

我比较了 Matlab 和 numpy 中的相位和幅度谱。我认为 Matlab 工作正确,但 numpy 计算正确的幅度谱,但相位谱很奇怪。我必须如何更改 python 代码才能通过 numpy 正确计算 fft?

Matlab:

fs = 1e4;
dt = 1 / fs;
t = 0:dt:0.5;
F = 1e3;

y = cos(2*pi*F*t);
S = fftshift(fft(y) / length(y));
f_scale = linspace(-1, 1, length(y)) * (fs / 2);

a = abs(S);
phi = (angle(S));

subplot(2, 1, 1)
plot(f_scale, a)
title('amplitude')

subplot(2, 1, 2)
plot(f_scale, phi)
title('phase')

Python:

import numpy as np
import matplotlib.pyplot as plt

fs = 1e4
dt = 1 / fs
t = np.arange(0, 0.5, dt)
F = 1e3

y = np.cos(2*np.pi*F*t)
S = np.fft.fftshift(np.fft.fft(y) / y.shape[0])
f_scale = np.linspace(-1, 1, y.shape[0]) * (fs / 2)

a = np.abs(S)
phi = np.angle(S)

plt.subplot(2, 1, 1, title="amplitude")
plt.plot(f_scale, a)

plt.subplot(2, 1, 2, title="phase")
plt.plot(f_scale, phi)

plt.show()

matlab output

numpy output

【问题讨论】:

    标签: python matlab numpy spectrum phase


    【解决方案1】:

    理解np.arange是个问题。它会在达到所需值之前停止dt (您通过的间隔在右侧打开)。如果你定义

    t = np.arange(0, 0.5+dt, dt)
    

    一切都会好起来的。

    【讨论】:

      【解决方案2】:

      正如另一个答案中所指出的,要使 Python 绘图与 matlab 输出匹配,您必须调整 t 数组,使其与 matlab 代码中的 t 数组具有相同的值。

      但是,如果您的意图是在信号中包含整数个周期,因此 FFT 只有两个非零值(在 ± 输入频率处),那么正确的是 Python 代码。 Python 代码中的相位看起来很奇怪,因为除了与信号频率相关的傅立叶系数之外的所有傅立叶系数(理论上)都是 0。使用有限精度算术,这些系数最终成为数值“噪声”,幅度非常小,相位基本上是随机的。

      【讨论】:

      • 谢谢你的详细解答,现在我明白了为什么我有不同的回报。
      • 感谢您对“小幅度噪声”的回答,现在我通过以下方式过滤小幅度后得到完美的数字:fft_y = fft(y);abs_y=np.abs(fft_y);fft_y = np.where(abs_y<10,0,fft_y)
      猜你喜欢
      • 2016-07-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多