Я хочу численно вычислить БПФ для массива Y. Для тестирования я использую функцию Гаусса Y = exp (-x ^ 2). (Символьное) преобразование Фурье: Y '= constant * exp (-k ^ 2/4).
import numpy
X = numpy.arange(-100,100)
Y = numpy.exp(-(X/5.0)**2)
Наивный подход терпит неудачу:
from numpy.fft import *
from matplotlib import pyplot
def plotReIm(x,y):
f = pyplot.figure()
ax = f.add_subplot(111)
ax.plot(x, numpy.real(y), 'b', label='R()')
ax.plot(x, numpy.imag(y), 'r:', label='I()')
ax.plot(x, numpy.abs(y), 'k--', label='abs()')
ax.legend()
Y_k = fftshift(fft(Y))
k = fftshift(fftfreq(len(Y)))
plotReIm(k,Y_k)
реальный (Y_k) перескакивает между положительными и отрицательными значениями, которые соответствуют фазе перехода, которая отсутствует в символьном результате. Это, конечно, нежелательно. (Результат технически правильный в том смысле, что abs (Y_k) дает ожидаемые амплитуды, если ft (Y_k) равно Y.)
Здесь функция fftshift () отображает массив k монотонно возрастающим и соответственно изменяет Y_k. Пары zip (k, Y_k) не изменяются при применении этой операции к обоим векторам.
Похоже, что эти изменения решают проблему:
Y_k = fftshift(fft(ifftshift(Y)))
k = fftshift(fftfreq(len(Y)))
plotReIm(k,Y_k)
Правильно ли это использовать функцию fft (), если требуются монотонные Y и Y_k?
Операция, обратная описанной выше:
Yx = fftshift(ifft(ifftshift(Y_k)))
x = fftshift(fftfreq(len(Y_k), k[1] - k[0]))
plotReIm(x,Yx)
Для этого В документации четко указано, что Y_k должен быть отсортирован в соответствии с выводом fft () и fftfreq (), чего мы можем добиться, применив ifftshift ().
Эти вопросы беспокоили меня долгое время: всегда ли выходные и входные массивы функций fft () и ifft () таковы, что a [0] должен содержать член с нулевой частотой, a [1: n / 2 + 1] должен содержать члены с положительной частотой, а [n / 2 + 1:] должен содержать члены с отрицательной частотой в порядке убывания отрицательной частоты
[numpy reference], где 'частота' является независимой переменной?
Ответ на Преобразование Фурье гауссиана не гауссово не отвечает на мой вопрос.