在 Linux 系統下使用 GNU Radio 開發 C++ 模塊時,調用 FFTW 庫進行快速傅立葉變換(FFT)會拋出斷言錯誤:fftw: alloc.c:269: assertion failed: p。這通常發生在內存分配階段,導致程序崩潰。
d_buffer((fftwf_complex*)fftwf_malloc(sizeof(fftwf_complex)*d_packet_len)),
d_fft_plan(fftwf_plan_dft_1d(d_packet_len, d_buffer, d_buffer, FFTW_FORWARD, FFTW_ESTIMATE))
構造函數中使用 fftwf_malloc 分配緩衝區並創建 FFT 計劃,但在運行時觸發斷言失敗。
錯誤訊息 assertion failed: p 指向 FFTW 內部分配函數 alloc.c 第 269 行。這通常意味著:
fftwf_malloc 的參數異常(如 d_packet_len 為 0 或負值)d_packet_len > 0 且為 2 的冪次方(FFTW 效能最佳)fftwf_alloc_complex 替代手動 malloc,保證對齊要求fft::fft_complex 模塊,避免直接操作 FFTW// 正確分配複數緩衝區
d_buffer = fftwf_alloc_complex(d_packet_len);
if (!d_buffer) {
throw std::runtime_error("FFTW 內存分配失敗");
}
// 創建計劃
d_fft_plan = fftwf_plan_dft_1d(d_packet_len, d_buffer, d_buffer, FFTW_FORWARD, FFTW_MEASURE);
// 析構函數中釋放
fftwf_destroy_plan(d_fft_plan);
fftwf_free(d_buffer);
在 GNU Radio 中優先使用框架提供的 FFT 模塊(如 gr::fft::fft_complex),它們已處理內存管理、線程安全及優化配置。僅在需要極致性能或特殊算法時直接調用 FFTW。