算术编码、译码以及matlab实现

算术编码是一种采用的编码,我们用matlab语言来实现算术码的编码、译码过程。
首先,我们给定研究范围为 2元信号、用{0,1}符号来表示,然后我们假设发送方和接收方都知道符号0出现的概率p(0)和符号1出现的概率p(1)。
首先,我们对序列进行编码:
编码的语言描述,我们这里就不具体说明了,在百度百科等一系列文章中都可以找到,这里我们用matlab来实现这一过程:

M=2;%二元数据
p=[0.8 0.2];%需要自己给出
x=[1 0 1 0];%需要编码的序列,发行方想要发送的原始序列
low=0;%区间下界
high=1;%区间上界
for i=1:length(x)
    if x(i)==0
        high=high-(high-low)*p(2);
    elseif x(i)==1
        low=low+(high-low)*p(1);
    end
end

这样子,我们得到[1 0 1 0]这个序列的区间上下界为0.9536和0.928
接着,我们取上界这个小数,作为我们要发送的小数,但是,信道只能传输二进制,不能传输小数,于是,我们首先要将其转化成二进制,至于多少位,我们算原始序列的熵,然后向上取整,即:

N=ceil(-log2(P));
y=dectobin(high,2*N);%取high作为输出值
y=y(1:N);%输出序列;

我们在信道中传输的就是y,这个序列。
接着,我们考虑接受方,接到y这个序列之后,怎么译码。
这里我们分两种情况来讨论,若接收方很厉害,它神奇地知道发送方原始序列的长度的话,那么译码过程就变得很简单了,直接上代码:

%接收方:
%如果知道长度即length(x)
r = bintodec(y);
high_r=1;
low_r=0;
rec=zeros(length(x),1);
for i=1:length(x)
    if low_r+(high_r-low_r)*p(1)<r
        rec(i)=1;
        low_r=low_r+(high_r-low_r)*p(1);
    else
        rec(i)=0;
        high_r=high_r-(high_r-low_r)*p(2);
    end
end
rec%rec就是我们译码的结果

如果接收方很不幸,它不知道原始序列的长度,我们也有办法准确译码,只需要增加一个额外的环节,想知道怎么弄,可以看资源 算术码整个过程、主函数及所有子函数,含超详细注释.rar
详细代码见资源:
算术码整个过程、主函数及所有子函数,含超详细注释.rar
https://download.csdn.net/download/weixin_43102634/11916811

发布了39 篇原创文章 · 获赞 40 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43102634/article/details/102730892
今日推荐