numpy.fft numpy.fft2 и FFTW для 2D-массивов - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь воспроизвести выходные данные numpy.fft.fft и numpy.fft.fft2, используя библиотеку C FFTW.

>>> b
array([1, 2, 3, 4, 5, 6])
>>> type(b)
<class 'numpy.ndarray'>
>>> b.shape
(6,)
>>> np.fft.fft(b)
array([21.+0.j        , -3.+5.19615242j, -3.+1.73205081j, -3.+0.j        ,
       -3.-1.73205081j, -3.-5.19615242j])

Этот вывод может быть получен с помощью:

int N = 10;
double in[] = {1,2,3,4,5,6,0,0,0,0};
fftw_complex *out;
fftw_plan p;
out = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * (N/2 +1));
p = fftw_plan_dft_r2c_1d(6, in, out, FFTW_ESTIMATE);
fftw_execute(p);
fftw_destroy_plan(p);
fftw_free(out);

Точно так же вывод 2d массива, переданного в numpy.fft.fft2, может быть воспроизведен:

>>> a
array([[1, 2],
       [3, 4],
       [5, 6]])
>>> a.shape
(3, 2)
>>> np.fft.fft2(a)
array([[21.+0.j        , -3.+0.j        ],
       [-6.+3.46410162j,  0.+0.j        ],
       [-6.-3.46410162j,  0.+0.j        ]])

, и соответствующий код C ++ (изменение только одной строки)

p = fftw_plan_dft_r2c_2d(3, 2, in, out, FFTW_ESTIMATE);

Я столкнулся сКод Python, который передает 2d array в numpy.fft.fft

>>> a
array([[1, 2],
       [3, 4],
       [5, 6]])
>>> a.shape
(3, 2)
>>> np.fft.fft(a)
array([[ 3.+0.j, -1.+0.j],
       [ 7.+0.j, -1.+0.j],
       [11.+0.j, -1.+0.j]])

Я пытаюсь выяснить, как этого можно добиться, используя FFTW APIs.Любая подсказка о том, как воспроизвести это?или почему numpy допускает 1D Fourier transformation массива matrix / 2d?

1 Ответ

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

Почему NumPy позволяет передавать двумерные массивы в одномерное БПФ?Цель состоит в том, чтобы иметь возможность рассчитывать БПФ нескольких отдельных 1-D сигналов одновременно.

Если

>>> a = np.array([[1, 2], [3, 4], [5, 6]])
>>> A = np.fft.fft(a)

, то первая строка A будет 1-D БПФ первого ряда a.Второй ряд A - это 1-D БПФ второго ряда a и т. Д.

Это можно проверить с помощью

>>> np.fft.fft(a[0, :])
array([ 3.+0.j, -1.+0.j])

>>> A[0, :]
array([ 3.+0.j, -1.+0.j])

или

>>> np.fft.fft(a[1, :])
array([ 7.+0.j, -1.+0.j])

>>> A[1, :]
array([ 7.+0.j, -1.+0.j])

Чтобы сделать то же самое в FFTW, вы можете выполнить план несколько раз для разных строк или использовать fftw_plan fftw_plan_many_dft.

...