通信工程实验报告西南交通大学.docx
《通信工程实验报告西南交通大学.docx》由会员分享,可在线阅读,更多相关《通信工程实验报告西南交通大学.docx(27页珍藏版)》请在冰豆网上搜索。
通信工程实验报告西南交通大学
通信工程实验报告
班级:
姓名:
学号:
实验一BDPSK调制解调器设计
一、实验目的
1.掌握BDPSK的调制和解调原理。
2.掌握倍频和分频的概念以及分频的实现方法。
3.用VerilogHDL硬件描述语言建模,实现BDPSK基带调制解调系统。
二、实验说明
由于在BPSK解调中,相干载波恢复时可能出现相位模糊,所以在实际应用中经常采用BDPSK(二进制差分相移键控)方式。
BDPSK方式不需要在解调端恢复相干参考信号,非相干接收机容易制造而且成本低,因此在无线通信系统中被广泛使用。
1.BDPSK基带调制系统结构
在BDPSK调制系统中,输入的二进制序列先进行差分编码,然后再用BPSK调制器调制。
一个基带的BDPSK调制系统如图1所示。
2.差分编码差分编码原理为:
设计一个模二加法器和一个延迟单元,将当前时钟周期的绝对码信号和上一时钟周期经过一个码元延时的相对码信号进行模二加法(异或),得到当前时钟周期的相对码,并反复进行。
延迟单元的功能可以用硬件电路中的寄存器来实现,用它作为保存上一次生成的相对码的容器,然后在下个时序到来时与当前的绝对码进行模二加得到输出。
图2差分编码原理
三、实验结果
1.调制系统中各子模块的VerilogHDL代码及注释。
差分编码:
moduleChafen(dataPN,clk1,reset_n,dataCF);
inputclk1;
inputdataPN;
inputreset_n;
outputdataCF;
regc;
always@(posedgeclk1ornegedgereset_n)
begin
if(!
reset_n)
begin
c<=1'b0;
end
else
begin
c<=c^dataPN;
end
end
assigndataCF=c;
endmodule
时钟分频器:
modulediv(
clk,
reset_n,
clk1
);
inputclk;
inputreset_n;
outputclk1;
reg[5:
0]c;
regout;
always@(posedgeclkornegedgereset_n)
begin
if(!
reset_n)
begin
out<=0;
c=6'b000000;
end
else
begin
out<=c[5];
c<=c+1;
end
end
assignclk1=out;
endmodule
伪随机序列发生器:
modulePN_Seq(
clk1,
reset_n,
dataPN
);
inputclk1;
inputreset_n;
outputdataPN;
reg[7:
1]c;
always@(posedgeclk1ornegedgereset_n)
begin
/*YourDesign*/
if(!
reset_n)
begin
c<=7'b0001111;
end
else
begin//7级M序列编码
c[1]<=c[2]^c[3]^c[4]^c[7];
c[7]<=c[6];
c[6]<=c[5];
c[5]<=c[4];
c[4]<=c[3];
c[3]<=c[2];
c[2]<=c[1];
end
end
assigndataPN=c[7];
endmodule
2.调制系统顶层模块的VerilogHDL代码及注释。
moduleBPSK(
clk,
reset_n,
clk_DA,
blank_DA_n,
sync_DA_n,
dataout
);
inputclk;
inputreset_n;
outputclk_DA;
outputblank_DA_n;
outputsync_DA_n;
output[7:
0]dataout;
wire[4:
0]address;
ControllerCONTROLLER(
.clk(clk),
.reset_n(reset_n),
.dataCF(dataCF),
.address(address),
.clk_DA(clk_DA),
.blank_DA_n(blank_DA_n),
.sync_DA_n(sync_DA_n)
);
LookUpTableLOOKUPTABLE(
.clk(clk),
.reset_n(reset_n),
.address(address),
.dataout(dataout)
);
ChafenCHAFEN(
.dataPN(dataPN),
.clk1(clk1),
.reset_n(reset_n),
.dataCF(dataCF)
);
PN_SeqPN_SEQ(
.clk1(clk1),
.reset_n(reset_n),
.dataPN(dataPN)
);
divDIV(
.clk(clk),
.reset_n(reset_n),
.clk1(clk1)
);
Endmodule
3.功能仿真和时序仿真结果的波形,至少要同时显示出伪随机序列、差分编码结果和
BDPSK调制信号。
功能仿真:
时序仿真:
实验二CDMA调制与解调
一、实验目的:
1、了解CDMA的原理和调制解调过程。
2、用MATLAB进行CDMA的调制解调过程的仿真。
二、实验原理:
扩频通信用伪随机编码把基带信号的频谱进行扩展,形成相当宽带的低功率谱密度的信号发射,接收端使用相关处理方式,也要把接受的宽带扩频信号恢复成基带信号。
图1为典型扩频通信的基本原理图。
图1典型扩频通信的基本原理图
三、报告要求
1.所有程序完整的源代码(.m文件)以及注释。
2.仿真结果。
对于所有的图形结果(包括波形与仿真曲线等),将图形保存成.tif
或者.emf的格式并插入word文档。
四、实验结果
1.
shiyan2.m
clearall;
closeall;
C2=1;C1=0;C0=1;%m序列初值
N=10^4;
MN=7*N;%重复MN遍的7位单极性m序列
EbNo=-20:
5;%信噪比
L(MN)=0;
M(MN)=0;
reds_sample(1:
MN)=0;
reds_judge(1:
N)=0;
err(length(EbNo))=0;
message_ds(1:
MN)=0;
ds(1:
MN)=0;
fori=1:
MN
TC0=C0;TC1=C1;TC2=C2;
C0=C1;C1=C2;
C2=xor(TC0,TC1);
L(i)=TC0;
end
fori=1:
MN
M(i)=1-2*L(i);%将单极性m序列变为双极性m序列
end
M_ds=rectpulse(M,1000);%双极性m序列的扩频序列
message=rand(1,N)>0.5;%产生二进制随机数
fori=1:
N
k=7*i-6;
message_ds(k)=message(i);k=k+1;
message_ds(k)=message(i);k=k+1;
message_ds(k)=message(i);k=k+1;
message_ds(k)=message(i);k=k+1;
message_ds(k)=message(i);k=k+1;
message_ds(k)=message(i);k=k+1;
message_ds(k)=message(i);
end
fori=1:
MN
ds(i)=xor(L(i),message_ds(i));
end
fs=2000;
ts=0:
0.00001:
MN/100-0.00001;%为了使信号看起来更光滑,作图时采样频率为100kHz
ds_b=rectpulse(ds,1000);%将冲激信号补成矩形信号?
ds_bpsk=(1-2.*ds_b).*cos(2*pi*fs*ts);
[b,a]=tf(lpf);%得到传递函数,b=Num;a=1;
fork=1:
length(EbNo)
ds_bpsk_awgn=awgn(ds_bpsk,EbNo(k),'measured');
ds_re=ds_bpsk_awgn.*cos(2*pi*fs*ts);
ds_lpf=filter(b,a,ds_re);
%解扩
reds=M_ds.*ds_lpf(1:
1000*MN);
%抽样
fori=1:
MN
j=1000*i-500;
reds_sample(i)=reds(j);
end
%判决
fori=1:
MN
if(reds_sample(i)>0.2)
reds_sample(i)=1;
elseif(reds_sample(i)<-0.2)
reds_sample(i)=-1;
elsereds_sample(i)=0;
end
end
fori=1:
N
j=7*i-6;
if(reds_sample(j)==0)
reds_sample(j)=reds_sample(j+4);
end
end
fori=1:
MN-2
if(reds_sample(i)==0)
reds_sample(i)=reds_sample(i+2);
end
end
fori=1:
N
reds_judge(i)=reds_sample(i*7-3);
if(reds_judge(i)==0)
reds_judge(i)=reds_judge(i)+1;
end
reds_judge(i)=(1-reds_judge(i))/2;
end
err(k)=length(find((reds_judge-message)~=0));%计算误码个数
end
err=err./N;
figure
(1)
plot(EbNo,err);xlabel('EbNo/dB');ylabel('误码率');title('BPSK调制的CDMA误码率')
lpf.m
functionHd=lpf
%LPFReturnsadiscrete-timefilterobject.
%MATLABCode
%GeneratedbyMATLAB(R)9.0andtheDSPSystemToolbox9.2.
%Generatedon:
26-Oct-201622:
33:
44
%FIRWindowLowpassfilterdesignedusingtheFIR1function.
%AllfrequencyvaluesareinHz.
Fs=2000;%SamplingFrequency
N=30;%Order
Fc=10;%CutoffFrequency
flag='scale';%SamplingFlag
Beta=0.5;%WindowParameter
%Createthewindowvectorforthedesignalgorithm.
win=kaiser(N+1,Beta);
%CalculatethecoefficientsusingtheFIR1function.
b=fir1(N,Fc/(Fs/2),'low',win,flag);
Hd=dfilt.dffir(b);
%[EOF]
2.仿真结果
MATLAB实验基于导频的信道估计仿真分析1
一、实验目的
1、了解信道估计的作用、在无线通信中的地位以及基本原理;
2、掌握LS信道估计的原理;
3、用MATLAB对基于导频的信道估计进行仿真,在瑞利平坦信道下分析其MSE性能。
二、实验原理:
如图为纯导频信道估计实验流程框图。
图1纯导频信道估计实验流程框图
二、报告要求
1.所有程序完整的源代码(.m文件)以及注释。
2.仿真结果。
对于所有的图形结果(包括波形与仿真曲线等),将图形保存成.tif
或者.emf的格式并插入word文档。
三、实验结果
1.
shiyan3.m
clearall;closeall;
NUM=10^5;
EbNo=0:
30;%信噪比
datastream(1:
NUM)=1;%全1数据
MSE(1:
length(EbNo))=0;
%h瑞利分布
hb=unifrnd(0,2*pi,1,NUM);
ha=raylrnd(1,1,NUM);
h=ha.*exp(1i.*hb);
data_r=datastream.*h;%通过瑞利信道
fork=1:
length(EbNo)
data_ra=awgn(data_r,EbNo(k),'measured');%加高斯白噪声
h_est=data_ra./datastream;
%计算MSE
fori=1:
NUM
MSE(k)=MSE(k)+(abs(h(i)-h_est(i)))^2;
end
MSE(k)=MSE(k)/NUM;
end
plot(EbNo,MSE);xlabel('EbNo/dB');ylabel('MSE');title('基于导频信道的SNR与MSE的关系曲线')
2.仿真结果
实验四基于导频的信道估计仿真分析2
一、实验目的
1、了解数据与导频同时发送时如何进行信道估计。
2、用MATLAB对基于导频的信道估计进行仿真,在瑞利平坦信道下分析其MSE性能。
二、实验原理
图为导频与数据同时发送时进行信道估计的实验流程框图。
具体内容及信道估计准则请见前一实验。
帧结构:
红色部分为导频符号,有m个导频,用以估计系统信道响应;蓝色部分为数据部分,有n个数据,通过导频处的信道响应推出数据位置的信道响应,完成均衡处理,解调数据位信号,提升系统性能。
三、报告要求
1.所有程序完整的源代码(.m文件)以及注释。
2.仿真结果。
对于所有的图形结果(包括波形与仿真曲线等),将图形保存成.tif
或者.emf的格式并插入word文档。
三、实验结果
1.
shiyan4.m
clearall;closeall;
Nbit=2*10^4;%帧数
N=2*7*Nbit;%二进制比特流个数
M=3*Nbit;%导频个数
EbNo=0:
35;%信噪比
err(length(EbNo))=0;%误码率
MSE(length(EbNo))=0;%信道估计MSE
message=rand(1,N)>0.5;%二进制比特流
pf(1:
M)=1+i;%导频信号
%生成二进制比特流并qpsk调制
qpsk_IQ=[-11];
qpsk_I=qpsk_IQ(message(1:
2:
end)+1);
qpsk_Q=qpsk_IQ(message(2:
2:
end)+1);
qpsk=(qpsk_I+1j.*qpsk_Q);
MN=M+length(qpsk);
frame(1:
MN)=0;%帧信号
%组帧
k=1;
j=1;
fori=1:
length(qpsk)
frame(j)=qpsk(i);
j=j+1;
if(mod(i,7)==0)
frame(j)=pf(k);j=j+1;k=k+1;
frame(j)=pf(k);j=j+1;k=k+1;
frame(j)=pf(k);j=j+1;k=k+1;
end
end
frame_rayl(1:
length(frame))=0;%通过瑞利信道后的帧信号
%产生瑞利分布
hb=unifrnd(0,2*pi,1,Nbit);
ha=raylrnd(1,1,Nbit);
h=ha.*exp(1i.*hb);
%帧通过瑞利信道
j=1;
fori=1:
length(h)
fork=1:
10
frame_rayl(j)=h(i)*frame(j);j=j+1;
end
end
pf_awgn(1:
M)=0;%加高斯白噪声导频信号部分
qpsk_awgn(1:
length(qpsk))=0;%加高斯白噪声qpsk信号部分
h_est(1:
Nbit)=0;%根据导频信号计算出的信道估计
qpsk_est(1:
length(qpsk))=0;%根据计算出的信道估计得到接收到的qpsk信号
%计算误码率与信道估计的MSE
forkk=1:
length(EbNo)
frame_awgn=awgn(frame_rayl,EbNo(kk),'measured');%加高斯白噪声
%分离组帧中的数据信号与导频信号
jj=1;ii=1;
forj=1:
length(frame_awgn)
if(mod(j,10)==0||mod(j,10)==8||mod(j,10)==9)
pf_awgn(jj)=frame_awgn(j);jj=jj+1;
else
qpsk_awgn(ii)=frame_awgn(j);ii=ii+1;
end
end
%根据导频信号计算信道估计
h_awgn=pf_awgn./pf;
forjjj=1:
length(h_est)
h_est(jjj)=(h_awgn(jjj*3-2)+h_awgn(jjj*3-1)+h_awgn(jjj*3))/3;
end
k=1;
%根据计算出的信道估计,计算接收到的qpsk信号
foriii=1:
length(qpsk_est)
qpsk_est(iii)=qpsk_awgn(iii)/h_est(k);
if(mod(iii,7)==0)
k=k+1;
end
end
%qpsk解调
qpsk_est_re=real(qpsk_est);
qpsk_est_im=imag(qpsk_est);
qpsk_IQD=[01];
qpsk_est_re(find(qpsk_est_re>1))=1;
qpsk_est_re(find(qpsk_est_re<-1))=-1;
qpsk_est_im(find(qpsk_est_im>1))=1;
qpsk_est_im(find(qpsk_est_im<-1))=-1;
qpsk_de=[zeros(1,N)];
qpsk_de(1:
2:
end)=qpsk_IQD(round((qpsk_est_re+1)/2)+1);
qpsk_de(2:
2:
end)=qpsk_IQD(round((qpsk_est_im+1)/2)+1);
%计算误码率
err(kk)=length(find((qpsk_de-message)~=0));
err(kk)=err(kk)./N;
%计算信道估计的MSE
forimse=1:
length(h)
MSE(kk)=MSE(kk)+(abs(h(imse)-h_est(imse)))^2;
end
MSE(kk)=MSE(kk)/length(h);
end
plot(EbNo,err);xlabel('EbNo/dB');ylabel('误码率');
figure
(2)
plot(EbNo,MSE);xlabel('EbNo/dB');ylabel('MSE');
2.仿真结果
MSE曲线
BER曲线
实验五FPGA实验HDB3编码器设计
一、实验目的
⒈深入理解HDB3编码原理。
⒉学习用VerilogHDL硬件描述语言建模较复杂时序逻辑电路。
⒊学习FPGA设计中的Testbench(测试平台)技术。
⒋掌握FPGA设计中仿真与综合的概念。
⒌学习编写仿真测试代码与可综合代码。
二、报告要求
⒈输入信号为全全0码时,以下各时序仿真结果:
(ModelSim中截图)
⑴加V后;
⑵补B后;
⑶最终得到的HDB3码。
2.改写HDB3编码器的测试文件代码,使测试文件能连续产生伪随机序列,将改写后的
测试文件代码写在实验报告中。
(可以参考教师提供的VerilogHDL教程中的第10章
10.3.8部分的内容)
3.思考:
测试文件代码和编码器模块代码都是用VerilogHDL语言编写的,这两种代码在
语法上有什么区别?
分别举一个例子进行比较。
三、实验结果
1.
data_v:
加V信号
data_b:
加B信号
dataout:
最终信号
2.
测试文件
timescale 1ns/100ps
module HDB3_encoder_test;
reg clk;
reg reset_n;
reg datain;
wire [2:
0] dataout;
HDB3_encoder DESIGN (
.clk (clk),
.reset_n (reset_n),
.datain (datain),
.dataout (dataout)
);
initial
begin
clk=1'b0;
end
always
begin
#5 clk=~clk;
end
initial
begin
#0 reset_n=1'b0;
#20 reset_n=1'b1;
end
datain=$dist_uniform(12,start,end);
endmodule
3.
不允许在可综合的设计代码中使用`Define来定义参数,应该使用参数Parameter来定义。
例如`Define只用于编写