zoukankan      html  css  js  c++  java
  • 重采样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

  • 相关阅读:
    go多平台编译打包
    正则表达式
    Java 线程安全问题的本质
    Thread interrupt() 线程中断的详细说明
    git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks push -v --tags origin master:master Logon failed, use ctrl+c to cancel basic credential prompt.
    kafka 消费组功能验证以及消费者数据重复数据丢失问题说明 3
    kafka 副本机制和容错处理 -2
    Mat使用详解
    MySql Binlog 说明 & Canal 集成MySql的更新异常说明 & MySql Binlog 常用命令汇总
    ElasticSearch 集群基本概念及常用操作汇总(建议收藏)
  • 原文地址:https://www.cnblogs.com/shinedream/p/12134331.html
Copyright © 2011-2022 走看看