语音算法基础:采样、量化和频谱

        想了很久该从哪里开头,那就从信号处理入手吧。

        语音信号是连续的一维时间序列,几十年前的语音处理系统都是模拟的,即通过各种电容电阻电感构建滤波器处理音频,这种方法好处就是实时性好,但是太粗糙了。最初的bose qc系列耳机的反馈滤波器就是用模拟电路的,当初国内研究他们的滤波参数,都只能拆电路板研究元器件指标,所以要复制还挺难。随着AD/DA转换期间成本下降,精细化处理语音信号成为了可能。这里面对语音的操作主要有两个,采样和量化。

        采样,即在时间轴上量化。连续信号必须间隔记录才能被处理。单位时间内采样点数,就是采样率,一般常用的有8kHz、16kHz和32kHz。一般cd音质是44.1kHz采样率,之所以是这个非整数值是因为模拟电视信号转为数字时的历史遗留问题,后面有时间咱再说。8kHz的采样率即一秒采8000个点,我们认为这样采到的点就算是原始音频的估计了,既然是估计,即不能完全恢复原始的信息,这是因为不是所有周期信号都能被采样到。比如一个正弦波频率是1Hz,如果事先知道它是正弦波,我们也至少在它的一个周期内要两个点才能列出一个二元方程组计算出这个正弦波的周期和幅度,而且如果这两个点取得不好,取到了正弦波的0相位和pi相位,这样也算不出来,因此要采到1Hz的信号必须大于2Hz的采样率。这就是奈奎斯特定律,采样率至少要大于被采信号的两倍。如果低于两倍的话就会发生信号的混叠:

                  

就比如上图的信号假设它是18Hz,但是我们的采样率就是21Hz,这样采到的信号看起来就像2Hz的,相当于信号的频率发生了移动,这就是混叠。为了对抗混叠,在降采样率的时候必须加入低通滤波,因为降采样会导致可采的信号频率变低了,但是信号中的高频成分是实际存在的,必须要去掉。

        量化,即在幅度维度上量化,把连续的幅值量化成离散的,离散化之后就可以进行编码。常用的量化方法有线性的非线性的,线性的就比如PCM(脉冲编码调制),量化和采样都是等间隔的。但是语音有一个特点就是动态范围非常大,有些信号幅度过高了,如果要达到好的量化效果,必须提高位宽,这会带来一些位宽的浪费。因此非线性的量化方法的思路是,为那些大幅度的信号安排更宽的量化间隔,而低幅度的信号间隔更低以兼顾精度。采取差分编码是另一种方法,差分编码的思想是不去直接编码幅度,而是去编码幅度的变化,由于幅度的变化一般远小于幅度绝对值,因此差分编码可以降低量化位宽。以上量化方法针对的是一维信号,很多时候对于二维的信号比如复信号的量化一般会使用矢量量化(VQ)这种聚类算法。

                     

        频谱,是从另一个角度去看信号。求解一个信号的频谱,本质上我们是找一个完备正交系去展开信号,这样一个信号就可以完全用分解的信号的线性组合表示了,最常用的完备正交系就是正余弦函数,对应求出的分解系数就是信号的傅里叶变换:

                                                                     

这个公式的基本意思是拿一个函数e^{-iwt}和要分解的函数相乘相加,这个操作可以认为是卷积或是求互相关。这样操作可以提取信号中某个成分w分量,正是因为e^{-iwt}作为基的正交完备性。正交完备性一般会在线性代数里面提及,这里是用函数而非向量去分解,但意义是差不多的。正交的意思是任意两个基做上述这个求互相关的操作得到的结果都是0;而完备的意思就是说,所有基可以完美分解这个函数。因此信号中某个周期的信号如果存在的话,用基做上面的计算就可以将其大小提取出来,而其他周期的信号因为和这个基正交就得到的计算结果为零。一般我们使用快速傅里叶变换(FFT)去离散求解傅里叶变换,FFT也是个非常优美的算法,后面有时间咱具体说一下。

        一般采样率*通道数*量化bit = 比特率,比如单声道16k 以int16量化的音频比特率就是256kbps。

        只有经过采样和量化,音频数据才能存储在计算机中 ,下一步我们介绍一下如何升降采样以及傅里叶变换如何离散化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章