最近做的網絡語音的項目需要用到speex中的一些功能,查了一下資料發現移植給mcu的經驗大多零零碎碎,自己搗鼓了一晚上總算是移植好了,寫個部落格記錄一下。
1.擷取speex源碼
官方下載下傳:
官方位址
部落客移植用的源碼以及移植好的工程下載下傳:
提取碼552i
2.添加源碼檔案到工程
解壓源碼包需要保證有以下幾個檔案和目錄即可(圖中與移植無關的選項已經删掉,可以參考步驟1中部落客移植用的源碼)

打開需要移植的工程,添加新的分組speex,把源碼目錄libspeexdsp下的.c檔案全部添加進來
其中test開頭的幾個檔案可以暫時不包含,或者直接移除
添加頭檔案路徑,指定源碼目錄下的include目錄
添加配置檔案和相關宏
把源碼根目錄下的config.h.in檔案複制到源碼的include目錄下,并改名為config.h
修改後的源碼/include目錄如下圖
把源碼/include/speex目錄下的speexdsp_config_types.h.in檔案改名為speexdsp_config_types.h
修改後的源碼/include/speex目錄如下圖
在工程選項中添加宏HAVE_CONFIG_H,這個宏表示使用config.h檔案對庫進行配置
打開剛剛複制的config.h檔案(随便打開一個.c檔案,一般是第一個包含的檔案,右鍵open即可),修改以下三個宏,相關功能參考檔案中的注釋
#undef EXPORT --> #define EXPORT extern
#undef FLOATING_POINT–> #define FLOATING_POINT
#undef USE_SMALLFT–> #define USE_SMALLFT
打開speexdsp_config_types.h,補全以下幾行:
typedef short spx_int16_t;
typedef unsigned short spx_uint16_t;
typedef int spx_int32_t;
typedef unsigned int spx_uint32_t;
編譯
編譯時一定要在工程選項中選上c99mode,取消勾選use microlib
最後點選組建即可,正常的話會是0錯誤和若幹個警告,也就是移植成功了,庫的使用手冊位于源碼/doc目錄下,參考它使用庫中的API
追加
後來調試發現不勾選use microlib的話程式一直不運作,無奈隻能選上,但是會報exit函數未定義的錯誤,部落客的解決辦法是在config.h的最後添加這個函數的宏定義
#define exit(a) ;
還有speex_alloc函數也是個麻煩,經常申請失敗,部落客後來改用了正點原子的外部RAM申請函數才勉強把回聲消除給跑起來了(之前回聲消除連輸出都沒有),但是序列槽一直提示:“started acting funny and got slapped (reset). It swears it will behave now.”,而且消除的效果和沒消基本沒差,我試着把尾部大小調大些,但是調大以後又沒有輸出了,可能記憶體又吃緊了,可是能夠運作的範圍以内效果也并不好啊。