量化器用于将连续的数据转换为离散的序列,因此这个过程必定是有损的,此系统误差称为量化噪声.
均匀量化器
function [ code,mistake ] = QuantierEncode( audio,M )
%UNTITLED 此处显示有关此函数的摘要
% 此处显示详细说明
% 输入单声道信号,量化电平级数为M
% 对输入信号进行均匀量化并将量化结果转化为NRZ bianry序列
% 返回二进制编码序列和每位量化误差
len=length(audio);
%以[最小值,最大值]为量化区间
peak=max(audio);
least=min(audio);
%将区间分为M-1个部分,得到M个标志位
q=(peak-least)/(M-1);
QuantizerNum=least:q:peak
%将输入信号的每个电平值映射到量化标准值
index=zeros(1,len);mistake=zeros(1,len);
for ele=1:len
if audio(ele)== peak;
index(ele)=M;
continue;
end
%二分查找不小于当前电平值的标志位
Left=1;Right=M+1;
while Right-Left>1
mid=Left+fix((Right-Left)/2);
if QuantizerNum(mid)> audio(ele)
Right=mid;
else
Left=mid;
end
end
%比较上下标志位的误差,选择误差较小的标志位作为映射值
%并得到量化误差
if abs(QuantizerNum(Left)-audio(ele))>abs(QuantizerNum(Left+1)-audio(ele))
index(ele)=Left+1;
mistake(ele)=QuantizerNum(Left+1)-audio(ele);
else
index(ele)=Left;
mistake(ele)=QuantizerNum(Left)-audio(ele);
end
end
%选择码长
N=ceil(log2(M-1))+1;
code=zeros(len,N);
%将电平序号转化为二进制编码
for ele=1:len
for pos=N:-1:1
if mod(index(ele),2)==1
code(ele,pos)=1;
end
index(ele)=fix(index(ele)/2);
if index(ele)==0
break;
end
end
end
end
注意:在比较两标志位时,应比较当前值与两标志位间的距离,因此需要加abs.
性能评价
NULL