G.711语音编解码

2022-01-12  本文已影响0人  国宝级初学者

 G.711简介

ITU推出G.7XX系列的语音编码(speech codec),目前广泛应用的有:G.711,G.723,G.726,G.729。G.711是国际电报电话咨询委员会(CCITT)和国际标准化组织(ISO)提出的一系列有关音频编码算法和国际标准中的一种,应用于电话语音传输。G.711是一种工作在8KHz采样率模式下的脉冲编码解调(PCM)方案,采样值是8位的,占用带宽位64Kbps。按照奈奎斯特法则规定,采样率必须高于被采样信号最大频率的2倍,G.711可以编码的频率范围是从0Hz到4kHz。这一频率范围可覆盖大部分语音信号,它可以保留语音频率的前3个共振峰信息,而通过分析这3个共振峰的频率特性和幅度特性可以识别不同人。

G.711编码后的语音质量高,缺点是占用的带宽也很高。在实际选择语音压缩标准时,要综合考虑带宽、时延、算法复杂度等各种因素。

该标准中定义的两个主要的算法为:µ-law(在北美和日本使用)和 A-law(在欧洲和其他国家使用)。其中,后者是特别设计用来方便计算机处理的,本章介绍的是在中国使用的A-law的方法。

关于A-law和µ-law的官方定义如下:A律和µ律是使用在电话网络中的压缩系统设计方案,从而使8比特采样更具灵活性。这些8比特采样都是线性编码的。典型的在8kHz采样的基础上提取的12-14比特采样(线性)被压缩至8比特(对数),从而在64 kbps的数据通道上传输。在数据接收端,被传输的数据被转换成线性的12-14比特,然后播放。

G.711主要的一些性能参数如下:

采样率:8kHz

信息量:64kbps/信道

理论延迟:0.125毫秒

品质:MOS值4.10

在电话网络中规定,传输语音部分采用0.3kHz到3.3kHz的语音信号。这一频率范围可覆盖大部分语音信号,它可以保留语音频率的前3个共振峰信息,而0到0.3Hz和3.3kHz到4kHz未用,也被当成保护波段。总之,电话网络具有4kHz的带宽。由于需要通过这一带宽传送小幅变化的语音信号,需要借助于PCM(Pulse Code Modulation)脉冲编码调制,使模拟的语音信号在数字化时使用固定的精度,以最小的代价得到高质量的语音信号。

PCM编码需要经过连续的三步:抽样、量化和编码。抽样取决于信号的振幅随时间的变化的频率,由于电话网络的带宽是4kHz的,为了精确地表现语音信号,必须用至少8kHz的抽样率来取样。量化的任务是由模拟转换成数字的过程,但会引入量化误差,应尽量采用较小的量化间隔来减小这一误差。最后,编码完成数字化的最后工作,在编码的过程中,应保存信息的有效位,而且算法应利于快速计算,无论是编码还是解码。

G.711算法分析

在模拟语音信号中,零值电平附近的成分远大于峰值电平附近的成分。对于这些幅度分布不均匀的信号,需要采用非均匀量化技术。实现非均匀量化的方法之一是把输入量化器的信号x先进行压缩处理,再把压缩的信号y进行均匀量化。非均匀量化技术主要有两个指标,量化台阶大小和量化精度,都有详细的标准。本文采用16个量化台阶,并且A律编码的数据对象是12位精度的,它保证了压缩后的数据有5位的精度并存储到一个字节中。其编码方程如下:

其中,式1-1下式是A律的主要表达式,但它当x = 0时,y趋于负的无穷,这样不满足对压缩特性的要求,所以当x很小时应对它加以修正,过零点作切线,这就是式1-1的上式,它是一个线性方程,对应国际标准取值87.6。A为压扩参数,A=1时无压缩,A值越大压缩效果越明显。

其中,A为压缩参数取值87.6,x为规格化的12位(二进制)整数,实际为A律13折线。把归一化输入x轴和压缩信号输出y轴使用两种不同的方法划分。对x轴在 0~1(归一化)范围内不均匀分成8 段,分段的规律是每次以二分之一对分,对y轴在 0~1(归一化)范围内采用等分法,均匀分成 8 段,每段间隔均为 1/8。然后把x,y各对应段的交点连接起来构成 8 段直线,得到如图1-1所示的折线压扩特性,其中第 1、2 段斜率相同(均为 16),因此可视为一条直线段,故实际上只有 7 根斜率不同的折线。下面是用折线逼近的压缩方程曲线示意图:

上面的理论分析从本质上解释了G.711编码的基本原理,在此同时,我们也可以将A律压缩编码表示如下:

A 律解码方程为:

同时,我们也可以将将A律压缩解码表示示如下:

一般地,用程序进行A律编码解码有两种方法:一种是直接计算法,这种方法程序代码较多,时间较慢,但可节省宝贵的内存空间;另一种是查表法,这种方法程序量小,运算速度快,但占用较多的内存以存储查找表。本章采用的是直接计算法,按照上述的编码压缩表和解码压缩表来编写,下面是一般的使用G.711语音编码解码的整个算法流程。

