Преобразование Фурье с использованием Python - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь выполнить преобразование Фурье с использованием Python.

Есть хорошая библиотека numpy, которая имеет функцию fft, которая, согласно документу, должна получить серию точек и вернуть преобразование Фурьеих.

Теперь я пытаюсь заставить это работать - но это выглядит неправильно ...

Я создал простые sine wave 1Hz, Amplitude=1.Я сэмплирую это с 8Hz (таким образом, 8 сэмплов)

Вот сэмплы:

[0,0.707,1,0.707,0,-0.707,-1,-0.707]

Теперь я ожидаю получить взамен ens.[0,4,0,0,0,0,0,4] или [0,8,0,0], что означает, что частота равна 1Hz (зависит от того, требуется ли подстройка в соответствии с пределом Найквиста).

Но в действительности я получаю следующее:

[0.00000000e+00+0.00000000e+00j, -2.22044605e-16-3.99969798e+00j,
 0.00000000e+00+0.00000000e+00j, -2.22044605e-16+3.02022804e-04j,
 0.00000000e+00+0.00000000e+00j,  2.22044605e-16-3.02022804e-04j,
 0.00000000e+00+0.00000000e+00j,  2.22044605e-16+3.99969798e+00j]

Это мой код:

import numpy
signal = numpy.array([0,0.707,1,0.707,0,-0.707,-1,-0.707], dtype=float)
f =  numpy.fft.fft(signal)
print (f)

Почему я получаю эти результаты?Что я делаю не так?

1 Ответ

0 голосов
/ 19 декабря 2018

Выход преобразования Фурье

Выход nummpy.fft.fft (и любого другого метода преобразования Фурье) имеет комплексное значение.Этот выход кодирует информацию об амплитуде и фазовом сдвиге каждого частотного компонента на входе.Комплексные числа, которые вы получаете на выходе, правильные.

Как получить частотный спектр с выхода fft.fft

Из ваших примеров вывод, который вам кажетсяпопытка получить фактически частотный спектр (технически, спектральная плотность энергии ).Вы можете вычислить это, просто взяв абсолютное значение результата, возвращенного из numpy.fft.fft:

import numpy
signal = numpy.array([0,0.707,1,0.707,0,-0.707,-1,-0.707], dtype=float)
f =  numpy.fft.fft(signal)
print(np.abs(f))

Вывод:

[0.00000000e+00 3.99969798e+00 0.00000000e+00 3.02022804e-04
 0.00000000e+00 3.02022804e-04 0.00000000e+00 3.99969798e+00]

, который является именно тем, что вы ожидали, с некоторой числовой неточностью,

Согласно комментарию Уоррена Векессера, вы можете несколько уменьшить числовую неточность, используя вместо своих сокращений «реальное» значение 2**.5/2 .707 s:

signal = numpy.array([0, 2**.5/2, 1, 2**.5/2, 0, -2**.5/2, -1, -2**.5/2])
f =  numpy.fft.fft(signal)
print(np.abs(f))

Output:

[0.00000000e+00 4.00000000e+00 0.00000000e+00 2.22044605e-16
 0.00000000e+00 2.22044605e-16 0.00000000e+00 4.00000000e+00]

Абсолютное значение комплексного числа является его величиной.В соответствии с преобразованием Фурье вики :

величина преобразования Фурье в точке - это то, сколько частотного контента существует

...