搜索
bottom↓
回复: 3

HDB3和原码的双向编码,程序调试出了点问题,麻烦编程高手请注释到行

[复制链接]

出0入0汤圆

发表于 2009-10-12 12:18:59 | 显示全部楼层 |阅读模式
我遇到这样一个题目,要用C语言实现HDB3码到解码的双向转换,意思就是当我在编译的DOS选框里输入解码时会输出HDB3码,当我输入HDB3码时会输出解码,下面是它的转换原理:一、编码规则:
  1 先将消息代码变换成AMI码,若AMI码中连0的个数小于4,此时的AMI码就是HDB3码;
  2 若AMI码中连0的个数大于4,则将每4个连0小段的第4个0变换成与前一个非0符号(+1或-1)同极性的符号,用表示(+1+,-1-);
  3 为了不破坏极性_交替反转,当相邻符号之间有偶数个非0符号时,再将该小段的第1个0变换成+B或-B,符号的极性与前一非零符号的相反,并让后面的非零符号从符号开始再交替变化。
  例如:  
  消息代码: 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 1
  AMI码: +1 0 0 0 0 -1 0 0 0 0 +1 -1 0 0 0 0 +1 -1
  HDB3码:+1 0 0 0 +V -1 0 0 0 -V +1 -1 +B 0 0 +V -1 +1
  二、HDB3码的特点:
  1 由HDB3码确定的基带信号无直流分量,且只有很小的低频分量;
  2 HDB3中连0串的数目至多为3个,易于提取定时信号。
  3 编码规则复杂,但译码较简单。
  三、解码规则
  1从收到的符号序列中找到破坏极性_交替的点,可以断定符号及其前面的3个符号必是连0符号,从而恢复4个连码;
  2再将所有的-1变换成+1后,就可以得到原消息代码
[编辑本段]【HDB3码的特点】
  1. 由HDB3码确定的基带信号无直流分量,且只有很小的低频分量;
  2. HDB3中连0串的数目至多为3个,易于提取定时信号。
  3. 编码规则复杂,但译码较简单。
[编辑本段]【HDB3码的解码规则】
  1虽然编码很复杂,但解码规则很简单,若3连“0”前后非零脉冲同极性,如+1000+1 就应该译成“10000”,及后面的三个零后面的还要再添一个零;若2连 “0”前后非零脉冲极性相同,则两零前后都译为一,如-100-1,就应该译为0000.
  2.再将所有的-1变换成+1后,就可以得到原消息代码。
以上就是它的原理,我所使用的语言环境是VC6.0,我自己参考网上的人编写了这段程序(源程序是有错误的,我已经修改了,可以编译了)但是对其中的每行的意思还不是很理解,很想学好通信和C语言,麻烦大家帮下我,万分感谢

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2009-10-12 12:20:45 | 显示全部楼层
一下是我的程序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void qufan(char*a)
{if((*a)=='n')(*a)='u';
else if((*a)=='u')(*a)='n';
}
int hdb3(char *s,int l)
{char b='u',v='u',c;
int z=0,i=0;
while(1)
{if(i>=1){return 0;}
c=s;
if(c=='1'){z=0;qufan(&b);s=b;}
else if(c=='0'){z++;
if(z<4){s='0';}
else if(z==4){if(b!=v){v=b;s=v;}
else if(b==v){qufan(&b);s[i-3]=b;v=b;s=v;}
z=0;
}
else return 1;
}
else return 1;
i++;
}
}
int AMI(char*s,int l)
{char b='u',c;
int i=0;
while(1)
{if(i>=1){return 0;}
c=s;
if(c=='0'){s='0';}
else if(c=='1'){qufan(&b);s=b;}
else return 1;
i++;
}
}
void main()
{char s[102],a[102];
int l,w;
printf("\t\t  HDB3码解码!!\n\n");
printf("注:“0”代表: 0电平“u”代表: 负电平“n”代表: 正电平\n\n\n");
while(1)
{
        printf("请您输入数据:\n");
        scanf("%s",s);
        flushall();
        l=strlen(s);
        strcpy(a,s);
        w=hdb3(s,l);{printf("数据可能有错误,请您检查后重新输入.....\n\n");continue;}
printf("HDB3编码:\n");printf("%s\n",s);
        w=AMI(a,l);
        if(w==1) {printf("数据可能有错误,请您检查后重新输入.....\n\n");continue;}
                else{printf("AMI编码:\n");printf("%s\n",a);}
        printf("\n");
        }
}
以上便是我的程序,请高手们帮我注释下每行的意思,或者重要语句行的意思,方便我理解,谢谢,辛苦大家了!

出0入0汤圆

发表于 2009-10-12 12:33:33 | 显示全部楼层
pcm吗
这个专业性太强,希望有人能帮到你,不过希望不大

出0入0汤圆

 楼主| 发表于 2009-10-12 12:58:43 | 显示全部楼层
回复【2楼】 xingzhang 兴仔
--------------------------
恩,是PCM编码原理的,我模仿网上写的程序,但是对其定义不是很清楚,希望高手可以帮我注释下,还有把程序有错误的地方再帮我改下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 21:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表