多媒體開發(5)&音訊特徵:聲音可以調大一點嗎?
阿新 • • 發佈:2021-01-12
基本上,現在常用的聲音取樣辦法是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.