Удвоение входного массива при использовании numpy для быстрых преобразований Фурье - PullRequest
0 голосов
/ 21 февраля 2019

Я написал функцию, которая возвращает реальный компонент быстрого преобразования четырех сеток.

def take_FFT(x):
    # some arbitrary field for a 1D grid
    y = abs(1.0/x)
    # compute FFT (in general multi-dimensional) array of real numbers
    y_k = np.fft.rfftn(y)

    #compute the inverse FFT
    y_invk = np.fft.irfftn(y_k)
    return y,y_k, y_invk # return fourier transform and inv transform

# initialize sample x
x_test = np.arange(-5,5,0.001)

field,FFT_test, inv_test = take_FFT(x_test)

Как создать соответствующий новый «массив x» для построения на основе БПФ?Мне не понятно, как сделать массив длины = (n / 2) +1, такой как тот, который возвращает np.fft.irfftn

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Самый простой способ получить массив частот для использования с np.fft.rfft - это использовать удобную вспомогательную функцию np.fft.rfftfreq:

freqs = np.rfftfreq(x_test)

Многомерный эквивалент для np.fft.rfftn немного сложнее.Вам нужно будет получить частоты вдоль каждой оси, а затем использовать np.meshgrid:

per_axis_freq = [np.fft.fftfreq(N) for N in x_test.shape[0:-1]]
per_axis_freq.append(np.fft.rfftfreq(x_test.shape[-1]))
freqs = np.meshgrid(*per_axis_freq[::-1])
0 голосов
/ 21 февраля 2019

Добро пожаловать в StackOverflow, @Messier!

Если я правильно понимаю ваш вопрос, вы хотите slice a numpy.array.

Предположим, у нас естьnumpy.array arr имеет длину N.Затем нарезать до длины M (такой, что M<=N) или до (N/2)+1:

sliced_arr = arr[:M]
slice_half = arr[:N//2+1]

, где в python версиях 3 или выше, N//2 делает целочисленное деление.

...