Дискретное преобразование Фурье: Как правильно использовать fftshift с fft

Я хочу численно вычислить БПФ для массива 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], где 'частота' является независимой переменной?

Ответ на Преобразование Фурье гауссиана не гауссово не отвечает на мой вопрос.

6
задан Chiel 11 April 2018 в 06:47
поделиться