重采樣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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM