Почему numpy fft возвращает неверную информацию о фазе? - PullRequest
0 голосов
/ 18 октября 2018

Я сравниваю фазовый и амплитудный спектр в Matlab и NumPy.Я думаю, что Matlab работает правильно, но вычисляет правильный спектр амплитуды, но фазовый спектр странный.Как я должен изменить код Python для правильного вычисления FFT по Numpy?

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

numpy output

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Как указано в другом ответе, чтобы график Python соответствовал выводу matlab, необходимо настроить массив t так, чтобы он имел те же значения, что и массив t в коде matlab.

Однако, если ваше намерение состояло в том, чтобы в сигнале было целое число периодов, поэтому БПФ имеет только два ненулевых значения (при ± входной частоте), тогда правильный код Python.Фаза в коде Python выглядит странно, потому что все коэффициенты Фурье, кроме тех, которые связаны с частотой сигнала, (теоретически) равны 0. При арифметике конечной точности коэффициенты в конечном итоге представляют собой числовой «шум» с очень малой амплитудой и практически случайной фазой.

0 голосов
/ 18 октября 2018

Это проблема понимания np.arange.Он останавливается на один dt , прежде чем достигнет желаемого значения (интервал, который вы проходите, открыт с правой стороны).Если вы определите

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

, все будет работать нормально.

...