最近項目有需要重采樣算法,先找了一下,主流的就是幾個開源算法,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