Я не могу получить параметры размера для 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 стала плохой из-за неправильных параметров, заданных для сценария настройки. Документация теперь обновлена.