最近做的网络语音的项目需要用到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.”,而且消除的效果和没消基本没差,我试着把尾部大小调大些,但是调大以后又没有输出了,可能内存又吃紧了,可是能够运行的范围以内效果也并不好啊。