A律13折线码编码输出、量化误差、以及对应的11位均匀量化编码

最近帮别人做了些通信原理的题目,发现里面都会涉及到A律13折线码编码的问题,为了以后碰到类似的问题方便计算,写了这个小程序,返回内容包括整个的解题思路,过程以及结果。


首先看个例子:



function [coded_output,quantization_error,Uniform_quantization]=A13(Sampling_pulse_val)
%输入:抽样脉冲值
%输出:coded_output:A律13折线码编码输出;
%       quantization_error:量化误差;
%       Uniform_quantization:对应于7位码(不包含极性码)的均匀量化11位码

%dec2bin()可以将十进制转换为二进制
if abs(Sampling_pulse_val)>=2048
    error('抽样脉冲值应在0到2047之间')
end
coded_output=zeros(1,8);%定义一个1*8的矩阵,每一个元素表示量化输出的一位,分别为C0C1……C7
%C0表示极性码,C1C2C3表示段落码,C4C5C6C7表示段内码
disp('____________________________________________')
if Sampling_pulse_val>0
    disp('因为抽样脉冲值大于零,所以极性码为1')
    coded_output(1)=1;%如果抽样脉冲值为正,则极性码为1
else
    disp('因为抽样脉冲值小于零,所以极性码为0')
    coded_output(1)=0;%否则,极性码为0
end
Sampling_pulse_val=abs(Sampling_pulse_val);

%根据抽样脉冲值确定段落码
%第一段
if Sampling_pulse_val>=0 && Sampling_pulse_val<16
    start=0;%该段的起始电平
    step=1;%该段的量化间隔
    coded_output(2:4)=[0 0 0];%该段的段落码
    disp('因为抽样脉冲值在[0,16)之间,所以段落码为000')
    %第二段
else if Sampling_pulse_val>=16 && Sampling_pulse_val<32
        start=16;%该段的起始电平
        step=1;%该段的量化间隔
        coded_output(2:4)=[0 0 1];%该段的段落码
        disp('因为抽样脉冲值在[16,32)之间,所以段落码为001')
        %第三段
    else if Sampling_pulse_val>=32 && Sampling_pulse_val<64
            start=32;%该段的起始电平
            step=2;%该段的量化间隔
            coded_output(2:4)=[0 1 0];%该段的段落码
            disp('因为抽样脉冲值在[32,64)之间,所以段落码为010')
            %第四段
        else if Sampling_pulse_val>=64 && Sampling_pulse_val<128
                start=64;%该段的起始电平
                step=4;%该段的量化间隔
                coded_output(2:4)=[0 1 1];%该段的段落码
                disp('因为抽样脉冲值在[64,128)之间,所以段落码为011')
                %第五段
            else if Sampling_pulse_val>=128 && Sampling_pulse_val<256
                    start=128;%该段的起始电平
                    step=8;%该段的量化间隔
                    coded_output(2:4)=[1 0 0];%该段的段落码
                    disp('因为抽样脉冲值在[128,256)之间,所以段落码为100')
                    %第六段
                else if Sampling_pulse_val>=256 && Sampling_pulse_val<512
                        start=256;%该段的起始电平
                        step=16;%该段的量化间隔
                        coded_output(2:4)=[1 0 1];%该段的段落码
                        disp('因为抽样脉冲值在[256,512)之间,所以段落码为101')
                        %第七段
                    else if Sampling_pulse_val>=512 && Sampling_pulse_val<1024
                            start=512;%该段的起始电平
                            step=32;%该段的量化间隔
                            coded_output(2:4)=[1 1 0];%该段的段落码
                            disp('因为抽样脉冲值在[512,1024)之间,所以段落码为110')
                            %第八段
                        else if Sampling_pulse_val>=1024 && Sampling_pulse_val<2048
                                start=1024;%该段的起始电平
                                step=64;%该段的量化间隔
                                coded_output(2:4)=[1 1 1];%该段的段落码
                                disp('因为抽样脉冲值在[1024,2048)之间,所以段落码为111')
                            end
                        end
                    end
                end
            end
        end
    end
end

