最近项目有需要重采样算法,先找了一下,主流的就是几个开源算法,Speex / Opus / ffmpeg / sox

1.最早的事Speex,算法源自CCRMA(Center for Computer Research in Music and Acoustics)斯坦福大学音乐和声学计算机研究中心

非常独立的一个算法,支持ARM的NEON和 X86的SIMD(SSE),使用也很简单,主要就3个函数init / process / destroy

很容易从Speex的sourcecode里面抽取出来。

2.看到有文章说Speex老矣,已经被Opus取代,Opus里面也有ReSample重采样算法.而且归skype所有,名字叫SILK

不过很遗憾,Opus里面重采样只支持 8K/12K/16K/24K/48K 和 8K/12K/16K 之间的互转,如果是从MP3的44.1K转到48K

Opus建议使用Speex的算法。

3.ffmpeg也有重采样,不过他也说如果你不满意,建议使用Sox的Resample算法

4.Sox

恰好需要用到的就是44100/22050转到32000/16000,所以Opus的就没法用。

主要研究的就是Speex / ffmpeg / sox.

先从Speex开始,后面2个以后有空再研究,不研究算法的细节,只说应用。

Speex的Resample是独立的一个模块,编译很容易,毫无困难,不加任何参数就可以。

push到设备上,很遗憾,37秒的一段audio竟然花了107秒才转换完成,没法忍受。

做了不同的优化尝试,结果还是很明显的。

  无优化 打开O2 打开O3
无Neon 107s 76s 75s
Neon 34s 5s 4s

这个结果有些意外,Neon能提升1-2倍的速度是意料之中的,但是O2/O3选项结合Neon能有这么明显的效果的确出乎意料。

Neon开关的打开:主要还是2个选项,宏定义里面指定USE_NEON,编译器在head里面会告诉你打开这2个开关。

-mfpu = neon

-mfloat-abi = softfp

其他还有一些辅助的参数,比如

-mtune

-march

-mcpu

参数怎么选?我们使用的是厂商的toolchain和标准的arm版本的gcc既有区别又很相似

1. 可以乱写一个字符,比如haha,编译出错自然会告诉你能支持哪些cpu/arch/fpu/的选项。

2. 可以在target平台上查看一下cpu的信息,比如

cat /proc/cpuinfo
processor : 0
model name : ARMv7 Processor rev 5 (v7l)
BogoMIPS : 38.40
Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xc07
CPU revision : 5

Hardware : Qualcomm Technologies, Inc MDMxxxx
Revision : 0000
Serial : 0000000000000000
Processor : ARMv7 Processor rev 5 (v7l)

3. O2 / O3为什么有这么大的作用,有待后续进一步研究。

可以通过下面的命令看enable了哪些优化选项

-Q -O2 --help=optimizers

重采样Resample 的一些研究记录。的更多相关文章

  1. MS SQL SERVER 锁研究记录

    首先创建一直数据表 ChenJi,有如下字段: ID, DanWeiID,  Name,  ChenJi CREATE TABLE [dbo].[ChenJi]( [ID] [int] NOT NUL ...

  2. pandas之时间序列(data_range)、重采样(resample)、重组时间序列(PeriodIndex)

    1.data_range生成时间范围 a) pd.date_range(start=None, end=None, periods=None, freq='D') start和end以及freq配合能 ...

  3. java io 源码研究记录(一)

    Java IO 源码研究: 一.输入流 1  基类 InputStream 简介: 这是Java中所有输入流的基类,它是一个抽象类,下面我们简单来了解一下它的基本方法和抽象方法. 基本方法: publ ...

  4. Apache OFBiz 研究记录01

    作为Apache 的顶级项目: Apache OFBiz,功能十分强大,一般开发者很难用到全部功能. 这次笔者的研究主要集中在电子商务平台这一块,一步一步解构. OFBiz下载地址:http://of ...

  5. 有关信息ACM/ICPC竞争环境GCC/G++叠插件研究记录的扩展

    0.起因 有时.DFS总是比BFS受人喜爱--毕竟DFS简单粗暴,更,而有些东西BFS不要启动,DFS它似乎是一个可行的选择-- 但是有一个问题,DFS默认直接写入到系统堆栈.系统堆栈和足够浅,此时O ...

  6. redis研究记录

    1 redis安装 wget http://download.redis.io/redis-stable.tar.gz tar xvzf redis-stable.tar.gz cd redis-st ...

  7. prune研究记录(二)

    发现之前自己写的程序里面的一个bug,就是关于再函数中改变全局变量的事情,有两个函数,在一个函数中定义了一个全局变量并进行了赋值操作,但是在后面的函数中没有申明全局变量,所以后面这个函数本来是想要改变 ...

  8. 关于 docsify ssr 的研究

    关于 docsify ssr 的研究 docsify 虽然不错, 但是不支持 seo .官网虽然提供 seo 的一个简单示例, 但总总问题在 issues 中无人解答. 今天再次尝试, 解决了 ind ...

  9. springboot脚手架liugh-parent源码研究参考

    1. liugh-parent源码研究参考 1.1. 前言 这也是个开源的springboot脚手架项目,这里研究记录一些该框架写的比较好的代码段和功能 脚手架地址 1.2. 功能 1.2.1. 当前 ...

随机推荐

  1. mysql innodb cluster 无感知集群

    MySQL 8.0.12 innodb cluster 高可用集群部署运维管理手册 Innodb cluster 原理介绍 Innodb cluster  利用组复制的 pxos 协议,保障数据一致性 ...

  2. Nodejs回调加超时限制两种实现方法

    odejs回调加超时限制两种实现方法 Nodejs下的IO操作都是异步的,有时候异步请求返回太慢,不想无限等待回调怎么办呢?我们可以给回调函数加一个超时限制,到一定时间还没有回调就表示失败,继续后面的 ...

  3. Django 学习之cookie与session

    一.cookie和session的介绍 cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. cookie ...

  4. lnmp一键安装的缺点???

    自己尝试几次在新的服务器上安装lnmp环境,每次都是一键安装,然后在/home/wwwroot/default目录下放对应的PHP文件就Ok了,很方便.其实也尝试过用命令行,就是很多命令的那种安装,中 ...

  5. 每日算法 - day 15

    每日算法 those times when you get up early and you work hard; those times when you stay up late and you ...

  6. mysql设置timpstamp的默认值为 '0000-00-00 00:00:00' 时报错

    问题:mysql设置timpstamp的默认值为 '0000-00-00 00:00:00' 时报错: ERROR 1067 (42000): Invalid default value for 'u ...

  7. python 开启http服务并下载文件

    Python <= 2.3python -c "import SimpleHTTPServer as s; s.test();" 8000 Python >= 2.4p ...

  8. Linux开机流程及运行级别

    启动流程: 没有运行程序的硬件除了会电人,没有别的用处.那么计算机是如何识别软件并执行的呢?下面介绍操作系统的开机启动流程: BIOS:开机时主动执行的第一个程序,会识别存储设备. MBR:第一个可开 ...

  9. jmeter学习笔记---循环控制器计数器函数助手

    循环控制器与计数器,以及函数助手需要配合使用,实现循环 循环控制器的“循环次数”输入最大循环次数的参数 计数器:除输入最大值外,还需要输入“引用名称”,供后续请求使用 请求中,如果需要实现循环,需要借 ...

  10. Maven是什么,如何使用Maven

    一.简单的小问题? 1.1.假如你正在Eclipse下开发两个Java项目,姑且把它们称为A.B,其中A项目中的一些功能依赖于B项目中的某些类,那么如何维系这种依赖关系的呢? 很简单,这不就是跟我们之 ...