关于FFTW的收尾工作–内存清理[亲测有效]

关于FFTW的收尾工作–内存清理[亲测有效]最近有个项目,涉及频谱转换,需要将时域数据转化到频域显示,自然而然用到FFT,提到FFT,不得又不说FFTW.FFTW的编译以及使用晚上很多例程,难度也不大,有兴趣可以自行百度。下边说说项目中遇到的FFTW的坑:先说一下项目大体用到FFTW的地方,刚开始只是处理来自拾音器的音频数据,于是我封装了个环形队列缓冲区,实时数据传入缓冲区,缓冲区启动数据处理线程,传出时域或者对应频域的数据到界…

大家好,欢迎来到IT知识分享网。

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

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

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

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

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

关于FFTW的收尾工作--内存清理[亲测有效]

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

有这么一段话:

关于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 .

 

 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/25262.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信