%均匀量化的PCM编码函数
%参数说明: a:输入序列
% n:量化电平数
% q:信号/量化噪声
% a_quan:量化后的电平值 (十进制数)
% code:将电平值编码后的输出 (二进制数0101)
function [q,a_quan,code]=U_pcm(a,n)
%U_PCM uniform PCM encoding of a sequence
% [SQNR,A_QUAN,CODE]=U_PCM(A,N)
% a=input sequence.
% n=number of quantization levels (even).
% sqnr=output SQNR (in dB).
% a_quan=quantized output before encoding.
% code=the encoded output.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%归一化输入
amax=max(abs(a));
a_quan=a/amax;
b_quan=a_quan;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%获得量化区间
d=2/n; %delta
q=d.*[0:n-1];
q=q-((n-1)/2)*d; %量化区间
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%量化过程
for i=1:n
a_quan(find((q(i)-d/2 <= a_quan) & (a_quan <= q(i)+d/2)))=... % ... 代表换行
q(i).*ones(1,length(find((q(i)-d/2 <= a_quan) & (a_quan <= q(i)+d/2))));
% 逐个量化区间内进行量化, (a-delta/2) <= x <= (a+delta/2)
b_quan(find( a_quan==q(i) ))=(i-1).*ones(1,length(find( a_quan==q(i) )));
end
q=q*amax;
a_quan=a_quan*amax; %将归一化的信号还原回电平值
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%编码过程
nu=ceil(log2(n));
code=zeros(length(a),nu);
for i=1:length(a)
for j=nu:-1:0
if ( fix(b_quan(i)/(2^j)) == 1)
code(i,(nu-j)) = 1; %对电平值进行编码
b_quan(i) = b_quan(i) - 2^j;
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%求信号/量化噪声比
sqnr=20*log10(norm(a)/norm(a-a_quan));
评论0