通信原理与系统课程设计.docx

上传人:b****5 文档编号:6979026 上传时间:2023-01-14 格式:DOCX 页数:11 大小:109.05KB
下载 相关 举报
通信原理与系统课程设计.docx_第1页
第1页 / 共11页
通信原理与系统课程设计.docx_第2页
第2页 / 共11页
通信原理与系统课程设计.docx_第3页
第3页 / 共11页
通信原理与系统课程设计.docx_第4页
第4页 / 共11页
通信原理与系统课程设计.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

通信原理与系统课程设计.docx

《通信原理与系统课程设计.docx》由会员分享,可在线阅读,更多相关《通信原理与系统课程设计.docx(11页珍藏版)》请在冰豆网上搜索。

通信原理与系统课程设计.docx

通信原理与系统课程设计

通信原理与系统课程设计

1.搭建简单基带数字通信系统,信道纠错编码:

CRC,生成码不少于8位;传输线路码:

曼彻斯特码;信道:

AWGN信道,信噪比不大于50dB;信源:

不少于128bit。

任务:

完成通信系统的编码和解码,用MATLAB的M代码完成,不允许用Simulink。

(发挥部分:

可以采用QPSK方式载调制波,亦即包括信号调制与解调)。

验证CRC检错率。

说明:

先将128bit信源码分成多个字段,每字段不少于8bit,对每一字段进行CRC计算,得到冗余码,再将所有经过CRC编码后的字段接成比特流发出。

接收端将接收的比特流分块(每块长度为原始字段位数加冗余码位数),再用CRC检验接收字段是否有错。

去掉冗余码,对照信源输出的原始数据,看检错是否正确。

注意:

信源输出128bit为一次性输出,可用伪随机或随机函数实现,不能使用一个字段循环多次形成的128bit。

主程序:

%通信系统仿真程序

%

%采用CRC编码和manchester编码;

%只是经过了高斯白噪声信道

 

closeall;

clearall;

clc;

%生成N_sum位随机序列作为信号码

N_sum=128;%信息位数

original_signal=(sign(randn(1,N_sum))+1)/2;%randn(m,n)产生一个m行n列的矩阵,生成(-1,1)的随机数然后加1,得(0,2)/2生成(0,1)内的数,128为信息位,原始信号

T=1;%信号持续时间

N_sample=32;%为了画出波形,每个周期的采样点数

dt=T/N_sample;%每个点的间隔

fori=1:

length(original_signal);

s_original_signal((i-1)*N_sample+1:

i*N_sample)=original_signal(i);%为画波形对信号进行扩展,

end

t1=0:

dt:

length(s_original_signal)*dt-dt;

figure

(1);

plot(t1,s_original_signal);%画原始信号

axis([0,128,-1.5,1.5]);

title('原始信号')

xlabel('t');ylabel('幅值');

gridon

 

%N_pack=8;

%调用CRC编码程序

crc_code=en_crc_code(original_signal);

forii=1:

length(crc_code);

s_crc_code((ii-1)*N_sample+1:

ii*N_sample)=crc_code(ii);%为画波形对信号进行扩展,

end

t2=0:

dt:

length(s_crc_code)*dt-dt;

figure

(2);

plot(t2,s_crc_code);%画原始信号

axis([0,150,-1.5,1.5]);

title('CRC编码后的信号')

xlabel('t');ylabel('幅值');

gridon

 

%manchester编码

manchester_code=manchester(crc_code);

foriii=1:

length(manchester_code);

s_manchester_code((iii-1)*16+1:

iii*16)=manchester_code(iii);%为画波形对信号进行扩展,

end

t3=0:

dt:

length(s_manchester_code)*dt-dt;

figure(3);

plot(t3,s_manchester_code);

axis([0,150,-0.5,1.5]);

title('manchester编码后的信号')

xlabel('t');ylabel('幅值');

gridon

 

%forkk=1:

15

%加入噪声

add_noise_code=awgn(manchester_code,10,'measured');%加入高斯白噪声

foriiii=1:

length(add_noise_code);

s_add_noise_code((iiii-1)*16+1:

iiii*16)=add_noise_code(iiii);%为画波形对信号进行扩展,

end

t4=0:

dt:

length(s_add_noise_code)*dt-dt;

figure(4);

plot(t4,s_add_noise_code);%画叠加了噪声的信号

axis([0,150,-1.5,1.5]);

title('叠加了噪声的信号')

xlabel('t');ylabel('幅值');

gridon

 

after_judge_code=zeros(1,length(add_noise_code));

forjj=1:

length(add_noise_code)

if(add_noise_code(jj)>=0.5)

after_judge_code(jj)=1;

elseif(add_noise_code(jj)<0.5)

after_judge_code(jj)=0;

end

