最近项目有需要重采样算法,先找了一下,主流的就是几个开源算法,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. Windows的本地时间(LocalTime)、系统时间(SystemTime)、格林威治时间(UTC-Time)、文件时间(FileTime)之间的转换

    今天处理了一个Bug,创建历史数据时脚本函数的起始时间不赋值或者赋0值时,计算引擎推给历史库的UTC时间为-288000000000,一开始以为是bug,经过分析后发现不赋值默认给起始时间赋0值,而此 ...

  2. 单例设计模式和main方法

    设计模式就是在大量的实践中总结和理论之后优选的代码结构.编程风格.以及解决问题的思考方式. 说白了设计模式就是在实际编程中逐渐总结出的解决问题的套路,类似于数学公式. 类的单例设计模式:在开发过程中有 ...

  3. 学习JNA,Jnative

    首先说下JAVA调用DLL,Java调用DLL的常用方法大致为几种,JNI,JNA,Jnative等,但实现与易用性差距还是很大,1.JNI用的人比较多,但相对来说比较麻烦要熟悉c并且要使用javac ...

  4. Xcode下载途径

    Xcode除了能在Appstore直接下载外,还可以用开发者账号登陆开发者中心[https://developer.apple.com/download/]下载对应的资源. 在开发者中心下载的好处是, ...

  5. python中时间戳的探索

    声明 本文章只针对python3.6及以上版本. 问题提出 首先,我们先import一些必要模块: In [1]: from datetime import datetime, timezone, t ...

  6. 二 Mybatis架构&MybatisDao的两种开发方式(原始Dao,接口动态代理)

    MyBatis架构图 三个对象: SqlSessionFactoryBuilder.SqlSessionFactory.SqlSession SqlSessionFactoryBuilder:主要用来 ...

  7. 微信小程序中,如何实现显示,隐藏密码的功能

    最近在搞小程序的开发,遇到隐藏,显示密码的功能的时候,电脑上调试没问题,但是手机上面点击却没有效果,必须要跳转到其他页面再跳回来,才能正常显示. 一时间搞得我很头疼,查找资料后,终于知道了是什么原因. ...

  8. 【剑指Offer面试编程题】题目1385:重建二叉树--九度OJ

    题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7 ...

  9. 五、java基础-关键字this_static_super_abstract_final,finalize()方法finally语句块

    1.关键字this 含义:this 是一个引用类型,代表当前对象,引用类型里面必然保存内存地址,在堆中的每个对象中存储,保存内存地址指向自身. 用法: 1)this可以用在成员方法中,里面保存内存地址 ...

  10. for 循环遍历数据动态渲染html

    本案例通过ajax动态获取数据,然后遍历出数据渲染html小心踩坑:因为有时候不注意,渲染页面的时候只能输出最后一个数据所以正确写法为下:如果AJAX数据请求成功的情况下: html <div ...