Разница между результатом array_spectrum доступна в matplotlib.mlab и numpy.abs (numpy.fft.fft (данные))

У меня простая синусоида. Я пытаюсь найти спектр амплитуд в частотной области.
Я использовал функцию matplotlib.mlab.magnitude_spectrum(data) Я хотел проверить этот результат, поэтому я попробовал numpy.abs(numpy.fft.fft(data)) . Результаты разные.
Это должно быть такое же право? Даже если я попытаюсь
numpy.sqrt(matplotlib.mlab.psd(data)) , результаты разные.

Я ищу объяснение этого.

Есть два основных отличия. Во-первых, matplotlib.mlab.magnitude_spectrum применяет функцию окна к входным данным перед тем, как принимать БПФ (по умолчанию – окно Ханнинга ). Во-вторых, он возвращает только положительные частоты, тогда как np.fft.fft возвращает как положительные, так и отрицательные частоты:

 import numpy as np from matplotlib import pyplot as plt x = np.random.randn(500) mag1, f = plt.mlab.magnitude_spectrum(x) # apply a hanning window to x xw = np.hanning(x.shape[0]) * x # use np.fft.rfft to get the positive frequencies only mag2 = np.abs(np.fft.rfft(xw)) fig, ax = plt.subplots(1, 1) ax.hold(True) ax.plot(f, mag1, '-k', lw=2) ax.plot(f, mag2, '--r', lw=2) plt.show() 

введите описание изображения здесь

matplotlib.mlab.psd делает что-то более сложное – он вычисляет периодограмму с использованием метода Уэлша , а не просто принимает квадрат величины БПФ. Он в основном принимает среднюю периодограмму по окклюзованным перекрывающимся сегментам вашего сигнала, что дает вам более «плавную» периодограмму, более устойчивую к шуму, за счет некоторого частотного разрешения. В зависимости от того, как выглядит ваш сигнал, и вашего выбора NFFT= и noverlap= параметров в psd , вы должны ожидать, что результат будет выглядеть совсем по-другому, чем результат noverlap= .