天天看點

speex在stm32f407單片機上的移植1.擷取speex源碼2.添加源碼檔案到工程添加配置檔案和相關宏編譯追加

最近做的網絡語音的項目需要用到speex中的一些功能,查了一下資料發現移植給mcu的經驗大多零零碎碎,自己搗鼓了一晚上總算是移植好了,寫個部落格記錄一下。
           

1.擷取speex源碼

官方下載下傳:

官方位址

部落客移植用的源碼以及移植好的工程下載下傳:

提取碼552i

2.添加源碼檔案到工程

解壓源碼包需要保證有以下幾個檔案和目錄即可(圖中與移植無關的選項已經删掉,可以參考步驟1中部落客移植用的源碼)

speex在stm32f407單片機上的移植1.擷取speex源碼2.添加源碼檔案到工程添加配置檔案和相關宏編譯追加

打開需要移植的工程,添加新的分組speex,把源碼目錄libspeexdsp下的.c檔案全部添加進來

speex在stm32f407單片機上的移植1.擷取speex源碼2.添加源碼檔案到工程添加配置檔案和相關宏編譯追加

其中test開頭的幾個檔案可以暫時不包含,或者直接移除

speex在stm32f407單片機上的移植1.擷取speex源碼2.添加源碼檔案到工程添加配置檔案和相關宏編譯追加

添加頭檔案路徑,指定源碼目錄下的include目錄

speex在stm32f407單片機上的移植1.擷取speex源碼2.添加源碼檔案到工程添加配置檔案和相關宏編譯追加

添加配置檔案和相關宏

把源碼根目錄下的config.h.in檔案複制到源碼的include目錄下,并改名為config.h

修改後的源碼/include目錄如下圖

speex在stm32f407單片機上的移植1.擷取speex源碼2.添加源碼檔案到工程添加配置檔案和相關宏編譯追加

把源碼/include/speex目錄下的speexdsp_config_types.h.in檔案改名為speexdsp_config_types.h

修改後的源碼/include/speex目錄如下圖

speex在stm32f407單片機上的移植1.擷取speex源碼2.添加源碼檔案到工程添加配置檔案和相關宏編譯追加

在工程選項中添加宏HAVE_CONFIG_H,這個宏表示使用config.h檔案對庫進行配置

speex在stm32f407單片機上的移植1.擷取speex源碼2.添加源碼檔案到工程添加配置檔案和相關宏編譯追加

打開剛剛複制的config.h檔案(随便打開一個.c檔案,一般是第一個包含的檔案,右鍵open即可),修改以下三個宏,相關功能參考檔案中的注釋

#undef EXPORT --> #define EXPORT extern

#undef FLOATING_POINT–> #define FLOATING_POINT

#undef USE_SMALLFT–> #define USE_SMALLFT

speex在stm32f407單片機上的移植1.擷取speex源碼2.添加源碼檔案到工程添加配置檔案和相關宏編譯追加
speex在stm32f407單片機上的移植1.擷取speex源碼2.添加源碼檔案到工程添加配置檔案和相關宏編譯追加
speex在stm32f407單片機上的移植1.擷取speex源碼2.添加源碼檔案到工程添加配置檔案和相關宏編譯追加

打開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;

speex在stm32f407單片機上的移植1.擷取speex源碼2.添加源碼檔案到工程添加配置檔案和相關宏編譯追加

編譯

編譯時一定要在工程選項中選上c99mode,取消勾選use microlib

speex在stm32f407單片機上的移植1.擷取speex源碼2.添加源碼檔案到工程添加配置檔案和相關宏編譯追加
speex在stm32f407單片機上的移植1.擷取speex源碼2.添加源碼檔案到工程添加配置檔案和相關宏編譯追加

最後點選組建即可,正常的話會是0錯誤和若幹個警告,也就是移植成功了,庫的使用手冊位于源碼/doc目錄下,參考它使用庫中的API

speex在stm32f407單片機上的移植1.擷取speex源碼2.添加源碼檔案到工程添加配置檔案和相關宏編譯追加

追加

後來調試發現不勾選use microlib的話程式一直不運作,無奈隻能選上,但是會報exit函數未定義的錯誤,部落客的解決辦法是在config.h的最後添加這個函數的宏定義

#define exit(a) ;

speex在stm32f407單片機上的移植1.擷取speex源碼2.添加源碼檔案到工程添加配置檔案和相關宏編譯追加

還有speex_alloc函數也是個麻煩,經常申請失敗,部落客後來改用了正點原子的外部RAM申請函數才勉強把回聲消除給跑起來了(之前回聲消除連輸出都沒有),但是序列槽一直提示:“started acting funny and got slapped (reset). It swears it will behave now.”,而且消除的效果和沒消基本沒差,我試着把尾部大小調大些,但是調大以後又沒有輸出了,可能記憶體又吃緊了,可是能夠運作的範圍以内效果也并不好啊。