Я думаю, что fftfreq
не делает то, что вы думаете, что делает. xf
для fft(ifft(y)
идентично x
, вам не следует пытаться пересчитать его. Ось X не изменяется при переходе в другую область и затем обратно.
Также обратите внимание, что fftfreq
возвращает координаты в частотной области для дискретного преобразования Фурье сигнала данного длина и с заданным интервалом выборки. Он не делает обратное, вы не можете использовать его для определения координат в пространственной области после применения обратного дискретного преобразования Фурье. (Интервал, который он возвращает, действителен, но набор координат - нет.)
plt.plot(x, y, label='original')
# IFFT
yt = ifft(y)
# plt.plot(np.abs(yt))
# FFT back
yf = fft(yt)
plt.plot(x, np.real(yf), label='after transforms')
plt.legend()
plt.grid()
plt.show()
Другая проблема с вашим кодом состоит в том, что ifft(y)
предполагает фиксированный набор значений вдоль оси x , Ваш x
не соответствует этому. Таким образом, сигнал пространственной области, который вы получаете, не имеет смысла.
Запустив ваш код, я вижу, что x
работает с 3,0 до 1,0 с шагом 0,0004777. Вам нужно будет дополнить ваши данные так, чтобы значения варьировались от 0,0 до 6,0, при этом область (3.0, 6.0) является сопряженной симметричной c копией региона (0.0, 3.0). Эта область соответствует отрицательным частотам в соответствии с периодичностью частотной области (F [n] == F [n + N], где N - количество выборок). Заполните область (0.0, 1.0) нулями.
Учитывая эту стандартизированную ось x в частотной области, xf = fftfreq(len(xt), d=(xt[1]-xt[0]))
должен восстановить ось x. Но вам нужно вычислить xt
соответственно: xt = np.linspace(0, 1/(x[1]-x[0]), len(x), endpoint=False)
(с x
стандартизированной осью частоты DFT).