通信系统综合实验代码
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
printf("****************************************************************
break;
}
//误码功能
case 2:{
printf("请您输入加入误码后的二进制序列(15位),可以
修改编码后的二进制序列的一位或多位!\n");
printf("误码序列:");
/****变量定义以及初始化***/
int mes; //输入的16进制信息序列 int bit2[10]; //将输入的16进制数转换为2进制后的数 int reg[5]; //移位寄存器 int code[15]; //2/3FEC编码后的序列 int rbit2[15]; //接收序列(2进制形式) int err_num; //误码数的统计 int err_flag; int decodemes[3]; //将译码结果用16进制表示 char err_code[15]; //加误码的序列 char ch; int flag=0; int i,j,t,e,tt; int sel=0; //功能选择位 /****输入信息序列***/ printf("通信系统综合实验--数字基带仿真实验--2/3FEC的实现\n"); do {
{
printf("信道传输正确 或 产生不可检错的误码序列! 接
收序列为: ");
for(i=0;i<15;i++)
printf("%d",rbit2[i]);
printf("\n
译码结果为: ");
}
else
{
for(i=0;i<15;i++)
{
if(reg[4]+reg[3]+(!reg[2])+reg[1]+(!reg[0]) == 5)
按0----->返回\n");
printf("请您选择功能!\n");
scanf("%d",&sel);
getchar();
switch(sel) //功能选择
{
//译码功能
case 1:{
err_num=0;
err_flag=0;
for(i=0;i<5;i++) //移位寄存器内容全清0
reg[i]=0;
printf("\n");
printf("
十六进制结果为:
%X%X%X\n",decodemes[0],decodemes[1],decodemes[2]);
printf("****************************************************************
InputValue=(InputValue-64)/4; //求在该段落占用的量化间隔数 } else if(InputValue>=32) {
OutputValue=OutputValue+0x20; //当InputValue大于1024时,在第 3段,段内码:010
InputValue=(InputValue-32)/2; //求在该段落占用的量化间隔数 } else if(InputValue>=16) {
}
if(err_num == 1)
printf("信道传输产生1位错码 !可纠错 !该码位于
第%d位, 译码结果为: ",15-err_flag);
else
{
printf("信道传输产生2位或2位以上错码! 超出2/3FEC
码纠错范围,不可纠错!\n");
printf("
译码结果为: ");
}
}
decodemes[0] = rbit2[5] *2 + rbit2[6];
gets(err_code); //输入误码
for(i=0;i<15;i++)
{
if(err_code[i] == '0') //对某一个或某些位设置误码
rbit2[i]=0;
else
rbit2[i]=1;
}
break;
}
//复位功能
case 3:{
for(i=0;i<15;i++)
rbit2[i]=code[i]; //恢复正确的码
} else if(InputValue>=256) {
OutputValue=OutputValue+0x50; //当InputValue大于1024时,在第 6段,段内码:101
InputValue=(InputValue-256)/16; //求在该段落占用的量化间隔数 } else if(InputValue>=128) {
} /****************段内码编码*****************/
OutputValue+=InputValue; return OutputValue; //完成编码,返回编码值 }
4. PCM译码
extern int PCM_StudentAlawDecode(unsigned char CodeValue)
reg[1]= reg[0];
reg[0]= t;
}
printf("经2/3FEC编码后的二进制信息序列为(MSB-->LSB):
");
for(i=0;i<5;i++) //输出编码序列的高五位
{
code[i]=reg[i];
rbit2[i]=code[i];
printf("%d",code[i]);
for(i=0;i<10;i++) //二进制bit2的从低位到高位的输入,按照编码器的
电路图进行编码
{
t= reg[4]^bit2[9-i];
//g=x^5+x^4+x^2+1=(x+1)(x^4+x+1)
reg[4]= reg[3]^t;
reg[3]= reg[2];
reg[2]= reg[1]^t;
2. 2/3FEC译码
/***以下进入菜单选项,可以选择加误码、复原、译码和返回功能 ***/
while(sel != 4) {
printf("功能菜单如下,您可以选择译码,加误码,复原,以及返 回功能:\n");
printf("操作方法:按1----->译码,按2----->误码,按3----->复原,
//根据InputValue与各段量化区间(共8个量化区间)的起始电平的比
较,进行段落码编码
//计算出在所在量化区间占用的量化间隔数,用于段内编码
if(InputValue>=1024)
{
OutputValue=OutputValue+0x70; //当InputValue大于1024时,在第
8段,段内码:111
}
printf(" ");
for(;i<15;i++)
//输出编码序列的信息位
{
code[i]=bit2[i-5];
rbit2[i]=code[i];
printf("%d",code[i]);
}
printf("\n");
printf("****************************************************************
//11010: x^14 mod g
e=1;
else
e=0;
err_num+=e;
if(err_num == 0)
err_flag++;
tt=rbit2[14]^e;
//输出,并将此输出通过循环放
到rbit2中
for(j=14;j>0;j--)
rbit2[j]=rbit2[j-1]; //序列移位
for(i=0;i<15;i++) //从接受序列的低位到高位的顺序
{
t= reg[4];
reg[4]= reg[3]^t;
reg[3]= reg[2];
reg[2]= reg[1]^t;
reg[1]= reg[0];
reg[0]= rbit2[14-i]^t;
}
if(reg[4]+reg[3]+reg[2]+reg[1]+reg[0] == 0)
OutputValue=OutputValue+0x10; //当InputValue大于1024时,在第 2段,段内码:001
InputValue=InputValue-16; //求在该段落占用的量化间隔数 } else {
OutputValue=OutputValue+0x00; //当InputValue大于1024时,在第 1段,段内码:000
OutputValue=OutputValue+0x40; //当InputValue大于1024时,在第 5段,段内码:100
InputValue=(InputValue-128)/8; //求在该段落占用的量化间隔数 } else if(InputValue>=64) {
OutputValue=OutputValue+0x30; //当InputValue大于1024时,在第 4段,段内码:011
rbit2[0]=tt;
t= reg[4];
reg[4]= reg[3]^t;
reg[3]= reg[2];
reg[2]= reg[1]^t;
reg[1]= reg[0];
reg[0]= e^t;
//纠错信号也反馈到伴随式计算电
路的输入端(图7中虚线所示)对伴随式进行修正,以消去该错误对伴
随式的影响
} } }
2、 PCM编译码程序
3. PCM编码
extern unsigned char PCM_StudentAlawEncode(int InputValue)
{
unsigned char OutputValue = 0x0; //初始化编码输出值
/*Add your code here*/
/****************极性码编码*****************/
if(flag>0) printf("对不起,您的输入值超出范围!\n");
flag++; printf("请输入0---3FFH之间的十六进制数,并按回车!\n"); scanf("%x",&mes); } while((mes<0)||(mes>1023)); /***将输入的十六进制数转换为二进制数***/ for(i=0;i<10;i++) { bit2[9-i]=mes%2; //bit2[0]为MSB mes=mes/2; } printf("您输入的数转化为二进制后的编码前的序列:(MSB-->LSB): "); for(i=0;i<10;i++) printf("%d",bit2[i]); printf("\n"); /*** 2/3 FEC编码 ***/ for(i=0;i<5;i++) //移位寄存器的初始状态全清零 reg[i]=0;
decodemes[1] = rbit2[7] *8 + rbit2[8] *4 + rbit2[9] *2 +
rbit2[10];
decodemes[2] = rbit2[11]*8 + rbit2[12]*4 + rbit2[13]*2 +
rbit2[14];
for(i=5;i<15;i++)
printf("%d",rbit2[i]);
{
int DecodeValue = 0;
InputValue=(InputValue-1024)/64; //求在该段落占用的量化间隔数
}
else if(InputValue>=512)
{
OutputValue=OutputValue+0x60; //当InputValue大于1024时,在第
7段,段内码:110
InputValue=(InputValue-512)/32; //该段落占用的量化间隔数
break;
}
//返回功能
case 4:{
printf("您即将退出,您真的要退出吗?Y/N\n");
ch=getchar();
if((ch == 'N')||(ch == 'n'))
sel = 0;
break;
}
default: printf("您的操作序号输入有误,执行不了任何功能,请
重新输入!\n");
班级 011402 学号1401120128
西安电子科技大学
通信系统综合实验程序
学 院 :通信工程学院 班 级 :011402 专 业 :通信与信息系统 姓 名 :杨全会 学 号 :1401120128
2015年11月
1、 2/3FEC编译码程序
1. பைடு நூலகம்/3FEC编码
#include <stdio.h> void main() {
if(InputValue<0) //当InputValue小于0时,对它取相反数,并将
极性码设为0
{
InputValue=-InputValue;
OutputValue=0x00;
}
else
OutputValue=0x80;
//当InputValue大于0时,将极性码设为
1
/****************段落码编码*****************/