通信原理与系统课程设计.docx
《通信原理与系统课程设计.docx》由会员分享,可在线阅读,更多相关《通信原理与系统课程设计.docx(11页珍藏版)》请在冰豆网上搜索。
![通信原理与系统课程设计.docx](https://file1.bdocx.com/fileroot1/2023-1/14/0971b047-1adc-489c-a1e4-f0b9bef9d8d0/0971b047-1adc-489c-a1e4-f0b9bef9d8d01.gif)
通信原理与系统课程设计
通信原理与系统课程设计
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