您的位置:首页 > 编程语言 > Python开发

一些数字音频的基础定义

2015-06-15 00:31 701 查看

一些定义

最近在看python的相关东西,然后看到了对音频的处理方面的知识,然后记录一下:

声道(audio channel)

采样率(sampling rate)

位元度(bit-depth)

比特率(bit rate)

本文中用到的工具是Sony家的Sony Sound Forge(以下简称SSF),这是一款对音频进行处理的工具。这款工具可以对多声道(multi-channel)音频文件进行处理,最多可以处理32声道的音频文件。每个声道都有自己的波形(waveform)。

举个例子:

一个双声道或立体声(stereoscopic sound)文件,拖到SSF中后,可以看到其两个波形图:

(来自http://www.sonycreativesoftware.com/

上图中,上面的波形是Channel #1,来自左声道,也就是你的左边的扬声器发出的声波,下面的是Chanel #2即右声道,是你邮右边的扬声器发出的声波。

那如果是单声道(mono sound),那么波形只会有一个,这样两个扬声器发的都是这个声道的声音。

另外四声道(quadraphonic sound)也属于立体声的范畴,它的扬声器摆放位置是前左、前右、后左、后右四个方位,听众坐其中。可以增加一个增强低音的扬声器,这就是所谓的4.1声道系统。五声道(5.1 surrounded sound)跟四声道一样,属于立体声范畴,它的扬声器的位置是前左、前中、前右、后左、后右,听众坐其中,其中0.1跟4.1的0.1相同,是一个低音加强的扬声器。

采样率(sampling rate)就是每秒选取声波上的样本数。你每秒的样本采得多,那你就能得到更多的音频细节,进而能描述得该段更清楚。就好比,你面前有一行汉字,你拿到足够近的话,那就只能看到单个汉字,拿远的话就能看到更多的字,有助于理解句子的意思。我们再用一个波形具体说一下。如下图所示:


(来自http://www.sonycreativesoftware.com/

下面分别采取三种采样来尽可能准确的还原这个正弦波。

第一种采样率8kHz,第二种采样率44100Hz,第三种96000Hz,他们的波形图分别由上到下由下图所示:


(来自http://www.sonycreativesoftware.com/

图中的黑点就表示所采之样,8000Hz的采样率这根本就不是还原吧,与“原”相差甚远,基本看不出正弦波的样子,44100Hz还差不多可以看得出是正弦波,只是棱角比较分明,这种不准确的地方人耳(20Hz~20000Hz)已经是听不出来的,就是说给你听原版和采样率是44100Hz版本的音频,你是听不出区别的,而且这个采样率就是普通CD的采样率。而96000Hz的就更加接近正弦波了。很明显可以看出,每秒的采样数与还原程度成正比,即每秒样本数越多,越能更好的还原。

好音质谁都想要,但是好音质也带来了“大体积”。8000Hz的采样率的文件差不多3M左右,44100Hz的16M左右,而96000Hz的差不多((96000/8000)*3M)36M左右。

数字音乐最重要的两个参数(dynamic duo):采样率与位元度(bit-depth)。位元度是指,每个样本的比特位数(number of bits)。打个比方对于台湾人来说,他们看得懂正体,看简体反而蒙圈,还是采样率所举的那行汉字,这里的比特位数就好比汉字的笔画数,比如那行字里有个简体“龙”,那他可能会想一想这是对应正体的哪个字,但是如果给他写成“龍”,他很快就能知道是龙的意思,这样也就加快他理解整句话的意思。学计算机的都知道bit是最小的单位,非0即1。那比特位越多,那肯定这个样本就被描述得越细致,样本细致了,那整段音频自然也就细致了。

这里要提到“量化”(quantization)这一过程。量化顾名思义就是要数量化,具体化。那么如何给音频量化,那就是通过比特位的位数来描述该样本。量化过程就是一个化零为整的过程,它将各个“零”划(化)到离其最近的“整”处。下面举个例子:


(来自http://www.sonycreativesoftware.com/

这是一把二进制的且只有4个刻度的尺子,相当于十进制的且只有10(1cm~10cm)个刻度的尺子。现在要用这把尺子测量一块橡皮,这块橡皮的一头对齐00处,而另一头却在01到10之间,如果离01近些,那我们将这个零头划给01,我们就说这块橡皮的长度是01;如果离10近些,那就划给10,橡皮的长度也就变成了10。如果这个橡皮刚好在01和10的中间,那么划给哪边?这个划分涉及到一个误差的问题,本来这个橡皮的长度是01.0111,如果归给10的话,会产生10-01.0111=00.0001的误差,而且如果00.0001处是音乐的细节或重要的一个点的话,那么这个点将被抹去,进而该音乐将无法完美诠释和展现。这样的话,我们换一把尺子。如下图:


(来自http://www.sonycreativesoftware.com/

这样看来,这把尺子比起上一把细分了很多,可以将橡皮的长度更好的划分,或许橡皮的00.0111就在尺面上。果然,就在尺子上,这样不就更准确了吗。

采样率和位元深不是越大越好,你若是要烧曲子到CD盘里,那么你需要的采样率是44100Hz和位元深是16bit。

比特率(bit rate)是指单位时间携带或传输的比特位,这个应该要和位元深匹配吧。有一个公式来描述比特率

(本图来自https://en.wikipedia.org/wiki/Bit_rate

下面是一个python例子,需要安装的模块是wave

#import numpy
import wave
#import pylab

file = wave.open(r'D:\yanhuayileng.wav', 'rb')
# 读取格式信息
# (nchannels, sampwidth, framerate, nframes, comptype, compname)
params = file.getparams()
# 取前四个:声道数, 量化位数(byte单位), 采样频率, 采点数
nchannels, sampwidth, framerate, nframes = params[:4]
print nchannels, sampwidth, framerate, nframes
#我用周杰伦的烟花易冷.wav做测试,输出如下:
#2 2 44100 11606004
#意思是双声道,2byte(16bit)的位元深,采样率是44100Hz,采点数11606004个


参考

1: http://www.sonycreativesoftware.com/de/basic_definitions_of_digital_audio

2: http://www.pcwaishe.cn/portal.php?mod=list&catid=58

3: https://en.wikipedia.org/wiki/Audio_bit_depth

4: https://en.wikipedia.org/wiki/Dolby_Digital

5: http://sebug.net/paper/books/scipydoc/wave_pyaudio.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sound python