重采样Resample 的一些研究记录。
最近项目有需要重采样算法,先找了一下,主流的就是几个开源算法,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 的一些研究记录。的更多相关文章
- MS SQL SERVER 锁研究记录
首先创建一直数据表 ChenJi,有如下字段: ID, DanWeiID, Name, ChenJi CREATE TABLE [dbo].[ChenJi]( [ID] [int] NOT NUL ...
- pandas之时间序列(data_range)、重采样(resample)、重组时间序列(PeriodIndex)
1.data_range生成时间范围 a) pd.date_range(start=None, end=None, periods=None, freq='D') start和end以及freq配合能 ...
- java io 源码研究记录(一)
Java IO 源码研究: 一.输入流 1 基类 InputStream 简介: 这是Java中所有输入流的基类,它是一个抽象类,下面我们简单来了解一下它的基本方法和抽象方法. 基本方法: publ ...
- Apache OFBiz 研究记录01
作为Apache 的顶级项目: Apache OFBiz,功能十分强大,一般开发者很难用到全部功能. 这次笔者的研究主要集中在电子商务平台这一块,一步一步解构. OFBiz下载地址:http://of ...
- 有关信息ACM/ICPC竞争环境GCC/G++叠插件研究记录的扩展
0.起因 有时.DFS总是比BFS受人喜爱--毕竟DFS简单粗暴,更,而有些东西BFS不要启动,DFS它似乎是一个可行的选择-- 但是有一个问题,DFS默认直接写入到系统堆栈.系统堆栈和足够浅,此时O ...
- redis研究记录
1 redis安装 wget http://download.redis.io/redis-stable.tar.gz tar xvzf redis-stable.tar.gz cd redis-st ...
- prune研究记录(二)
发现之前自己写的程序里面的一个bug,就是关于再函数中改变全局变量的事情,有两个函数,在一个函数中定义了一个全局变量并进行了赋值操作,但是在后面的函数中没有申明全局变量,所以后面这个函数本来是想要改变 ...
- 关于 docsify ssr 的研究
关于 docsify ssr 的研究 docsify 虽然不错, 但是不支持 seo .官网虽然提供 seo 的一个简单示例, 但总总问题在 issues 中无人解答. 今天再次尝试, 解决了 ind ...
- springboot脚手架liugh-parent源码研究参考
1. liugh-parent源码研究参考 1.1. 前言 这也是个开源的springboot脚手架项目,这里研究记录一些该框架写的比较好的代码段和功能 脚手架地址 1.2. 功能 1.2.1. 当前 ...
随机推荐
- mysql innodb cluster 无感知集群
MySQL 8.0.12 innodb cluster 高可用集群部署运维管理手册 Innodb cluster 原理介绍 Innodb cluster 利用组复制的 pxos 协议,保障数据一致性 ...
- Nodejs回调加超时限制两种实现方法
odejs回调加超时限制两种实现方法 Nodejs下的IO操作都是异步的,有时候异步请求返回太慢,不想无限等待回调怎么办呢?我们可以给回调函数加一个超时限制,到一定时间还没有回调就表示失败,继续后面的 ...
- Django 学习之cookie与session
一.cookie和session的介绍 cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. cookie ...
- lnmp一键安装的缺点???
自己尝试几次在新的服务器上安装lnmp环境,每次都是一键安装,然后在/home/wwwroot/default目录下放对应的PHP文件就Ok了,很方便.其实也尝试过用命令行,就是很多命令的那种安装,中 ...
- 每日算法 - day 15
每日算法 those times when you get up early and you work hard; those times when you stay up late and you ...
- mysql设置timpstamp的默认值为 '0000-00-00 00:00:00' 时报错
问题:mysql设置timpstamp的默认值为 '0000-00-00 00:00:00' 时报错: ERROR 1067 (42000): Invalid default value for 'u ...
- python 开启http服务并下载文件
Python <= 2.3python -c "import SimpleHTTPServer as s; s.test();" 8000 Python >= 2.4p ...
- Linux开机流程及运行级别
启动流程: 没有运行程序的硬件除了会电人,没有别的用处.那么计算机是如何识别软件并执行的呢?下面介绍操作系统的开机启动流程: BIOS:开机时主动执行的第一个程序,会识别存储设备. MBR:第一个可开 ...
- jmeter学习笔记---循环控制器计数器函数助手
循环控制器与计数器,以及函数助手需要配合使用,实现循环 循环控制器的“循环次数”输入最大循环次数的参数 计数器:除输入最大值外,还需要输入“引用名称”,供后续请求使用 请求中,如果需要实现循环,需要借 ...
- Maven是什么,如何使用Maven
一.简单的小问题? 1.1.假如你正在Eclipse下开发两个Java项目,姑且把它们称为A.B,其中A项目中的一些功能依赖于B项目中的某些类,那么如何维系这种依赖关系的呢? 很简单,这不就是跟我们之 ...