1. 程式人生 > >多媒體開發(5)&音訊特徵:聲音可以調大一點嗎?

多媒體開發(5)&音訊特徵:聲音可以調大一點嗎?

基本上,現在常用的聲音取樣辦法是pcm,而對於壓縮音訊的解碼,得到的也pcm資料。這個pcm資料,只是一堆數值,有正有負,看這個值看不出什麼花樣。 聲音採集,採的是什麼呢? 採的是聲音的強度變化,也是聲音這種能量的強弱變化,這種強弱用分貝來表示,即dB。所以,pcm資料跟這個dB就一定有關係,這個關係是這樣的: dB=20∗log10(pcm) pcm=pow(10,(dB/20.0)) 模數轉換ADC時常用的位深是16bit,也就是用16位來表示一個sample,這裡不考慮偷懶而使用不足16位的情況。16位能表示65536個值,也就意味著有65536個dB可以表示出來,哪又怎麼樣?很厲害了嗎? 的確是比較厲害的了。 16位的pcm數值,分正負,那正數的範圍是0至32767,負數的範圍是-1至-32768,隨便挑幾個來看看,對應的dB是多少,如下圖: ![pcm對應的dB](https://free-picture1.oss-cn-shenzhen.aliyuncs.com/%E5%A4%9A%E5%AA%92%E4%BD%93%E5%BC%80%E5%8F%91/%E9%9F%B3%E6%95%88-%E6%94%B9%E5%8F%98%E9%9F%B3%E9%87%8F/%E5%90%84%E4%B8%AApcm%E5%AF%B9%E5%BA%94%E7%9A%84dB.jpg) 由上面的運算可知,16位的pcm值,如果不分正負,最大可以表示96dB,如果分正負,也能表示到90dB。90dB是什麼概念?有資料表明(我也不清楚什麼資料),85dB就會傷害了你,90dB相當於摩托車啟動的聲音--你有開過嗎? 所以,你的pcm資料需要去到90dB以上嗎?想禍害誰?一般情況下,能表示到90dB就很夠用了。 既然知道了pcm數值與dB的關係,就可以搞點事情了,比如把pcm轉成dB後再放大一點,再儲存成新的檔案,是不是播放就可以大聲一點了呢? 來做個實驗。 ``` import math import math import wave import audioread import contextlib import sys import math import struct def gainpcm(filepath): try: with audioread.audio_open(filepath) as f: with contextlib.closing(wave.open(filepath+'.wav', 'w')) as of: of.setnchannels(f.channels) of.setframerate(f.samplerate) of.setsampwidth(2) for buf in f: for i in range(0, len(buf)-2, 2): s = buf[i] + buf[i+1] pcm = struct.