Как восстановить амплитуду и сдвиг фазы из преобразования Фурье в Numpy? - PullRequest
0 голосов
/ 20 октября 2019

Я пытаюсь написать простой скрипт на python, который восстанавливает амплитуду и фазу синусоидальной волны из ее преобразования Фурье.

Я должен быть в состоянии сделать это путем вычисления величины и направлениявектор, определенный действительными и мнимыми числами для преобразования Фурье, для данной частоты, то есть:

Amplitude_at_freq = sqrt(real_component_at_freq^2 + imag_component_at_freq^2)
Phase = arctan(imag_component_at_freq/real_component_at_freq)

Ссылка: 1 мин 45 секунд в этом видео: https://www.youtube.com/watch?time_continue=106&v=IWQfj05i87g

I 'Мы написали простой скрипт на Python, используя библиотеку fum от numpy, чтобы попытаться воспроизвести это, но, несмотря на то, что выписали мой вывод точно так же, как описано выше, мне не удалось получить амплитуду и фазу, хотя я могу правильно восстановить исходную частоту моей тестовой синусоиды. Этот предыдущий пост Расчет амплитуды по np.fft и этот Почему FFT не восстанавливает исходную амплитуду при увеличении длины сигнала , указывает на ту же проблему (где амплитуда отключена с коэффициентом 2),В частности, решение состоит в том, чтобы «умножить на 2 (половина спектра удаляется, поэтому энергия должна быть сохранена)», но мне нужно уточнить, что это значит. Во-вторых, нет никаких упоминаний о моей проблеме с восстановлением изменения фазы, и амплитуда рассчитывается иначе, чем у меня здесь.

# Define amplitude, phase, frequency
_A = 4 # Amplitude
_p = 0 # Phase shift
_f = 8 # Frequency

# Construct a simple signal
t = np.linspace(0, 2*np.pi, 1024 + 1)[:-1]
g = _A * np.sin(_f * t + _p) 

# Apply the fourier transform
ff = np.fft.fft(g)

# Get frequency of original signal
ff_ii = np.where(np.abs(ff) > 1.0)[0][0] # Just get one frequency, the other one is just mirrored freq at negative value
print('frequency of:', ff_ii)

# Get the complex vector at that frequency to retrieve amplitude and phase shift
yy = ff[ff_ii] 

# Calculate the amplitude
T = t.shape[0] # domain of x; which we will divide height to get freq amplitude
A = np.sqrt(yy.real**2 + yy.imag**2)/T 
print('amplitude of:', A) 

# Calculate phase shift
phi = np.arctan(yy.imag/yy.real) 
print('phase change:', phi)

Тем не менее, результат, который я получаю:

>> frequency of: 8
>> amplitude of: 2.0
>> phase change: 1.5707963267948957

Так что частота точная, но я получаю амплитуду 2, когда она должна быть 4, и изменение фазы pi / 2, когда она должна быть нулевой.

Моя математика неверна,или мое понимание реализации fft numpy неверно?

1 Ответ

2 голосов
/ 20 октября 2019

Фурье анализирует сигнал как сумму exp(i.2.pi.f.t) слагаемых, поэтому он видит A.sin(2.pi.f1.t) как:
-i.A/2.exp(i.2.pi.f1.t)+i.A/2.exp(-i.2.pi.f1.t),
, что математически равно. Таким образом, в терминах Фурье у вас есть как положительная частота f1, так и отрицательная -f1 с комплексными значениями -A/2.i и A/2.i соответственно. Таким образом, каждая «сторона» имеет только половину амплитуды, но если вы сложите их вместе (в обратном преобразовании Фурье), вы получите обратно амплитуду А. Это разделение положительной и отрицательной частоты - это то, где ваш пропущенный фактор 2 - это если вы смотрите только(положительная или отрицательная) сторона спектра. Это часто делается на практике, потому что для реальных сигналов другая половина тривиальна для получения данного.

Изучите точную математику Формула Эйлера и Преобразование Фурье .

...