关于FFTW的收尾工作--内存清理

最近有个项目,涉及频谱转换,需要将时域数据转化到频域显示,自然而然用到FFT,提到FFT,不得又不说FFTW.

FFTW的编译以及使用晚上很多例程,难度也不大,有兴趣可以自行百度。

下边说说项目中遇到的FFTW的坑:

先说一下项目大体用到FFTW的地方,刚开始只是处理来自拾音器的音频数据,于是我封装了个环形队列缓冲区,实时数据传入缓冲区,缓冲区启动数据处理线程,传出时域或者对应频域的数据到界面进行显示。程序结束时释放缓冲区内存,同时释放FFTW的申请内存。ok,没啥问题。

后边又加入了个音频设备到项目中,一样要显示频域与时域图,有了之前封装的接口,处理起来也不麻烦,很快搞定了。但是当程序结束退出时,问题来了,只要两个缓冲区同时进行使用,程序结束就会报错:

调试发现问题出在  fftw_destroy_plan()  这个地方,网上搜了一大圈,没发现大家进行处理的时候会有清理越界的bug.也找不到类似错误说明,只好去翻FFTW的官网说明。

有这么一段话:

After calling fftw_cleanup, all existing plans become undefined, and you should not attempt to execute them nor to destroy them. You can however create and execute/destroy new plans, in which case FFTW starts accumulating wisdom information again.

在调用了 fftw_cleanup后,所有现在存在的计划都会重新定义,并且无法尝试去执行或者销毁它们,但是你可以创建或者执行、销毁新的计划,此时FFTW将会再次进行算法信息的积累收集。

以上说明就很明显了。我在第一个缓冲区的析构函数中调用了fftw_cleanup(),导致第二个缓冲区进行析构时无法对FFTW的执行计划进行内存释放清理,因此产生bug.导致崩溃。

解决办法就是,注释掉fftw_cleanup(),并不会影响程序,也不会造成内存泄漏。

 

额外解释一下FFTW的Plan是什么:

FFTW’s planner saves some other persistent data, such as the accumulated wisdom and a list of algorithms available in the current configuration. 

FFTW的规划器保存了一些其他持久的数据,比如累积的优化方式和当前配置中可用的算法列表。(注:FFTW可以设置为根据电脑性能进行算法优化,并将其存储,以便下次调用时直接使用)。

Fun, just record it .

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值