精华内容
下载资源
问答
  • 以一幅灰度图像为例对通信系统的通信过程进行仿真,过程如下图所示: 1、不经过信道编码与译码,图像经过BSC信道传输后的误码率,此处的编码方法为霍夫曼编码。MATLAB仿真程序如下: clear all clc I0=imread...

    以一幅灰度图像为例对通信系统的通信过程进行仿真,过程如下图所示:
    图1 通信过程
    1、不经过信道编码与译码,图像经过BSC信道传输后的误码率,此处的编码方法为霍夫曼编码。MATLAB仿真程序如下:

    clear all
    clc
    I0=imread('Penguinshead3.jpg');
    I1=rgb2gray(I0);
    subplot(1,3,1),imshow(I0),title('原图')
    subplot(1,3,2),imshow(I1),title('灰度图')
    [m,n]=size(I1);
    I=reshape(I1,m*n,1);
    P_value=zeros(1,256);
    %---------------------------------------概率;
     for i=0:255
         P_value(i+1)=length(find(I==i))/(m*n);  %各像素值概率
     end
    f=numel(I);                                      %频数
    P_symbol=zeros(m*n,1);
    for i=1:m
        for j=1:n
            P_symbol(i,j)=length(find(I==unique(i)))/f;%各信源符号概率矩阵
        end
    end 
    %--------------------------------霍夫曼编码
    k=0:255;
    dict=huffmandict(k,P_value);           %生成编码字典
    huffmancode=cell(length(I),2);         %元胞数组存放对应编码
    for i=1:m*n
        huffmancode{i,1}=I(i);
    end
    for i=1:length(I)
        for j=1:256
            if huffmancode{i,1}==dict{j,1}
                huffmancode{i,2}=dict{j,2};
            end
        end
    end
    %----------------------------通过BSC信道
    bsc_code=huffmancode;        %通过bsc信道后的编码
    for i=1:length(I)
        bsc_code{i,2}=bsc(huffmancode{i,2},0.001);
    end
    % --------------------------------译码
    bsccode=bsc_code{1,2};
    for i=2:length(I)
        bsccode0=bsc_code{i,2};
        L=length(bsccode0);
        bsccode(end+1:end+L)=bsccode0;       %转换为一串字符
    end
    deco=huffmandeco(bsccode',dict);         %译码
    %----------------------------------------译码后存在错误
    rdeco=zeros(length(I),1);                      %错误处理
    L=length(I)-length(deco);
    if L<=0
        rdeco=deco(1:end-abs(L));                  %截断
    else
        a=ones(abs(L),1);                          %补足   
        rdeco(1:length(deco))=deco;
        rdeco(length(deco)+1:end)=195*a;  
    end
    Ideco=reshape(rdeco,m,n);
    subplot(1,3,3),imshow(uint8(Ideco));title('经BSC信道传输后的图像');
    error=length(find(Ideco~=I1));
    fprintf('误码率:%.4f\n',error/length(I));
    

    传输结果如下图所示:
    图2 无信道译码与编码
    上图表示的是仅经信源编码与译码,新宿的得到的结果。可以看到图像存在失真,此时的误码率为:
    在这里插入图片描述
    2、经过信道译码,此处的信道编码采用汉明码。MATLAB仿真程序如下:

    clear all
    clc
    I0=imread('Penguinshead3.jpg');
    subplot(1,3,1),imshow(I0),title('原图')
    I1=rgb2gray(I0);
    subplot(1,3,2);imshow(I1);title('信源发出的消息');
    [m,n]=size(I1);
    I=I1(:);
    P=zeros(1,256);
    %---------------------------------------概率;
    for i=0:255
        P(i+1)=length(find(I==i))/(m*n);
    end
    %---------------------------------------编码译码
    k=0:255;
    dict=huffmandict(k,P);                    %生成霍夫曼码字典
    enco=huffmanenco(I,dict);                 %霍夫曼码信源编码
    code=encode(enco,15,11);                  %汉明码信道编码
    bsc_code=bsc(code,0.001);                 %通过BSC信道
    rcvcode=decode(bsc_code,15,11);           %汉明码信道译码
    deco=huffmandeco(enco,dict);              %霍夫曼码信源译码
    Ireco=reshape(deco,m,n);
    subplot(1,3,3);imshow(uint8(Ireco));title('信宿接收的消息');
    error=length(find(Ireco~=I1));            %误码数
    fprintf('误码率:%0.4f\n',error/length(I));
    

    经信道传输后的图像如下图所示:
    图3 经过信源信道编码与译码
    此时图像无失真,误码率为:
    在这里插入图片描述
    可以明显看到第二种方式的误码率远远小于第一种方式的误码率,由此可看出在通信过程中进行信道编码与译码的重要性。
    而方式1的误码率高的原因有以下三点:
    (1)传输图像较小,像素值少。图像越小,编码表的码字越少,经信道传输后,越容易出现非编码表码字。(2)对于编码表码字处理的译码译码方式简单,对于译码后的编码像素值采用舍弃译码后末尾的像素值与补足像素值(由于使用的图像右下角的像素值在195左右,因此对与译码后长度不足的像素值序列,补充像素值为195的像素)的方式存在较大的误差。(3)未经过信道编码与译码。
    必须说明的是由于上述第(2)点原因,在BSC信道的转移概率比较大的时候(p>0.1)时,方式1能够运行通过的概率很低,当信道的转移概率很小时,该方式的误码率也会比较小。

    展开全文
  • java实现三种信源编码

    2010-12-18 12:03:39
    信息通过信道传输到信宿的过程即为通信。... 3)为了编成惟一可译码,计算第i个信源符号的累加概率 4)将累加概率 用二进制数表示; 5)取 对应二进制数的小数点后位构成该信源符号的二进制码...
    信息通过信道传输到信宿的过程即为通信。
    信源编码的目的是要减少冗余,提高编码效率。

    一、香农码
    编码步骤:
    1)将个信源符号按概率递减的方式进行排列;
    2)按香农不等式计算出每个信源符号的码长;
    3)为了编成惟一可译码,计算第i个信源符号的累加概率
    4)将累加概率 用二进制数表示;
    5)取 对应二进制数的小数点后位构成该信源符号的二进制码字。

    public class Shannon {

    /**Shannon算法
    *
    * 1.符号按概率递减的方式排列
    * 2.计算每一个符号的码长l
    * 3.计算累加概率
    * 4.将累加概率用二进制表示
    * 5.取小数点后l位为信源符号的二进制码字
    *
    */
    double cumu = 0;//累加概率
    Data data;//符号集
    double prob;//概率
    int codelength;//码长
    // List list = new ArrayList();

    /*累加概率的二进制转换*/
    public static String getBinary(double cumu,int length){

    String codeword = "";
    for(int i = 0; i < length; i++){
    cumu *= 2;//小数转化二进制乘以2
    if(cumu >= 1){
    cumu -= 1;
    codeword += 1;//大于1取1
    }else{
    codeword += 0;//小于1取0
    }
    }
    return codeword;
    }
    /*实现香农编码*/
    public List isShannon(List list){
    for(int i = 0;i < list.size();i++){
    data = (Data)list.get(i);//得到每一个符号
    prob = data.getProb();//取出符号概率
    codelength =(int)Math.ceil(Math.log(1/prob)/Math.log((double)2));//计算码长
    data.setCodeLength(codelength);//添加码长
    data.setCodeword(getBinary(cumu, codelength));//添加码字
    list.set(i, data);//改变符号列表信息
    cumu += prob;//累加概率
    }
    return list;
    }
    }

    二、费诺码
    编码步骤:
    1)信源符号以概率递减的次序排列起来;
    2)将排列好的信源符号按概率值划分成两大组,使每组 的概率之和接近于相等,并对每组各赋予一个二元码符号“0”和“1”;
    3)将每一大组的信源符号再分成两组,使划分后的两个组的概率之和接近于相等,再分别赋予一个二元码符号;
    4)依次下去,直至每个小组只剩一个信源符号为止;
    5)信源符号所对应的码字即为费诺码。

    public class Fano {

    /**Fano算法
    *
    * 1.信源符号按概率递减的方式排列
    * 2.将排列好的符号分成两组,使每组的概率之和接近相等并对赋于0和1
    * 3.将每一大组再分组,同2
    * 4.依次下去,直到只剩一个信源符号
    * 5.信源符号所对应的码字即为费诺码
    */
    Data data;//符号集
    double prob;//概率
    int codelength;//码长
    /*费诺码的实现*/
    public List isFano(List list){
    double[] arr = new double[list.size()];
    for(int i = 0;i < list.size();i++){
    data = (Data)list.get(i);//得到每一个符号
    prob = data.getProb();//取出符号概率
    arr[i] = prob;//将概率存放在一个数组中
    }
    String[] codeword = getGroup(arr,0,arr.length-1);//符号编码
    for(int i = 0; i < codeword.length; i++){
    data = (Data)list.get(i);//得到每一个符号
    data.setCodeword(codeword[i]);//加上码字
    data.setCodeLength(codeword[i].length());//加上码长
    list.set(i, data);//加上符号
    }


    return list;//返回改变的列表
    }
    /*用分组法求出符号的编码*/
    public static String[] getGroup(double[] a,int i,int j){

    String[] p = new String[a.length]; //返回的字符编码
    for(int t = 0; t < a.length; t++){
    p[t] = "";//初始化
    }
    int flag = 0;//分组间隔点
    if(i < j){
    //采用递归法,将数组分为两半
    double sum = 10;//比较中间量
    for(int k = i; k <= j; k++){
    //取累和间距最小量
    if(Math.abs(sumGroup(a,i,k)-sumGroup(a, k+1, j)) < sum){
    //以flag为中间点,分别累加左边和右边,然后比较
    sum=Math.abs(sumGroup(a,i,k)-sumGroup(a, k+1, j));
    flag = k;//取出中间点
    }
    }
    String[] p1 = getGroup(a, i, flag);//递归第一组(左边)
    String[] p2 = getGroup(a, flag+1, j);//递归第二组(右边)
    for(int m = i; m <= flag; m++){
    p[m] = "0" + p1[m];//第一组赋值0
    }
    for(int m = flag+1; m <= j; m++){
    p[m] = "1" + p2[m];//第二组赋值1
    }
    }

    return p;//得到分组后的码字
    }
    /*求数组第i位到第j位的和*/
    public static double sumGroup(double[] a, int i, int j ){
    double total = 0;
    for(int k = i; k <= j; k++){
    total = total + a[k];
    }
    return total;
    }
    }

    三、霍夫曼码
    编码步骤:
    1)将q个信源符号按概率递减的方式排列起来;
    2)用“0”、“1”码符号分别表示概率最小的两个信源符号,并将这两个概率最小的信源符号合并成一个新的符号,从而得到只包含q-1个符号的新信源,称之为S信源的S1缩减信源;
    3)将缩减信源中的符号仍按概率大小以递减次序排列,再将其最后两个概率最小的符号合并成一个符号,并分别用“0”、“1”码符号表示,这样又形成了由q-2个符号构成的缩减信源S2;
    4)依次继续下去,直到缩减信源只剩下两个符号为止,将这最后两个符号分别用“0”、“1”码符号表示;
    5)从最后一级缩减信源开始,向前返回,沿信源缩减方向的反方向取出所编的码元,得出各信源符号所对应的码符号序列,即为对应信源符号的码字。

    public class Huffman {

    /**Huffman算法
    *
    * 1.信源符号按概率递减的方式排列
    * 2.用0、1分别表示最小的两个符号,将这两个符号合并成一个新的符号,从而得到一个新信源
    * 3.将新信源重排列,再取最后两位最小的分别用0、1表示,并合并,得到一个缩减信源
    * 4.重复步骤3,直到只有两符号为止,将这两个符号分别用0、1表示
    * 5.从最后一级缩减信源开始向前返回,反向列出所编码元,得到各信源符号的码字
    */
    /*霍夫曼的实现*/
    public void isHuffman(List l){
    List list = new ArrayList();//新建一个表
    list.addAll(l);//复制
    for(int i = list.size()-1; i >=0 ; i--){
    double d = ((Data)list.get(i)).getProb();//得到概率
    TreeNode root = new TreeNode(d);//将概率作为根结点
    list.remove(i);//移除最后一项
    list.add(i, root);//将结点添加到最后一项
    }
    createTree(list);//创建树
    TreeNode root = (TreeNode)list.get(0);//得到最终树的根结点
    list.clear();//清空列表
    printTree(root,list);//根据树的叶子得到码字、码长
    for(int i = 0; i < list.size(); i ++){
    Data data = new Data();
    data.setSymbol(((Data)l.get(i)).getSymbol());//取出符号
    data.setProb(((Data)l.get(i)).getProb());//取出概率
    data.setCodeLength(((Data)list.get(i)).getCodeLength());//取出码长
    data.setCodeword(((Data)list.get(i)).getCodeword());//取出码字
    l.set(i, data);//将新得的Data对象加到列表
    }
    }
    //创建树
    public static void createTree(List list){
    double d1 = ((TreeNode)list.get(list.size()-1)).data;//取出倒数第一个
    double d2 = ((TreeNode)list.get(list.size()-2)).data;//取出倒数第二个
    double cumu = d1 + d2;//最小两个相加
    TreeNode root = new TreeNode(cumu);//将和作为树根结点
    root.left = (TreeNode)list.get(list.size()-1);//将倒数第一个作为左孩子
    root.right = (TreeNode)list.get(list.size()-2);//将倒数第二个作为右孩子
    list.remove(list.size()-1);//移除最后二个
    list.remove(list.size()-1);
    sortList(list, root);//将根结点加到列表,并排序
    if(list.size() > 1){
    createTree(list);//只要list大于1时就递归创建树
    }else{

    }
    }
    //将树转为码字
    public static void printTree(TreeNode root,List list){
    Data data = new Data();
    if(root.left != null){
    root.left.codeword = root.codeword + "0";//左孩子加0
    printTree(root.left,list);//遍历左孩子
    }
    if(root.right != null){
    root.right.codeword = root.codeword + "1";//右孩子加1
    printTree(root.right,list);//遍历右孩子
    }
    //如果是树的叶子,刚将其作为对应的码字
    if(root.left == null && root.right == null){
    data.setProb(root.data);//概率
    data.setCodeLength(root.codeword.length());//码长
    data.setCodeword(root.codeword);//码字
    Util.sortList(list, data);//将Data对象加入列表
    }
    }
    /*将根结点顺序插入list*/
    public static void sortList(List list,TreeNode root){
    int i = 0;
    if(list.size() == 0){
    list.add(root);//list为空,直接插入
    }else{
    while(i < list.size()){
    if(((TreeNode)list.get(i)).data <= root.data){
    list.add(i,root);//将根结点按顺序插入
    break;
    }else{
    i++;
    }
    }
    if(i == list.size()){
    list.add(i,root);//走到最后为最小,直接插入
    }
    }
    }
    }
    /*创建一棵树*/
    class TreeNode {

    public double data;//结点数据
    public String codeword = "";//码字
    public TreeNode left;//左孩子
    public TreeNode right;//右孩子

    public TreeNode(double data){
    this.data = data;
    }
    }
    展开全文
  • 本课题是实现信源编解码:PCM编码+ 数据压缩+信道(加性噪声)+数据解压缩+PCM译码。利用C语言使编码器实现输入信号完成PCM技术的三个过程:采样、量化与编码,解码器实现还原原信号过程。 二、设计目的 脉冲编码...

    本博客运行环境为Windows下Visual C++6.0

    一、主要内容

    实现信源编解码:PCM编码+ 数据压缩+信道(加性噪声)+数据解压缩+PCM译码。利用C语言使编码器实现输入信号完成PCM技术的三个过程:采样、量化与编码,解码器实现还原原信号过程。

    二、设计目的

    脉冲编码调制PCM是模/数变换中最基本和最常用的编码方式,结合《通信原理教程》课程。培养我们的实际动手能力。对PCM编码和译码的原理及其性能有更深的认识。

    三、设计要求

    1、掌握PCM的编码和译码的原理;在同一台PC上完成编码与解码,编码与解码模块需要用C/C++语言编写。
    2、掌握PCM编码的三个基本过程: 抽样、量化、编码。将输入的模拟语音信号变换为数字信号,在数字通信系统中进行传输。
    3、掌握解码还原原信号过程,观察输出波形。

    四、系统设计

    1、通信系统的原理

    通信的目的是传输信息。通信系统的作用就是将信息从信源发送到一一个或多个目的地。对于电通信来说,首先要把消息转变成电信号,然后经过发送设备,将信号送入信道,在接收端利用接收设备对接收信号作相应的处理后,送给信宿再转换为原来的消息。这一过程可用图1-3所示的通信系统一般模型来概括。
    数字通信系统是利用数字信号来传递消息的通信系统,如下图所示。其中主要有信源编码和译码、信道编码与译码、数字调制与解调、同步以及加密与解密等。
    在这里插入图片描述

    (1)信源编码和信源解码
    信源编码有两个作用,其一,进行模/数转换;其二,数据压缩,即设法降低数字信号的数码率,提高数字信号传输的有效性。信源解码的作用是进行数/模转换。

    (2)信道编码与信道解码
    数字信号在信道中传输时,由于噪声影响,会引起差错,信道编码就是要降低传输的差错率,对传输的信息码元按一定的规则加入保护成组成所谓“抗干扰编码”。接收端分(监督元),的信道解码器按一定规则进行解码,从解码过程中发现错误或纠正错误,从而提高通信系统抗干扰能力,提高传输可靠性。

    (3) 加密器和解密器
    在需要实现保密通信的场合,为了保证所传信息的安全,人为将被传输的数字序列扰乱,即加上密码,这种处理过程叫加密。在接收端利用与发送端相同的密码复制品对收到的数字序列恢复原来信息,这个过程叫做解密。

    (4)数字调制与解调
    数字调制就是把数字基带信号的频谱搬移到高频处,形成适合在信道中传输的带通信号。
    此次我主要设计的子系统是将模拟信号变为二进制信号的脉冲编码调制系统(PCM编码译码系统)。

    2.脉冲编码调制系统的原理

    PCM系统原理如下图所示,在发送端,对输入的模拟信号m(t)进行抽样、量化和编码。编码后的PCM 信号是一个二进制数字序列,其传输方式可以采用数字基带传输,也可以是对载波调制后的带通传输。在接收端,PCM信号经译码后还原为量化值序列(有误差),再经低通滤波器除高频分量,便得到重建的模拟信号m(t)。
    在这里插入图片描述

    脉冲编码调制PCM主要包括抽样、量化与编码三个过程。抽样是把连续时间的模拟信号转换成离散时间连续幅度的抽样信号;量化是把离散时间连续幅度的抽样信号转换成离散时间离散幅度的数字信号;编码是用二进制代码来表示抽样后的信号。
    在PCM中,对模报信号进行抽样、量化,将量化的信号电平值转化为对应的二进制码组的过程称为编码。其逆过程称为译码或解码。从理论上看,任何一个可逆的进制码组均可用于PCM.但是目前最常见的进制码有类:二进制自然码(NBC).折叠二进制(FBC)、格雷二进制码(RBC)。在PCM中实际采用的是折叠二进制码。

    由下图可见,如果把16个量化级分成两部分: 0 ~ 7的8个量化级对于于负极性样值脉冲,8~15的8个量化级对应于正极性样值脉冲。自然二进制码就是一般的十进制正整数的二进制表示,在16个量化级中:2^ 4 =16.采用4位码元表示:b1=2^ 3,b2=2^ 2,b3=2^ 1,b4=2^ 0的有无组合来构成。比如第11个量化级可表示为11=2^ 3+0+2^ 1+2^0=8+0+2+1其对应的码组可表示为: 1011.其余依次类推。本程序中采用自然码的编码方式。
    在这里插入图片描述

    CCITT建议的PCM编码规则,电话语音信号的频带为300~34002,抽样速率为fs=8Hz,对每个抽样值进行A律或者r律对数压缩非均匀量化及非线性编码,每个样值八位二进制代码表示,这样,每路标准话路的比特率为64kbps。
    负值编码是对称的,其绝对值与此表相同。整个信号动态范围共分13个段落,各段落的量化间隔都不同,并且有2的倍数关系。每个段落内位均匀分层量化,共16层。每个样值用8比特来表示,即[b1][b2b3b4][b5b6b7b8]这8比特分为三部分:b1为极性码,0代表负值,1代表正值。[b2~b4]称为段落码,表示段落的号码。其值为0-7.代表8个段落。[b5b6b7b8]表示每个段落内均匀分层的位置。其值为0-15,代表一段落内的16个均匀量化间隔。在PCM解码时,根据入比特码确定某段落内均勾分层的位置,然后去其量化间隔的中间值作为量化电平。
    本程序首先产生一个正弦信号,并对其进行采样量化。生成一个幅值矩阵:然后利用编码子函数对此矩降中的每个元素按照A律13折线编码规则编码。并产生一个输出码组矩阵; 最后利用解码子函数对输出码组矩阵解码,并画出编码前与解码后的波形图。

    3.程序流程图

    在这里插入图片描述

    五、详细设计与编码

    1. 设计方案

    模拟输入系统,产生模拟正弦信号,对模拟信号进行采样、量化、PCM编码,此时的编码信号是一个二进制数列,其传输方式可以采用数字基带传输,也可以是对载波调制后的带通传输。在接收端,PCM信号经译码后还原为量化值序列(有误差),再经低通滤波器除高频分量,便得到重建的模拟信号m(t)。
    编码:先输入幅度值,然后根据幅度值得出PCM码。根据编码电平在得出编码后的量化误差;根据译码值在得出译码后的量化误差。译码:依次输入PCM码值,然后输出所求幅度值。

    2. 编程工具的选择

    使用Visual C++6.0编写程序来实现PCM编码与解码,由于前两年的学习中一直使用visual c++6.0编译程序,对它比较熟悉。
    Visual C++6.0的特点:
    Visual C++6.0以拥有“语法高亮”,自动编译功能以及高级除错功能而著称。比如,它允许用户进行远程调试,单步执行等。还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。其编译及创建预编译头文件(stdafx.h)、最小重建功能及累加连结(link)著称。这些特征明显缩短程序编辑、编译及连结的时间花费,在大型软件计划上尤其显著。

    3. 编码与测试

    代码如下:

    #include<iostream>
    #include<math.h>
    #include <string> 
    using namespace std;
    #define N 7
    int pcmCode[N] = { 16,32,64,128,256,512,1024 };//通过数组,用来确定段落码
    int pcmInsideCode[N + 1] = { 1,1,2,4,8,16,32,64 };   //段内量化间隔
    int pcmInsideSart[N + 1] = { 0,16,32,64,128,256,512,1024 };    //段落起始电平
    int flag;
    void pcmJudge(string &result, int testNum)//确定段落码
    {
    	int low = 0, high = N, mid;
    	for (int i = 0; i < 3; i++)
    	{
    		mid = (low + high) / 2;     //逐次比较,判断段落码为1或者0
    		if (testNum >= pcmCode[mid])
    		{
    			result = result + '1';
    			low = mid + 1;
    			flag = mid;
    		}
    		else
    		{
    			result = result + '0';
    			high = mid - 1;
    			flag = mid - 1;
    		}
    	}
    }
    void pcmInsideJudge(string &result, int testNum, int pcmStart, int pcmSpace)//确定段内码
    {
    	int low = 0, high = 17, mid = 8;
    	for (int i = 0; i < 4; i++)
    	{
    		int cost = pcmStart + pcmSpace * mid;    //段落起始电平+量化间隔*序列号
    		if (cost > testNum)
    		{
    			result = result + '0';
    			high = mid;
    			mid = (low + high) / 2;
    		}
    		else
    		{
    			result = result + '1';
    			low = mid;
    			mid = (low + high) / 2;
    		}
    	}
    }
    int main()
    {
    	int testNum,testNum1,pick,errorNum;
    	while (1) {
    		cout << "----PCM编码与解码----\n";
    		cout << "1、PCM编码程序\n";
    		cout << "2、PCM解码程序\n";
    		cout << "---------------------\n";
    		cout << "\n";
    		cout << "请输入你的选择:";
    		cin >> pick;
    		if (pick == 1)
    		{
    			cout << "请输入幅度值: ";
    			cin >> testNum;   // 循环实现			
    			string result;        //字节用来得到编码出来的pcm码组						
    			if (testNum < 0)				
    				result = result + '0';			
    			else				
    				result = result + '1';
    			testNum1 = testNum;
    			testNum = fabs(testNum);//去符号
    			pcmJudge(result, testNum);//判断段内码			
    			//处理段内码			
    			int pcmSeq = flag + 1;       //量化间隔级数		
    			int pcmStart = pcmInsideSart[pcmSeq];//段落起始电平			
    			int pcmSpace = pcmInsideCode[pcmSeq];//量化间隔									
    			pcmInsideJudge(result, testNum, pcmStart, pcmSpace);			
    			cout << "编译出来的PCM码组: ";			
    			cout << result << endl;			
    			//量化误差			
    			int sum = 0;			
    			int j, cvb, cvb1,jyc, bmh;	//cvb译码值;jyc编码电平;bmh编码后的量化误差		
    			for (j = 4; j < N + 1; j++)				
    				if (result[j] == '1')					
    					sum = sum + pow(2, 7 - j);//确定量化级的序列号
    				if(testNum1 < 0)
    				{
    					cvb = -fabs(pcmStart + sum * pcmSpace + pcmSpace / 2); //为了使量化误差小于量化间隔的一半,译码后的值应该加上量化间隔的一半
    					cvb1 = fabs(cvb);
    					jyc= -fabs(cvb1 - pcmSpace / 2); //7位非线性码编译的电平
    				}
    				else
    				{
    					cvb = fabs(pcmStart + sum * pcmSpace + pcmSpace / 2);
    					jyc = fabs(cvb - pcmSpace / 2);
    				}
    				cout << "编码电平:" << jyc << endl;
    				if(testNum1 >= 0)
    				{
    					bmh = fabs(testNum - jyc);             //编码后的量化误差
    					errorNum = fabs(cvb- testNum);
    				}
    				else
    				{
    					bmh = fabs(testNum + jyc);
    					errorNum = fabs(cvb+ testNum);
    				}
    				cout << "编码后的量化误差:" << bmh << endl;								
    				cout << "译码值:" << cvb << endl;				
    				cout << "译码后的量化误差: " << errorNum << endl;				
    				cout << endl;		}
    		else if(pick == 2)
    		{
    			int i, j, m, n = 16, k, y;
    			int a[8] = { 0 };
    			for (i = 0; i < 8; i++)
    			{
    				cout << "请输入PCM编码a[" << i << "]:";
    				cin >> a[i];				
    			}
    			m = a[1] * 4 + a[2] * 2 + a[3];//段落序列号
    			i = m;
    			if (m == 0)
    				n = 0;
    			else
    			{
    				while (--i)
    					n = n * 2;
    			}			
    			k = a[4] * 8 + a[5] * 4 + a[6] * 2 + a[7];
    			if (m <= 1)
    				y = n + k * 2 + 1;
    			else
    				y = n + k * n / 16 + n / 32;
    			if (a[0] == 0)
    				y = -y;
    			cout << "幅度值:" << y << endl;
    			cout << endl;												
    		}
    		else {
    			cout << "输入有误,请重新输入!\n";
    		}
    }
    return 0;
    }
    

    编码:先输入幅度值,然后根据幅度值得出PCM码。根据编码电平在得出编码后的量化误差;根据译码值在得出译码后的量化误差。
    译码:依次输入PCM码值,然后输出所求幅度值。结果存在一定的量化误差。

    4. 运行结果及分析

    输入幅度值为1250,运行得到结果如下图所示:
    在这里插入图片描述

    输入码组为11110011,运行得到结果如下图所示:
    在这里插入图片描述

    输入幅度值为-1250,运行得到结果如下图所示:
    在这里插入图片描述

    输入码组为01110011,运行得到结果如下图所示:
    在这里插入图片描述

    展开全文
  • 绘图软件出了问题,用文字说明吧 信息源-->信源编码-->信道编码-->数字调制-->信道-->数字解调-->信道译码-->信源译码-->信宿,还有噪声源-->信道。 

    绘图软件出了问题,用文字说明吧


    信息源-->信源编码-->信道编码-->数字调制-->信道-->数字解调-->信道译码-->信源译码-->信宿,还有噪声源-->信道。

    
    展开全文
  • 这是一个基于Matlab的OFDM仿真实验报告和程序,实现了信号产生、信源编码、信道编码、数字调制、导频插入、循环前缀、信道均衡、信道估计、信源译码等通信的全过程
  • 信息论实验-通信系统仿真(C++)

    千次阅读 热门讨论 2017-10-14 12:28:24
    实验目的这是一个综合性的大型实验,通过搭建一个包括信源、信源编译码器、信道、信道编译码器等...信源译码器输出的符号序列3.信道编码后的信息传输效率4.整个通信过程的误比特率(BER)5.信道编译码过程中产生的误码
  • 提出一种基于二阶HMM(隐马尔可夫)信源和LDPC...在迭代过程中,利用信源序列中的冗余信息校正LDPC译码的迭代软信息,提高LDPC码的纠错性能,加快迭代收敛速度。AWGN信道的仿真结果证实了该联合信源信道解码算法性能优越。
  • 为提高网络编码的安全性提出了一种在信源处使用混沌序列与信源信息相结合,在信宿处列表译码的安全网络编码算法。该算法使用改进型Logistic映射产生混沌序列对信源消息进行处理,传输过程保持原有网络编码体制不变,...
  • 信息论的知识

    2015-06-24 22:36:19
    信源–编码–信道–译码–信宿 单符号离散信源可用离散随机变量X来表示。 随机变量的状态空间和概率空间是构成信源空间的两个基本要素。其中概率空间是决定性要素。 接收者获取的信息量,等于通信前后不确定性的...
  • 实验七 香农编码

    2020-12-15 07:45:03
    3、为了编成唯一可译码,首先计算第i个消息的累加概率 4、将累加概率Pi (为小数)变成二进制数 5、除去小数点,并根据码长li ,取小数点后li 位数作为第i个消息的码字。 二、实验环境 Dev 三、实验过程: #include...
  • 二进制香农编码过程如下: 1、将信源发出的N个消息符号按其概率的递减次序依次排列。 2、按下式计算第i个消息的二进制代码组的码长,并取整。 3、为了编成唯一可译码,首先计算第i个消息的累加概率 4、将累加概率Pi ...
  • 移动通信也是一门实践性非常强的课程,实验教学在整个课程的教学中占据了非常重要的地位。...即整个系统的仿真设计的选择,功能模块的设计过程和参数的选择,程序的调试过程等。 2、整个系统模型的仿真、调试结果。
  • LPC语音编码MATLAB程序

    2013-04-27 19:41:20
    译码为其反过程,将收到的数字序列经变换恢复特征参量,再根据特征参量重建语音信号。具体说,参数编码是通过对语音信号特征参数的提取和编码,力图使重建语音信号具有尽可能高的准确性,但重建信号的波形同原语音...
  • 算术编码的原理和MATLAB实现

    千次阅读 2017-07-04 15:25:31
    算术编码与译码原理:  1、 编码过程 算术编码方法是将被编码的一则消息或符号串(序列)表示成0和1之间的一个间隔(Interval),即对一串符号直接编码成[0,1]区间上的一个浮点小数。...信源中的符号序列仍然
  • 17.1.2信源译码 17.2MATLABSimulink通信系统仿真实例 17.2.1MATLAB编码实例 17.2.2Simulink信道实例 17.2.3MATLABSimulink信道实例 第18章数字基带调制/解调的Simulink模块实现 18.1数字幅度调制/解调 ...
  • 第4~8章分别介绍了信源和信宿、信道传输、信源编码、信道编码、信号交织以及信号调制的仿真模块及其仿真实现过程;第9章介绍了在通信系统的仿真和调试过程中经常遇到的问题及其解决办法;最后,第10章以cdma 2000为...
  • 23.1.2信源译码 23.2MATLABSimulink通信系统仿真实例 23.2.1MATLAB编码实例 23.2.2Simulink信道实例 23.2.3MATLABSimulink信道实例 第24章数字基带调制解调Simulink模块实现 24.1数字幅度调制解调 24.1.1...
  • 第4~8章分别介绍了信源和信宿、信道传输、信源编码、信道编码、信号交织以及信号调制的仿真模块及其仿真实现过程;第9章介绍了在通信系统的仿真和调试过程中经常遇到的问题及其解决办法;最后,第10章以cdma 2000为...
  • 第4~8章分别介绍了信源和信宿、信道传输、信源编码、信道编码、信号交织以及信号调制的仿真模块及其仿真实现过程;第9章介绍了在通信系统的仿真和调试过程中经常遇到的问题及其解决办法;最后,第10章以cdma 2000为...
  • 第4~8章分别介绍了信源和信宿、信道传输、信源编码、信道编码、信号交织以及信号调制的仿真模块及其仿真实现过程;第9章介绍了在通信系统的仿真和调试过程中经常遇到的问题及其解决办法;最后,第10章以cdma 2000为...
  • 第4~8章分别介绍了信源和信宿、信道传输、信源编码、信道编码、信号交织以及信号调制的仿真模块及其仿真实现过程;第9章介绍了在通信系统的仿真和调试过程中经常遇到的问题及其解决办法;最后,第10章以cdma 2000为...
  • 第4~8章分别介绍了信源和信宿、信道传输、信源编码、信道编码、信号交织以及信号调制的仿真模块及其仿真实现过程;第9章介绍了在通信系统的仿真和调试过程中经常遇到的问题及其解决办法;最后,第10章以cdma 2000为...

空空如也

空空如也

1 2
收藏数 22
精华内容 8
关键字:

信源译码过程