Speex库除0错误(SIGFPE)排除

本文介绍了一种解决Speex音频处理模块在实时音频流去噪过程中出现的崩溃问题的方法。通过对程序错误日志的分析及对fixed_generic.h文件中整数除法宏定义的修改,有效避免了因除以零导致的程序异常终止。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目中使用Speex对实时采集到的音频流进行去噪,发现运行一段时间后程序就会崩溃。

 

 

然后再让程序跑起来等着,出错后得到如下信息:

 

#0  0xb6e46390 in raise () from /lib/libpthread.so.0
#1  0xb6259ee4 in __aeabi_ldiv0 () at ../../../../gcc~linaro-4.8-2013.12/libgcc/config/arm/lib1funcs.S:1331
#2  0xb634e91c in ?? () from /yaffs2/app/lib/libAudioProcessModule.so


据此查看源码后确定是DIV32_16_Q15调用的DIV32_16引起的,故修改fixed_generic.h的最后几行:

200 #if 0
201 #define DIV32_16(a,b)     (((spx_word32_t)(a))/(spx_word16_t)(b))
202 #define PDIV32_16(a,b)     (((spx_word32_t)(a))/(spx_word16_t)(b))
203 #define DIV32(a,b)     (((spx_word32_t)(a))/(spx_word32_t)(b))
204 #define PDIV32(a,b)     (((spx_word32_t)(a))/(spx_word32_t)(b))
205 #else
206 //modify by sunxiaopeng
207 #define DIV32_16(a,b)    (0==(b)?0:(((spx_word32_t)(a))/(spx_word16_t)(b)))
208 #define PDIV32_16(a,b)   (0==(b)?0:(((spx_word32_t)(a))/(spx_word16_t)(b)))
209 #define DIV32(a,b)       (0==(b)?0:(((spx_word32_t)(a))/(spx_word32_t)(b)))
210 #define PDIV32(a,b)      (0==(b)?0:(((spx_word32_t)(a))/(spx_word32_t)(b)))
211 #endif


搞定收工!

 

 

注: 这里我用的编译选项是FIXED_POINT,因为如果用FLOATING_POINT很多Android手机跑不动。

    另外还有个编译选项是FIXED_POINT_DEBUG,开启后也可以避免除0错误,但是它内部的判断较多,估计会慢一些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunxiaopengsun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值