Speex庫除0錯誤 SIGFPE 排除

2021-10-12 16:52:03 字數 1244 閱讀 4189

在專案中使用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

據此檢視原始碼後確定是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錯誤,但是它內部的判斷較多,估計會慢一些。

speex編譯靜態庫for iOS

make install 在make install執行完成後,在 users share02 desktop libogg 這個路徑下面會生成i386的資料夾,在i386下面生成了libogg.a這個檔案,這就是i386環境用的ogg靜態庫 如果這個時候你的環境被你打亂,沒有按照順序成功執行,你可...

C語言中的除0操作

int fenzi 10 int fenm 0 int jieguo 0 jieguo fenzi fenm printf jieguo d jieguo 結果就是程式在編譯時直接報錯,說發生了整型數除0操作 結果就是程式可能正常編譯但是執行結果是 這裡的1.inf00是乙個特殊的符號吧 1.inf...

C C 中關於除 0 的處理

演算法競賽入門經典p14 code block測試 a4 表示式1.0 0.0 0.0 0.0的值是多少?include include using namespace std int main 輸出 inf nan 1.inf00 1.ind00a5 表示式1 0的值是多少?include inc...