现有的语音编码器大体可以分三种类型:波形编码器、音源编码器和混合编码器。一般来说,波形编码器的话音质量高,但数据率也很高。音源编码器的数据率很低,产生的合成话音音质有待提高。混合编码器使用音源编码器和波形编码器技术,数据率和音质介于二者之间。
比特速率:通信线路(或系统)单位时间(每秒)内传输的信息量,即每秒能传输的二进制位数,通常用Rb表示,其单位是比特/秒(bit/s或b/s,英文缩略语为bps)。
时延:指数据(一个报文或分组)从网络(或链路)的一端传送到另一端所需要的总时间,它由4部分构成:发送时延、传播时延、处理时延、排队时延。
复杂性:指语音编码的可实施的难度。
还原质量:语音的还原程度。
是把声音从模拟信号转成数字信号的一种技术。也就是A/D变换器。
**原理:**按照一个固定的频率去采样。所以对PCM来说有两个重要的指标:采样频率和量化精度。
**采样频率:**定义了每秒从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示。根据奈奎斯特定理,采样频率至少为信号频率的 2 倍,才能无失真的保存原有的音频信号。因此采样频率的高低决定了数字信号的保真度,自然是越高越好。
**量化精度:**是指可以将模拟信号分成多少个等级,量化精度越高,音乐的声压振幅越接近原音乐。
抽样信号代码:
clear;
clc;
T=0.0005;
t=-0.01:T:0.01;
fs=2000;
sdt=1/fs;
t1=-0.01:sdt:0.01;
xt=cos(2*pi*30*t)+sin(2*pi*120*t);
st=cos(2*pi*30*t1)+sin(2*pi*120*t1);
max = max(abs(st));
% 原始信号
figure;
subplot(2,1,1);plot(t,xt);title('原始信号');grid on;
subplot(2,1,2);stem(t1,st,'.');title('抽样信号');grid on;
PCM 编码分别得到符号位,段位码,段内码。代码如下:
function code=PCMcoding(S)
z=sign(S); %判断S的正负
MaxS=max(abs(S)); %求S的最大值
S=abs(S/MaxS); %归一化
Q=2048*S; %量化
code=zeros(length(S),8); %代码存储矩阵(全零)
% 段落码判断程序
for i=1:length(S)
if (Q(i)>=128)&&(Q(i)<=2048)
code(i,2)=1; %在第五段与第八段之间,段位码第一位都为"1"
end
if (Q(i)>32)&&(Q(i)<128)||(Q(i)>=512)&&(Q(i)<=2048)
code(i,3)=1; %在第三四七八段内,段位码第二位为"1"
end
if (Q(i)>=16)&&(Q(i)<32)||(Q(i)>=64)&&(Q(i)<128)||(Q(i)>=256)&&(Q(i)<512)||(Q(i)>=1024)&&(Q(i)<=2048)
code(i,4)=1; %在二四六八段内,段位码第三位为"1"
end
end
N=zeros(length(S)); %段内码判断程序
for i=1:length(S)
N(i)=bin2dec(num2str(code(i,2:4)))+1; %找到code位于第几段
end
a=[0,16,32,64,128,256,512,1024]; %量化间隔
b=[1,1,2,4,8,16,32,64]; %除以16,得到每段的最小量化间隔
for i=1:length(S)
q=ceil((Q(i)-a(N(i)))/b(N(i))); %求出在段内的位置
if q==0
code(i,(5:8))=[0,0,0,0]; %如果输入为零则输出"0"
else k=num2str(dec2bin(q-1,4)); %编码段内码为二进制
code(i,5)=str2num(k(1));
code(i,6)=str2num(k(2));
code(i,7)=str2num(k(3));
code(i,8)=str2num(k(4));
end
if z(i)>0
code(i,1)=1;
elseif z(i)<0
code(i,1)=0;
end %符号位的判断
end
code = reshape(code', 1, []);
end
% PCM 编码
pcm_encode = PCMcoding(xt);
figure;
stairs(pcm_encode);
axis([0 20 -0.1 1.1]);
title('PCM 编码');
grid on;
PCM 解码,编码时有一个归一化的操作,因此信号幅度已经丢失,在解码时要将上述提到的 max
参数传入,以便解码恢复到原来的幅度。代码如下:
function s=PCMdecoding(encode, max)
encode=(reshape(encode',8,length(encode)/8))';
l=size(encode,1);
a=[0,16,32,64,128,256,512,1024];
b=[1 1 2 4 8 16 32 64];
c=[0 1.5:15.5];
for i=1:l
x=encode(i,1);
T=bin2dec(num2str(encode(i,(2:4))))+1;
Y=bin2dec(num2str(encode(i,(5:8))));
if Y==0
k(i)=a(T)/2048;
else
k(i)=(a(T)+b(T)*c(Y))/2048;
end
if x==0
s(i)=-k(i);
else
s(i)=k(i);
end
end
s = s*max;
end
% PCM 译码
pcm_decode = PCMdecoding(pcm_encode, max);
figure;
subplot(2,1,1);plot(t, pcm_decode);
title('PCM 译码');grid on;
subplot(2,1,2);plot(t,xt);
title('原始信号');grid on;
% 计算失真度
da=0;
for i=1:length(t)
dc=(st(i)-pcm_decode(i))^2/length(t);
da=da+dc;
end
fprintf('失真度是:%.6f\n',da);
差分脉冲编码是对模拟信号幅度抽样的差值进行量化编码的调制方式(抽样差值的含义请参见“增量调制”)。这种方式是用已经过去的抽样值来预测当前的抽样值,对它们的差值进行编码。差值编码可以提高编码频率,这种技术已应用于模拟信号的数字通信之中。
DPCM与预测编码类似,只是它有一个量化步骤。量化步骤和PCM中的量化步骤类似,可以是均匀量化,也可以是非均匀量化
对于有些信号(例如图像信号)由于信号的瞬时斜率比较大,很容易引起过载,因此,不能用简单增量调制进行编码,除此之外,这类信号也没有像话音信号那种音节特性,因而也不能采用像音节压扩那样的方法,只能采用瞬时压扩的方法。但瞬时压扩实现起来比较困难,因此,对于这类瞬时斜率比较大的信号,通常采用一种综合了增量调制和脉冲编码调制两者特点的调制方法进行编码,这种编码方式被简称为脉码增量调制,或称差值脉码调制,用DPCM表示。
原理是减少或除去声音信号的多余成分以提高通信的有效性。
DPCM的操作流程是,首先生成预测值,然后用原始信号值减去预测信号生成误差值,接着量化误差值,得到量化后的误差值,并进行传输。重建时,利用量化后的误差值和预测信号来重构信号,从而得到图像。
原理:DPCM 的原理很简单,就是利用信号采样点之间的关联性,即每个采样点与相邻的采样点之间的差别很小,因此,就可以利用该特性进行压缩。总地来说,就是先存储第一个采样点的数值,再存储每个采样点与前一个采样点之间的差值,作为压缩的数据。这样的话,就可以利用第一个采样点,加上差值,求出第二个采样点,然后再加差值…一直持续下去,就可以求出所有采样点的数值了,也就完成了语音还原。而且,由于没个采样点之间相差很小,因此,差值也不会很大,所以就可以利用较少的比特数来存储压缩的数据了,这样也就实现了压缩。
原理: 在对语音信号采样时,编码系统会比较相邻两个时刻的采样值,若信号幅度增加,则编码为1;若信号幅度减少,则编码为0(也可以相反)。系统的编码结果仅仅需要1比特来表示信号的增量关系。
G.711是国际电信联盟ITU-T定制出来的一套语音压缩标准,它代表了对数PCM(logarithmic pulse-code modulation)抽样标准,是主流的波形声音编解码标准,主要用于电话。
G.711 标准下主要有两种压缩算法:
将一个13bit的pcm样本压缩成一个8bit的pcm样本。
算法原理:
A-law的公式入下,一般A=87.6
F ( x ) = s g n ( x ) { A ∣ x ∣ 1 + l n ( A ) ∣ x ∣ < 1 A 1 + l n ( A ∣ x ∣ ) 1 + l n ( A ) 1 A ≤ ∣ x ∣ ≤ 1 F(x) = sgn(x)\begin{cases} \frac{A|x|}{1+ln(A)} \quad \quad\quad|x|<\frac{1}{A}\\ \\\frac{1+ln(A|x|)}{1+ln(A)} \quad\quad\quad \frac{1}{A} \leq|x|\leq1 \end{cases} F(x)=sgn(x)⎩⎪⎨⎪⎧1+ln(A)A∣x∣∣x∣<A11+ln(A)1+ln(A∣x∣)A1≤∣x∣≤1 {e_{2ASK}(t) = \begin{cases} cos\omega_ct \quad \quad\quad出现概率为P\ 0\quad\quad\quad出现概率为1 - P\end{cases}
压缩过程:
(1)取符号位并取反得到s。
(2)获取强度位eee,获取方法如图所示。
(3)获取高位样本位wxyz。
(4)组合为seeewxyz,将seeewxyz逢偶数为取补数,编码完毕。
将一个14bit的pcm样本压缩成一个8bit的pcm样本。
算法原理:
U-law的公式如下,一般u=255
F ( x ) = s g n ( x ) l n ( 1 + μ ∣ x ∣ ) l n ( 1 + μ ) − 1 ≤ x ≤ 1 F(x) = sgn(x) \frac{ln(1+\mu|x|)}{ln(1+\mu)} \quad\quad-1\leq x\leq1 F(x)=sgn(x)ln(1+μ)ln(1+μ∣x∣)−1≤x≤1
压缩过程:
(1)取符号位并取反得到s。
(2)获取强度位eee,获取方法如图所示。
(3)获取高位样本位abcd。
(4)组合为seeeabcd,将seeeabcd全部取反,编码完毕。
在编码理论中,线性码是纠错码,码字的任何线性组合也是码字。线性代码传统上分为块代码和卷积代码,尽管可以将turbo代码视为这两种类型的混合代码。线性代码允许比其他代码更有效的编码和解码算法。线性代码用于前向纠错,并应用于在通信信道上传输符号的方法中,以便在通信中出现错误时,消息块的接收者可以纠正或检测到某些错误。
基本原理:把被分析信号用一个模型来表示,即将信号看作某一个模型(即系统)的输出。一个语音取样的现在值可以用若干个语音取样过去值的加权线性组合来逼近”。在线性组合中的加权系数称为预测器系数。通过使实际语音抽样和线性预测抽样之间差值的平方和达到最小值,能够决定唯一的一组预测器系数。
NLP(非线性处理):NLP位于减法器输出和回声消除器输出端口之间的发送路径上。从概念上来说,它是一种阻止低电平信号并传递高电平信号的设备。其功能是进一步降低电路回波不完全消除后剩余的残余回波电平,从而达到必要的低回波电平。
:把被分析信号用一个模型来表示,即将信号看作某一个模型(即系统)的输出。一个语音取样的现在值可以用若干个语音取样过去值的加权线性组合来逼近”。在线性组合中的加权系数称为预测器系数。通过使实际语音抽样和线性预测抽样之间差值的平方和达到最小值,能够决定唯一的一组预测器系数。
NLP(非线性处理):NLP位于减法器输出和回声消除器输出端口之间的发送路径上。从概念上来说,它是一种阻止低电平信号并传递高电平信号的设备。其功能是进一步降低电路回波不完全消除后剩余的残余回波电平,从而达到必要的低回波电平。