G.711编码、G.711解码程序是采用的直接计算法来实现的,完全按照G.711标准算法的12位精度和转换表来编写计算的方法,虽然代码量较多并且在节省时间和功耗方面没有做到最好,但是满足实时性要求,效果验证正确可行。下面是G.711的编解码程序。

编码函数如下:

在编码函数中,完全一一对照“压缩编码表”实现。首先得到输入数据的正负符号,再按照“压缩编码表”进行移位与删余操作,得到“压缩编码表”右边的输出值。最后将其与0xD5或者0x55进行异或,得到输出结果返回。

此处进行异或的目的是为了加入传统的通信中的信源编码的扰码过程,避免出现大量的连续的1或者连续的0而导致出现差错或者增加硬件上的复杂度。使用0xD5或者0x55此类出现0和1的交替特殊数据是为了将其0、1打散,数据中则很少出现这样的数据,所以加扰的时候才会比较理想。另外,在移位和删余的过程中的操作使用多次循环实现,需读者细细体会才能明白其中的奥妙。下面是解码程序。

G.711解码程序也按照“压缩解码表”实现,与其一一对应。首先先将接收到的数据解扰,此处的解扰对应发送端的加扰,之后送入解码器。先得到输入数据的符号,再按照“压缩解码表”进行移位与补足剩余位,得到“压缩解码表”右边的源数据。

语音测试硬件环境

TLV320AIC23语音编解码模块是TI通用的语音处理模块。在TI的很多DSK和EVM上都有使用。DSK上一般使用的模拟输入是麦克风(microphone)或者是立体声(line)输入,将其转换成数字数据存入缓冲区被DSP处理。DSP处理完成之后将数字数据转换成模拟数据从耳机(headphone)或者是立体声(line)输出。其特性如下:

sigma-delta过采样技术

采样速率:8~96kHz

分辨率:16bit,20bit,24bit,32bit

信噪比:90 dBA(96kHz)

省电模式设置

包含麦克风输入,立体声输入,耳机输出,立体声输出

1.42~3.6V内核电压

2.7~3.6V缓冲器和模拟电路供电电压

兼容TI的McBSP

TLV320AIC23芯片有两个通道,控制通道和数据通道。控制通道使用单向的I2C接口实现,该通道只在配置芯片时使用,传输数据时空闲;数据通道使用双向的McBSP(多通道缓冲串口)接口实现,语音数据都通过此接口与DSP内核相连。

下图是TMS320C6455 DSK的AIC23模块的逻辑连接图:

有兴趣的读者参照TI文档“Evaluation Module for the TLV320AIC23 Codec and the TLV320DAC23 Audio DAC User’s Guide”可以参考DSK里面的硬件电路与设计。里面有详细的电路图和参考设计。关于TLV320AIC23芯片的硬件设计这里不再详细说明。

在TLV320AIC23的配置过程中,通过采用I2C总线配置TLV320AIC23语音模块,使其与DSP的McBSP模块无缝连接,实现语音的采集与播放,AIC23模块的主要配置参数表如下:

评估板上CPU外设McBSP与AIC23模块的连线图,如图1-4所示。

AIC23选择主模式或者DSP模式,McBSP选择从模式,发送时钟、接收时钟和帧同步信号均由AIC23模块提供。McBSP的发送帧同步信号FSX和接收帧同步信号FSR是相连的,所以当帧同步信号来时,McBSP就从DX和DR引脚上分别发送和接收两个字的数据(32bit)。

使能McBSP的中断,使McBSP每收到或发送完一帧的数据,发出中断,通知CPU接收数据。

CPU将数据读入缓冲区,为了不出现未处理的语音帧被覆盖,系统开设了一个320字的乒乓式缓冲区,缓冲区采用乒乓缓存的技术。首先,处理A的数据并发送,收到的数据放入B中,一帧数据处理后,处理B的数据,接收数据放入A中,这样循环切换。如图所示:

下面的程序是部分初始化的程序和伪代码:

使用乒乓缓冲区的好处是使得收发不冲突,在处理A数据的时候可以同时去收发B的数据,处理B数据的时候可以同时去收发A的数据,达到并行处理的目的。这在DSP的软件设计中常常用到。

G.711编解码算法按照前文介绍的方法来实现,对数据源压缩的精度是12位的,编码后变成8位的字节。经笔者在TI的DSK6455上测试,使用对于麦克风语音输入,使用G.711和未使用前后无明显区别;而对于立体声(line)输入的音乐,“背景噪声”会比较明显。原因是语音信号中没有高频分量,而音乐中有不同的高频分量,这些量化后的值在编解码前后有明显区别,位于12位精度的关键比特位置,使得恢复时候那些敏感比特位改变较大,声音会发生畸变。而麦克风语音则改动没有音乐那么明显,这就是G.711应用于电话网络传输的重要原因。

上一篇下一篇

猜你喜欢

热点阅读