Двумерные параметры размера FFTW R2C

Я не могу получить параметры размера для fftwf_plan_dft_r2c_2d

  • Вход: матрица N строк по M столбцов.
  • Вывод: N строк по этажам (M/2) + 1 матрица столбцов?

Являются ли параметры входными или выходными размерами?

Пытался указать размер ввода. Это то, что говорит GDB

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 1676.0x768]
0x637eed72 in n1fv_8 () from C:\devfiles\bin\libfftw3f-3.dll
(gdb) backtrace
#0  0x637eed72 in n1fv_8 () from C:\devfiles\bin\libfftw3f-3.dll
#1  0x7c91a000 in ntdll!RtlpUnWaitCriticalSection ()
   from C:\WINDOWS\system32\ntdll.dll

Никакой другой поток не использует fftw в то время.

Контекст:

Herbs::MatrixStorage<float> spectrum_in(frame_a.nRowsGet(),frame_a.nColsGet());
Herbs::MatrixStorage<std::complex<float>> 
    spectrum_out(frame_a.nRowsGet(),frame_a.nColsGet()/2+1);

Проверьте повреждение кучи, вызванное возможными ошибками выделения памяти в классе MatrixStorage. Строки в матрице представляют собой один большой блок. rowGet возвращает указатель на заданную строку.

memset(spectrum_in.rowGet(0),0
    ,sizeof(float)*spectrum_in.nRowsGet()*spectrum_in.nColsGet());
memset(spectrum_out.rowGet(0),0
    ,sizeof(float)*spectrum_out.nRowsGet()*spectrum_out.nColsGet());
heapdump(); //Heap seams to be fine after these

Причины сигсевг

FFT::PlanFloat_2dR2C plan(spectrum_in,spectrum_out);

Конструктор плана делает следующее

plan=FFT::PlanFloat_2dR2C::PlanFloat_2dR2C(Herbs::MatrixStorage<InputType>& buffer_in
,Herbs::MatrixStorage<OutputType>& buffer_out)
{
plan=fftwf_plan_dft_r2c_2d
    (
     buffer_in.nRowsGet()
    ,buffer_in.nColsGet()
    ,buffer_in.rowGet(0)
    ,(fftwf_complex*)buffer_out.rowGet(0)
    ,FFTW_MEASURE
    );
}

РЕДАКТИРОВАТЬ:

Вместо этого я использовал предварительно скомпилированную DLL. GCC может создавать плохой код в 32-разрядной версии Windows (из примечаний к выпуску):

Удален архаичный хак выравнивания стека, который не работал с gcc-4.7/i386. Добавлен хак для выравнивания стека, необходимый для gcc на Windows/i386. Мы пожалеем об этом через десять лет (см. предыдущее изменение).

РЕДАКТИРОВАТЬ 2:

DLL стала плохой из-за неправильных параметров, заданных для сценария настройки. Документация теперь обновлена.


person user877329    schedule 11.12.2013    source источник
comment
Можете ли вы уточнить, что вы не понимаете - похоже, у вас уже есть правильные размеры для 2D R2C FFT на месте?   -  person Paul R    schedule 11.12.2013
comment
Количество элементов в выходном и входном массиве различается. Итак, что следует передать функции? В настоящее время sigsegvs предполагает, что это выходной размер   -  person user877329    schedule 11.12.2013
comment
О, хорошо - я понимаю, о чем вы сейчас спрашиваете - требуемые параметры размера - это размеры входных (N x M), то есть логические размеры вашего БПФ.   -  person Paul R    schedule 11.12.2013


Ответы (1)


Ты прав. Для ввода с плавающей запятой NxM или двойного ввода вы должны выделить выход Nx(M/2+1) fftwf_complex или fftw_complex.

Параметрами являются входной размер. Например,

#include "fftw3.h"

#define Width 1024
#define Height 768

int main(){
        float input[Width*Height];
        fftwf_complex *fft = new fftwf_complex[((Width/2)+1)*Height];
        fftwf_plan fplan = fftwf_plan_dft_r2c_2d(Height, Width,
                                 (float*)input, fft, FFTW_ESTIMATE);
        fftwf_execute(fplan);
        fftwf_destroy_plan(fplan);
}

См. главу 4.3 «Базовый интерфейс» руководства пользователя FFTW.

person Dmitri Chubarov    schedule 11.12.2013