我有几个关于PCM的Matlab程序,不知道如何运行,希望大家多多指教,谢谢了。
%PCM Encoding
function [code,codeout,error,codeout2,codeout3]=PCMcoding(Range,S)
code=zeros(1,8);
%% Range=max(S);%量化范围
Normalization=abs(S)/Range;
deta=1/2048;%量化单位
if sign(S)==1%极性划分
code(1)=1;%正数
else
code(1)=0;%负数
end
detas=ceil(Normalization/deta);
%ceil(x) Round x to the nearest
%integer toward positive infinity :ceil(3.1)=4 and ceil(-3.1)=3
%detas是量化后的数值
if detas>128
code(2)=1;
if detas>512
code(3)=1;
if detas>1024
code(4)=1;
end
elseif detas>256
code(4)=1;
end
elseif detas>32
code(3)=1;
if detas>64
code(4)=1;
end
elseif detas>16
code(4)=1;
end
%以上是段落码的生成
%具体算法见《通信原理》P277
Tribal=bin2dec(num2str(code(2:4)))+1;
% Example
% bin2dec('010111') returns 23
% bin2dec('010 111') also returns 23
% bin2dec(' 010111') also returns 23
if Tribal==1
Interval=1;
else Interval=(2^(Tribal+2))/16;
end
%计算的是每段的步长 example:111代表第八段1024-2048,
%具体算法:
%111由二进制转化位十进制为7,则Tribail=7+1=8
%Interval=2^(8+2)/16=1024/16=64 即为步长
%出现bin2dec(num2str(code(2:4)))+1=0+1=1表示为第一段0-16
%当然是Interval=1;
%例子源于《通信原理》P278
if Tribal==1
code(5)=(2^3)*Interval
code(6)=code(5)*(2^3)*Interval+(2^2)*Interval
code(7)=code(5)*(2^3)*Interval+code(6)*(2^2)*Interval+(2^1)*Interval
code(8)=code(5)*(2^3)*Interval+code(6)*(2^2)*Interval+code(7)*(2^1)*Interval+(2^0)*Interval
else
code(5)=2^(Tribal+2)+(2^3)*Interval
code(6)=2^(Tribal+2)+code(5)*(2^3)*Interval+(2^2)*Interval
code(7)=2^(Tribal+2)+code(5)*(2^3)*Interval+code(6)*(2^2)*Interval+(2^1)*Interval
code(8)=2^(Tribal+2)+code(5)*(2^3)*Interval+code(6)*(2^2)*Interval+code(7)*(2^1)*Interval+(2^0)*Interval
end
%仍以上例
%+1270,段落码111,段内码0011,介于1216-1280
%最后输出为(1216+1280)/2=1248(量化单位)
if Tribal==1
codeout=code(5)*(2^3)*Interval+code(6)*(2^2)*Interval+code(7)*(2^1)*Interval+code(8)*(2^0)*Interval;
else
codeout=2^(Tribal+2)+code(5)*(2^3)*Interval+code(6)*(2^2)*Interval+code(7)*(2^1)*Interval+code(8)*(2^0)*Interval+(Interval/2);
end
%量化误差为1270-1248=22(量化单位)
error=abs(detas-codeout);
%12位的均匀量化码组
codeout2=dec2bin(codeout);
codeout3=[num2str(code(1)) codeout2];
%实现数据的A/D转换