position=floor((Sampling_pulse_val-start)/step);%得到该抽样脉冲在段内的位置,确定段内码
switch position
    case 0
        str=['该抽样脉冲值位于第','(',num2str(Sampling_pulse_val),'-',num2str(start),')/',num2str(step),'=',num2str(position),'段,所以段内码为0000'];
        coded_output(5:8)=[0 0 0 0];
    case 1
        str=['该抽样脉冲值位于第','(',num2str(Sampling_pulse_val),'-',num2str(start),')/',num2str(step),'=',num2str(position),'段,所以段内码为0001'];
        coded_output(5:8)=[0 0 0 1];
    case 2
        str=['该抽样脉冲值位于第','(',num2str(Sampling_pulse_val),'-',num2str(start),')/',num2str(step),'=',num2str(position),'段,所以段内码为0010'];
        coded_output(5:8)=[0 0 1 0];
    case 3
        str=['该抽样脉冲值位于第','(',num2str(Sampling_pulse_val),'-',num2str(start),')/',num2str(step),'=',num2str(position),'段,所以段内码为0011'];
        coded_output(5:8)=[0 0 1 1];
    case 4
        str=['该抽样脉冲值位于第','(',num2str(Sampling_pulse_val),'-',num2str(start),')/',num2str(step),'=',num2str(position),'段,所以段内码为0100'];
        coded_output(5:8)=[0 1 0 0];
    case 5
        str=['该抽样脉冲值位于第','(',num2str(Sampling_pulse_val),'-',num2str(start),')/',num2str(step),'=',num2str(position),'段,所以段内码为0101'];
        coded_output(5:8)=[0 1 0 1];
    case 6
        str=['该抽样脉冲值位于第','(',num2str(Sampling_pulse_val),'-',num2str(start),')/',num2str(step),'=',num2str(position),'段,所以段内码为0110'];
        coded_output(5:8)=[0 1 1 0];
    case 7
        str=['该抽样脉冲值位于第','(',num2str(Sampling_pulse_val),'-',num2str(start),')/',num2str(step),'=',num2str(position),'段,所以段内码为0111'];
        coded_output(5:8)=[0 1 1 1];
    case 8
        str=['该抽样脉冲值位于第','(',num2str(Sampling_pulse_val),'-',num2str(start),')/',num2str(step),'=',num2str(position),'段,所以段内码为1000'];
        coded_output(5:8)=[1 0 0 0];
    case 9
        str=['该抽样脉冲值位于第','(',num2str(Sampling_pulse_val),'-',num2str(start),')/',num2str(step),'=',num2str(position),'段,所以段内码为1001'];
        coded_output(5:8)=[1 0 0 1];
    case 10
        str=['该抽样脉冲值位于第','(',num2str(Sampling_pulse_val),'-',num2str(start),')/',num2str(step),'=',num2str(position),'段,所以段内码为1010'];
        coded_output(5:8)=[1 0 1 0];
    case 11
        str=['该抽样脉冲值位于第','(',num2str(Sampling_pulse_val),'-',num2str(start),')/',num2str(step),'=',num2str(position),'段,所以段内码为1011'];
        coded_output(5:8)=[1 0 1 1];
    case 12
        str=['该抽样脉冲值位于第','(',num2str(Sampling_pulse_val),'-',num2str(start),')/',num2str(step),'=',num2str(position),'段,所以段内码为1100'];
        coded_output(5:8)=[1 1 0 0];
    case 13
        str=['该抽样脉冲值位于第','(',num2str(Sampling_pulse_val),'-',num2str(start),')/',num2str(step),'=',num2str(position),'段,所以段内码为1101'];
        coded_output(5:8)=[1 1 0 1];
    case 14
        str=['该抽样脉冲值位于第','(',num2str(Sampling_pulse_val),'-',num2str(start),')/',num2str(step),'=',num2str(position),'段,所以段内码为1110'];
        coded_output(5:8)=[1 1 1 0];
    case 15
        str=['该抽样脉冲值位于第','(',num2str(Sampling_pulse_val),'-',num2str(start),')/',num2str(step),'=',num2str(position),'段,所以段内码为1111'];
        coded_output(5:8)=[1 1 1 1];
end
disp(str)
disp('根据上述分析,该抽样脉冲的编码输出为:')
disp(num2str(coded_output))

%计算量化误差
%首先计算译码输出
out = start+position*step+0.5*step;%一定是正的
% if Sampling_pulse_val<0
%     out=-out;%译码输出
% end
quantization_error=Sampling_pulse_val-out;%计算量化误差
disp('____________________________________________')
str_=['译码输出为:',num2str(start),'+',num2str(position),'*',num2str(step),'+0.5*',num2str(step),'=',num2str(out)];
disp(str_)
disp('量化误差为:')
str_=[num2str(Sampling_pulse_val),'-',num2str(out),'=',num2str(quantization_error)];
disp(str_)

%计算对应的均匀量化11位码
disp('____________________________________________')
Uniform_quantization=dec2bin(abs(out),11);
disp('对应于该7位码的均匀量化11位码为:')
str_=num2str(Uniform_quantization);
disp(str_)


猜你喜欢

转载自blog.csdn.net/stone_Yu/article/details/72313919