Я пытаюсь реализовать 1D дискретное косинусное преобразование (тип I или любое другое) для направления x и z, когда вход представляет собой одномерный массив размером nx * nz, сглаженный из 2D nx матрицей nz. Для этого я использую функцию fftw_plan_many_r2r () в библиотеке intel MKL. однако fftw_handle устанавливается в NULL после установки fftw_plan и возникает ошибка сегментации при выполнении планов fft.
Вот мой код Кажется, все в порядке для меня, однако, не работает .. Ожидая вашей помощи!
кстати, я использую другие расширенные интерфейсы fftw, такие как fftw_plan_many_dft, fftw_plan_many_dft_r2c и fftw_plan_many_dft_c2r, очень хорошо … Так что это выглядит более неловко … При создании программы я ссылался на страницу (http://www.fftw.org/pruned.html)
#include <cstdio>
#include <iostream>
#include <complex>
#include <vector>
#include <fftw/fftw3_mkl.h>
void main()
{
// dimensions
int nx = 4;
int nz = 5;
// plans
fftw_plan plan_forward_x;
fftw_plan plan_forward_z;
// matrices
std::vector<double> M_in = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, // ->> z-dir
1.0f, 3.0f, 5.0f, 7.0f, 9.0f,
6.0f, 2.0f, 7.0f, 3.0f, 1.0f,
6.0f, 4.0f, 5.0f, 3.0f, 1.0f };
std::vector<double> M_out(nx*nz);
std::vector<double> Mkx(nx*nz);
std::vector<double> Mkz(nx*nz);
// set batched 1D DCT-1 plans for x-directional transformation
{
int rank = 1;
int batch = nz;
int inembed_x[] = { 0 };
int idist = 1;
int istride = nz;
int onembed_x[] = { 0 };
int odist = 1;
int ostride = nz;
fftw_r2r_kind kind = FFTW_REDFT00; // DCT-1
plan_forward_x = fftw_plan_many_r2r(rank, &nx, batch,
M_in.data(), inembed_x, istride, idist,
Mkx.data(), onembed_x, ostride, odist,
&kind, FFTW_ESTIMATE);
}
// set batched 1D DCT-1 plans for z-directional transformation
{
int rank = 1;
int batch = nx;
int idist = nz;
int odist = nz;
int inembed_z[] = { 0 };
int onembed_z[] = { 0 };
int istride = 1;
int ostride = 1;
fftw_r2r_kind kind = FFTW_REDFT00; // DCT-1
plan_forward_z = fftw_plan_many_r2r(rank, &nz, batch,
M_in.data(), inembed_z, istride, idist,
Mkz.data(), onembed_z, ostride, odist,
&kind, FFTW_ESTIMATE);
}
// execution
fftw_execute(plan_forward_x);
fftw_execute(plan_forward_z);
// free fftw routines
fftw_destroy_plan(plan_forward_x);
fftw_destroy_plan(plan_forward_z);
fftw_cleanup();
return 0;
}
Задача ещё не решена.
Других решений пока нет …