wly19880910 发表于 2009-10-12 12:18:59

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

我遇到这样一个题目,要用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语言,麻烦大家帮下我,万分感谢

wly19880910 发表于 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=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,a;
int l,w;
printf("\t\tHDB3码解码!!\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");
        }
}
以上便是我的程序,请高手们帮我注释下每行的意思,或者重要语句行的意思,方便我理解,谢谢,辛苦大家了!

xingzhang 发表于 2009-10-12 12:33:33

pcm吗
这个专业性太强,希望有人能帮到你,不过希望不大

wly19880910 发表于 2009-10-12 12:58:43

回复【2楼】 xingzhang 兴仔
--------------------------
恩,是PCM编码原理的,我模仿网上写的程序,但是对其定义不是很清楚,希望高手可以帮我注释下,还有把程序有错误的地方再帮我改下
页: [1]
查看完整版本: HDB3和原码的双向编码,程序调试出了点问题,麻烦编程高手请注释到行