end

end

 

%manchester译码

de_manchester_code=de_manchester(after_judge_code);

foriiii=1:

144;

s_de_manchester_code((iiii-1)*32+1:

iiii*32)=de_manchester_code(iiii*2-1);%为画波形对信号进行扩展

end

t5=0:

dt:

length(s_de_manchester_code)*dt-dt;

figure(5);

plot(t5,s_de_manchester_code);%manchester译码后的信号

axis([0,150,-1.5,1.5]);

title('manchester译码后的信号')

xlabel('t');ylabel('幅值');

gridon

 

%CRC解码程序

[get_original_sequence,er]=cyclic_redundancy_decode(de_manchester_code);

er;

foriiiii=1:

length(crc_code(1:

N_sum));

s_get_original_sequence((iiiii-1)*32+1:

iiiii*32)=get_original_sequence(iiiii);%为画波形对信号进行扩展,

end

t6=0:

dt:

length(s_get_original_sequence)*dt-dt;

figure(6);

plot(t6,s_get_original_sequence);%最终得到序列

axis([0,128,-1.5,1.5]);

title('最终得到序列')

xlabel('t');ylabel('幅值');

gridon

 

n_number=0;

forj=1:

length(original_signal)

if(get_original_sequence(j)~=original_signal(j))

j

n_number=n_number+1;

end

end

n_number

 

子程序:

%该函数通过输入信号序列和相应选择16阶CCITT_CRC生成多项式

%生成循环冗余检错码(CRC),返回添加了尾比特码序列

function[crc_code]=en_crc_code(original_signal)%cyclic_redundancy_code

k_check=16;%校验位16位

 

sequence_length=length(original_signal);%得到原始信号长度

n_sig_chk=sequence_length+k_check;%原始信号长度+冗余位=生成的编码后的长度

crc_ccitt=[10001000000100001];%常用的CRC生成多项式g(x)=x^16+x^12+x^5+1

add_bit=zeros(1,k_check);%添加冗余比特位:

一行16个0

crc_code=[original_signal,zeros(1,k_check)];%初始化输出检错码序列,校验位为16位;

original_signal=[original_signal,add_bit];%相当于原序列的多项式乘以x^(n-k),见课本346页

remainder_bits=original_signal;%初始化余数数组

fork=1:

sequence_length%开始循环计算长除得到最终余数

add_zeros=zeros(1,sequence_length-k);%加入冗余位参与模2运算,相当于补充了除法运算时的商

register_bits=[crc_ccittadd_zeros];%构造除数数组

if(remainder_bits

(1)==0)%被除数第一位为0则将除数所有位置0

register_bits=zeros(1,length(register_bits));

end

remainder_bits=xor(register_bits,remainder_bits);%将除数与被除数进行异或操作

register_bits=crc_ccitt;%将寄存器恢复为除数数组

remainder_bits

(1)=[];%去除模2后得到的被除数的第1位

end

add_len=length(crc_code)-length(remainder_bits);%生成余数序列的冗余位以叠加到编码序列

remainder_bits=[zeros(1,add_len),remainder_bits];%余数序列添加冗余

crc_code=crc_code+remainder_bits;%合成编码序列

 

functionmanchester_code=manchester(crc_code)

%manchesterecoder

fori=1:

length(crc_code)

if(crc_code(i)==1)%manchestercode"1"

manchester_code(2*i-1)=1;

manchester_code(2*i)=0;

else%manchestercode"0"

manchester_code(2*i-1)=0;

manchester_code(2*i)=1;

end

End

 

%对一个manchester码进行译码运算

%after_judge_code为manchester码

functionde_manchester_code=de_manchester(after_judge_code)

n=length(after_judge_code);

de_manchester_code=zeros(length(after_judge_code));

fori=1:

2:

n

ifafter_judge_code(i)==0

de_manchester_code(i)=0;

de_manchester_code(i+1)=0;

else

de_manchester_code(i)=1;

de_manchester_code(i+1)=1;

end

end

function[original_sequence,err]=cyclic_redundancy_decode(crc_coded_sequence)

foriiii=1:

144;

s_crc_coded_sequence(iiii)=crc_coded_sequence(iiii*2-1);%为画波形对信号进行扩展

end

generator=[11000000000000101];%16bitCRC生成多项式D16+D15+D2+1

[divid,remainder]=deconv(s_crc_coded_sequence,generator);%对多项式的除,就等于做反卷积

remainder=mod(remainder(end-15:

end),2);%对除法的余数做模二运算

ifisequal(remainder,[0000000000000000]);

err=0;%如果正确指示0并解码

original_sequence=s_crc_coded_sequence(1:

end-16);

else

err=1;

original_sequence=s_crc_coded_sequence(1:

end-16);

end

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1