speex在stm32f407单片机上的移植

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341030.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vmware网络桥接模式无法上网的解决办法

1.vmware->编辑->虚拟网络编辑器->桥接模式->选择有线网卡 2.VMware-虚拟机设置-网络适配器-桥接模式-复制物理网络连接状态、启动时连接 3.重启虚拟机,完成 如果出现连接到网络但是无法上网的情况,还需做如下处理 1.sudo gedit /etc/res…

oracle idm_深入了解Oracle IDM审核

oracle idm在处理敏感信息的任何产品中, 报告都是至关重要的功能。 同样适用于身份和访问管理工具。 Oracle IDM的审核模块是其OOTB报告功能的基础。 让我们快速了解一下审核引擎以及它如何促进OIM中的报告功能。 这里介绍的用例很简单– 在OIM中更改为用户记录。 …

C语言编写贪吃蛇游戏

自己用C语言编写一个贪吃蛇游戏,效果如图: 源代码可免费下载,传送门如下: 点击下载贪吃蛇游戏和源代码

两个常见的并发错误

作为Baeldung的编辑,我很高兴与一位作者一起撰写有关Java通用并发陷阱的文章。 这是一本不错的书,但是假设开发人员具有一定的能力。 我已经看到了几件即时并发失败的事情。 它们很容易添加到代码中,并保证为您提供奇怪的结果。 开发人员仍会…

AWS Loft的数据库周

这是我的笔记: https://databaseweekoctober2019sf.splashthat.com AWS上的数据库:正确工作的正确工具 在许多此类谈话中,我并没有做过深刻的记录。 我正在关注重点。 PostgreSQL排在MySQL之后。 AWS上8种类型的数据库: 关系…

Log4j Bug –减慢您的应用程序

最近,我们正在对流行的SaaS应用程序进行故障排除。 该应用程序间歇性地减慢了速度。 要从问题中恢复,必须重新启动应用程序。 在高流量期间,此应用有时会变慢; 有时在交通繁忙时也是如此。 没有凝聚力模式。 这种应用程序变慢并重…

javafx透明边框_JavaFX技巧6:使用透明颜色

javafx透明边框为用户界面元素选择正确的颜色始终是一个很大的挑战,但是当您开发可重用的框架控件时,开发人员就无法控制使用它们的应用程序的外观和感觉,这甚至更具挑战性。 尽管您可能总是将元素添加到默认的灰色背景之上,但是嵌…

win10 更新 英特尔显示器音频 后显示器音箱没有声音

问题 如题,win10系统更新后显示器音箱没有声音,且右击桌面声音查看播放设备 (说明:这是在解决问题之后截的图,没解决前,只有一个“扬声器/听筒”,原先是存在BenQ LCD的) 解决过…

unity ppr_智能自动PPR更改事件策略

unity pprADF开发人员普遍认为,将迭代器绑定更改事件策略设置为ppr在性能方面不是一件好事,因为此策略会强制框架刷新每个请求上绑定到此迭代器的所有属性绑定。 这不是真的! 框架仅刷新在请求期间已更改的属性和依赖于已更改属性的属性。 …

如何构建一个Maven插件

使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。 今天尝试Okta。 由于其插件生态系统的普及,Apache Maven仍然是Java领域中最流行的构建工具。 很容易找到一个现有的插件来…

javafx中css选择器_JavaFX技巧12:在CSS中定义图标

javafx中css选择器当您是像我这样来自Swing的UI开发人员时,您很有可能仍在代码中直接设置图像/图标。 最可能是这样的: import javafx.scene.control.Label; import javafx.scene.image.ImageView;public class MyLabel extends Label {public MyLabel(…

python去除图像光照不均匀_CVPR 2020 | 从重建质量到感知质量:用于低光照增强的半监督学习方法...

CVPR 2020 | 从重建质量到感知质量:用于低光照增强的半监督学习方法Code: https://github.com/flyywh/CVPR-2020-Semi-Low-Light1背景本篇为大家介绍我们组被2020年IEEE国际计算机视觉与模式识别会议(CVPR 2020)接收的工作《From Fidelity to Perceptual Quality: A…

多层陶瓷电容器用处_【科普贴】多层陶瓷电容器的制造工序,你知道吗?

本文将向大家介绍多层陶瓷电容器的结构及制造工序。多层陶瓷电容器的基本结构电容器用于储存电荷,其最基本结构如图1所示,在2块电极板中间夹着介电体。图1. 电容器的基本结构电容器的性能指标也取决于能够储存电荷的多少。多层陶瓷电容器为了能够储存更多…

分段式多级离心泵_离心泵与多级离心泵工作原理

离心泵工作原理:离心泵工作时,液体注满泵壳,叶轮高速旋转,液体在离心力作用下产生高速度,高速液体经过逐渐扩大的泵壳通道,动压头转变为静压头。性能特点:高效节能:泵有高效的水力形…

牛客网数据开发题库_数据库刷题—牛客网(21-30)

21.查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序CREATE TABLE employees ( emp_no int(11) NOT NULL, birth_date date NOT NULL, first_name varchar(14) NOT NULL, last_name varchar(16…

弹性堆栈介绍

当您运行对公司至关重要的软件时,您将无法获得仅用于分析一段时间前发生的事情的日志,让客户端告诉您您的应用程序已损坏,而您甚至不知道发生了什么是真实的问题。 解决该问题的方法之一是使用监视和日志记录。 大多数应用程序都将具有日志记…

access统计没有选课的人数_当代大学生发愁求职就业,更发愁“选课”,自主选课变成了负担...

当代大学生除了求职就业,最发愁的就是“选课”。不得不说,随着科技的发展,各行各业都发生了翻天覆地的变化。而在大学里的选课,也因此有了巨大的改变。过去,大学生上课,其实课程都是被安排好的,…

产线数字化软件源码_品质笔记⑥丨卢宇聪:把握数字化趋势,坚定创新发展道路...

6天5夜,跨越3座城市,深度走访7家企业,对话多位企业家……这是一趟开阔视野之旅。我接触了很多之前极少有机会接触的企业,比如做光缆的法尔胜泓晟集团、做节能装备的双良集团、做密封件的天生密封件有限公司等。我以前经常接触的是…

es 安装kopf_Elasticsearch-kopf导览

es 安装kopf当我需要一个插件来显示Elasticsearch的集群状态时,或者需要深入了解通常为经典插件elasticsearch-head所达到的索引时。 由于有很多建议,而且似乎是非官方的继任者,所以我最近更详细地研究了elasticsearch-kopf 。 我喜欢它。 我…

arm 交叉编译找不到so_搭建交叉编译环境并验证

1. 搭建编译环境并验证1.1 实验目的 掌握嵌入式开发环境、交叉编译器的搭建、安装和配置方法 熟悉Linux应用程序的编译、调试方法,能够验证X86平台和ARM平台的差异1.2 实验内容 交叉编译器环境搭建 编写一个典型的Linux应用程序 使用GDB调试Linux程序(PC平台) 用Mak…