通信报告调制自行设计实验.docx
《通信报告调制自行设计实验.docx》由会员分享,可在线阅读,更多相关《通信报告调制自行设计实验.docx(34页珍藏版)》请在冰豆网上搜索。
![通信报告调制自行设计实验.docx](https://file1.bdocx.com/fileroot1/2022-12/7/8ba2ca5e-5760-4237-bb1f-6512148bc973/8ba2ca5e-5760-4237-bb1f-6512148bc9731.gif)
通信报告调制自行设计实验
BPSK调制自行设计实验
代岳091180024通信工程
一、实验目的
1、熟悉升余弦基带传输信号的特点;
2、掌握BPSK编码的方式;
3、学习观察BPSK的调制信号;
4、熟悉BPSK调制载波包络的变化;
二、实验仪器
1、JH5001通信原理基础实验箱一台
2、PC机一台
3、下载线一根
三、实验原理
(一)基带成型
基带传输是频带传输的基础,也是频带传输的等效低通信号表示。
基带传输系统的框图如图1所示。
图1基带传输系统的框图
如果认为信道特性是理想的,其传输函数为1,那么整个传输系统的传输函数H(f)为:
在寻找对信号基带传输的设计过程中,人们总结了一系列的方法。
其中Nyquist设计准则为基带传输系统信号设计提供了一个方法。
利用该准则一方面可以对信号的频谱进行限制,另一方面又不会产生码间串扰。
升余弦信号设计是成功利用Nyquist准则设计的一个例子,其频谱特性如图4。
升余弦滤波器的传递函数为:
图4Nyquist升余弦滤波基带传输频域与时域特性示意图
成形之后的基带信号经D/A变换之后,直接对载波进行调制。
(二)眼图观察
对眼图性能判断主要依据图5中所示的主要测量指标。
图5眼图主的性能指标示意图
四、程序设计
实验要求:
(1)、对用matlab制作升余弦查找表。
(设计α=0.3,α=0.5两种滚降系数的查找表)
(2)、升余弦查找表行数较多,应利用fprintf命令批量生成查找表。
fprintf('5\''d%d:
ram<=8\''d%d;\n',data);data应该是2*M的矩阵。
第一行是第一个%d数据,第二行是第二个%d数据。
(3)、以上两步骤也可以采用设计升余弦FIR滤波器方式得到。
(4)、编写升余弦滤波程序。
m序列作为被调制信号,码元速率为28Kbps。
m序列输出时钟(28KHz),m序列都需要输出到测试孔。
电路分析:
实现滤波器的响应,脉冲成形滤波器可以在基带实现,也可以设置在发射机的输出端。
一般说来,在基带上脉冲成形滤波器用DSP或FPGA来实现,每个码元一般需采样4个样点,并考虑当前输出基带信号的样点值与8个码元有关,由于这个原因使用脉冲成形的数字通信系统经常在调制器中同一时刻存储了几个符号,然后通过查询一个代表了存储符号离散时间波形来输出这几个符号(表的大小为210),这种查表法可以实现高速数字成形滤波,其处理过程如下图所示:
编程思路:
PART1:
升余弦滤波器(以alpha=0.3为例)
(1)、升余弦系统的冲击响应如下:
Tb对应一个码元的宽度。
为了做到无码间干扰,就要满足冲激响应的顶点与另一时刻的冲激响应的零点相对齐。
为了在实际系统上可实现,将升余弦冲激响应进行截短,截短后保留前后共6个码元宽度。
h(t)在时域上是左右对称的,时间域的正半轴和负半轴都有。
但是要实现卷积,必须对h(t)抽样得到h(n)。
为了保证还原性,在每个码元宽度内抽样四次。
这样每个冲激相应h(n)对应24个离散值。
程序为:
%*********************************产生h(n)**********************************%
i=0;
fort=-2.75:
0.25:
3
i=i+1;
h(i)=(sinc(t)*cos(0.3*pi*t))/(1-0.36*t*t+eps);
end
(2)、输入序列每六位进行编码。
先将这六位单极性数字码元进行双极性变换,然后进行插值,每两个码元中间插入3个零。
这样,输入也相对应地成为24个离散值,记为a(n)。
然后将a(n)与h(n)进行卷积,得到含有47个离散值的输出e(n)。
在e(n)中,n=21、22、23、24,是前后六个码元在原始冲激相应h(t)的第一个码元宽度内叠加得到的结果,是我们需要的。
为方便下一步将其量化,由于a(n)有26=64种可能,每组4个采样点,要找出这所有256个值中的最大值和最小值。
程序为:
%*******************************a(n)和h(n)卷积*******************************%
R=zeros(64,4);
L=0;S=0;
form=0:
63
j=j+1;
a=dec2base(m,2,6);%把十进制数变成6位二进制数
a=a-48;
a=2*a-1;%单极性变成双极性
a=[a
(1),0,0,0,a
(2),0,0,0,a(3),0,0,0,a(4),0,0,0,a(5),0,0,0,a(6),0,0,0];%每两个码元间插3个0
e=conv(a,h);%卷积
fork=1:
4
R(j,k)=e(20+k);%取第一个码元宽度内的四个采样点
if(LL=R(j,k);%找最大值
else
if(S>R(j,k))
S=R(j,k);%找最小值
end
end
end
end
(3)、得到最大值L和最小值S后,就可以根据
将这些数值量化到0-255的范围内,并变成整数值。
最后将0~255个数打印出来,并在格式上注意可在Quartus直接查表使用。
程序为:
%**********************************量化并输出********************************%
M=zeros(64,4);
form=0:
63
u=4.*m;
j=j+1;
a=dec2base(m,2,6);%把十进制数变成6位二进制数
a=a-48;
a=2*a-1;%单极性变成双极性
a=[a
(1),0,0,0,a
(2),0,0,0,a(3),0,0,0,a(4),0,0,0,a(5),0,0,0,a(6),0,0,0];%每两个码元间插3个0
e=conv(a,h);%卷积
forn=1:
4
M(m+1,n)=round((e(20+n)+L)*255./(2*L));%量化到0~255的范围
end
fprintf('8\''d%d:
d_out<=8\''d%d;\n',u,M(m+1,3));%先输出第三个数
fprintf('8\''d%d:
d_out<=8\''d%d;\n',u+1,M(m+1,4));%再输出第四个数
fprintf('8\''d%d:
d_out<=8\''d%d;\n',u+2,M(m+1,1));%输出第一个数
fprintf('8\''d%d:
d_out<=8\''d%d;\n',u+3,M(m+1,2));%输出第二个数
end
stem(M,'.');title('alpha=0.3时的采样结果');%打印图像
注意:
这里输出一种a(n)情况下的e(n)的顺序是3、4、1、2,这是在实际实验时发现由于时序的原因,在FPGA中查表时,并未从0~255顺序输出,而是2、3、0、1、6、7、4、5……因而在matlab程序中作如上修改。
PART2:
调制m序列
m序列输出时钟是28kHz,每个码元对应着4个采样点,因此,采样频率为28kHz×4=112kHz。
m序列每连续的6个码元进行一次编码。
用一个6位的移位寄存器来保存,根据移位寄存器的值进行查表(即由matlab得到的升余弦滤波的表),连续输出对应的四个离散值。
alpha=0.3和alpha=0.5,只是表中数值不一样而已。
具体程序见附录的PART2。
五、实验过程记录与分析
1、matlab仿真输出图形
2、Quartus仿真输出波形
分析:
上图是当alpha=0.3时的整体仿真图。
采样的数值与时钟、m序列相对齐。
从图中可以看出,采样时钟是m序列时钟的4倍。
3、实验示波器显示波形
(1)、以m序列输出时钟作同步信号,同时观察m序列升余弦滤波后波形TPi03。
可以看到眼图波形。
现象:
a=0.3,m序列滤波后眼图
分析:
上图所示图形是alpha=0.3时的m序列升余弦滤波后波形。
从图中可以看出眼图十分明显,眼皮厚度很小,说明噪声容限较大,抗干扰能力较好。
(2)、以m序列作为同步信号,并将调整到动态稳定,同时观察并记录m序列升余弦滤波后波形TPi03。
现象:
a=0.3,m序列滤波后波形
分析:
m序列通过升余弦滤波系统后,其时域波形由原来的矩形脉冲信号变成平滑的曲线,相当于是数字信号变成了模拟信号。
对应于被调制的m序列来看,滤波后的波形也呈明显的周期性,只是有一定的时延,并且高低电平相对应。
。
(3)、测量并记录m序列和升余弦滤波TPi03的频谱。
比较两者之间的差别。
现象:
a=0.3,m序列频谱
a=0.3,m序列滤波后频谱
分析:
对于alpha=0.3时,对比上面两图,可以明显地看到,基带信号(m序列)经过升余弦滤波后变为低通带限信号。
这样可以消除码间串扰。
若未作成型滤波,则会有明显的频谱泄露,造成严重的码间干扰。
(4)、以m序列作为同步信号,并将调整到动态稳定,同时观察并记录TPK03波形。
现象:
a=0.3,m序列调制波形
分析:
TPK03波形的包络就是第(3)步中得到的滤波后的模拟信号,与图中的m序列对应来看,也有明显的周期性和一定的时延。
六、实验心得
本次实验历时大概3周,持续时间较长,由于是对BPSK调制过程进行编程实现,所以比验证性实验要难度大不少,复杂性也高很多,实验过程中碰到了许许多多的问题,也正是如此才显得更具有挑战性。
本实验要完成的内容主要有两部分,matlab实现升余弦滤波和FPGA实现对m序列的滤波编程模拟信号。
难点在于如何通过matlab输出查表所需的大量数值,这其中结合了数字信号处理的许多知识,比如矩形窗截短、奈奎斯特抽样定理、卷积等,还有通信原理的许多内容,包括基带传输、消除码间干扰等等。
因此,本次实验是一个综合性较强的实验,通过本次实验练习,帮助我进一步熟悉了解BPSK调制的过程,加深理解无码间串扰的意义,以及滚降因子对滤波效果的有什么样的影响。
照片:
实验程序附录:
PART1:
升余弦滤波matlab函数
(1)alpha=0.3时的程序
i=0;j=0;
fort=-2.75:
0.25:
3
i=i+1;
h(i)=(sinc(t)*cos(0.3*pi*t))/(1-0.36*t*t+eps);
end
R=zeros(64,4);
L=0;S=0;
form=0:
63
j=j+1;
a=dec2base(m,2,6);
a=a-48;
a=2*a-1;
a=[a
(1),0,0,0,a
(2),0,0,0,a(3),0,0,0,a(4),0,0,0,a(5),0,0,0,a(6),0,0,0];
e=conv(a,h);
fork=1:
4
R(j,k)=e(20+k);
if(LL=R(j,k);
else
if(S>R(j,k))
S=R(j,k);
end
end
end
end
figure,stem(h);title('alpha=0.3时的升余弦');
figure,stem(e);title('alpha=0.3时的卷积结果');
M=zeros(64,4);
form=0:
63
u=4.*m;
j=j+1;
a=dec2base(m,2,6);
a=a-48;
a=2*a-1;
a=[a
(1),0,0,0,a
(2),0,0,0,a(3),0,0,0,a(4),0,0,0,a(5),0,0,0,a(6),0,0,0];
e=conv(a,h);
forn=1:
4
M(m+1,n)=round((e(20+n)+L)*255./(2*L));
end
fprintf('8\''d%d:
d_out<=8\''d%d;\n',u,M(m+1,3));
fprintf('8\''d%d:
d_out<=8\''d%d;\n',u+1,M(m+1,4));
fprintf('8\''d%d:
d_out<=8\''d%d;\n',u+2,M(m+1,1));
fprintf('8\''d%d:
d_out<=8\''d%d;\n',u+3,M(m+1,2));
end
stem(M,'.');title('alpha=0.3时的采样结果');
%**************************************************************************%
(2)alpha=0.5时的程序
i=0;j=0;
fort=-2.75:
0.25:
3
i=i+1;
h(i)=(sinc(t)*cos(0.5*pi*t))/(1-1*t*t+eps);
end
R=zeros(64,4);
L=0;S=0;
form=0:
63
j=j+1;
a=dec2base(m,2,6);
a=a-48;
a=2*a-1;
a=[a
(1),0,0,0,a
(2),0,0,0,a(3),0,0,0,a(4),0,0,0,a(5),0,0,0,a(6),0,0,0];
e=conv(a,h);
fork=1:
4
R(j,k)=e(20+k);
if(LL=R(j,k);
else
if(S>R(j,k))
S=R(j,k);
end
end
end
end
figure,stem(h);title('alpha=0.5时的升余弦');
figure,stem(e);title('alpha=0.5时的卷积结果');
M=zeros(64,4);
form=0:
63
u=4.*m;
j=j+1;
a=dec2base(m,2,6);
a=a-48;
a=2*a-1;
a=[a
(1),0,0,0,a
(2),0,0,0,a(3),0,0,0,a(4),0,0,0,a(5),0,0,0,a(6),0,0,0];
e=conv(a,h);
forn=1:
4
M(m+1,n)=round((e(20+n)+L)*255./(2*L));
end
fprintf('8\''d%d:
d_out<=8\''d%d;\n',u,M(m+1,3));
fprintf('8\''d%d:
d_out<=8\''d%d;\n',u+1,M(m+1,4));
fprintf('8\''d%d:
d_out<=8\''d%d;\n',u+2,M(m+1,1));
fprintf('8\''d%d:
d_out<=8\''d%d;\n',u+3,M(m+1,2));
end
stem(M,'.');title('alpha=0.5时的采样结果');
PART2:
m序列调制主程序
(1)alpha=0.3时的程序
modulebpsk(clk,m_out,spab,d_out,fs_clk,m_clk);
inputclk;
outputspab;
outputregfs_clk;
outputregm_clk;
outputregm_out;
outputreg[7:
0]d_out;
reg[5:
0]fs_cnt;
reg[3:
0]m;
reg[1:
0]m_cnt;
reg[5:
0]mreg;
reg[7:
0]addr;
reg[1:
0]help;
assignspab=0;
//采样时钟fs_clk=112kHz
always@(posedgeclk)
begin
if(fs_cnt==6'd63)
begin
fs_clk<=~fs_clk;
fs_cnt<=6'd0;
end
else
fs_cnt<=fs_cnt+6'd1;
end
//码元输出时钟m_clk=28kHz
always@(posedgefs_clk)
begin
if(m_cnt==2'd1)
begin
m_clk<=~m_clk;
m_cnt<=2'd0;
end
else
m_cnt<=m_cnt+2'd1;
end
//m序列产生
always@(posedgem_clk)
begin
if(m==4'b0000)
m=4'b1111;
else
begin
m[0]<=m[0]^m[3];
m[3:
1]<=m[2:
0];
m_out<=m[3];
end
end
//6个码元存入寄存器
always@(posedgem_clk)
begin
mreg[5:
1]<=mreg[4:
0];
mreg[0]<=m_out;
end
//辅助寄存器,同步计数
always@(posedgefs_clk)
begin
if(help==2'd3)
help<=2'd0;
else
help<=help+2'd1;
end
//升余弦滤波
always@(posedgefs_clk)
begin
addr[7:
2]<=mreg[5:
0];
addr[1:
0]<=help[1:
0];
case(addr)
8'd0:
d_out<=8'd52;
8'd1:
d_out<=8'd54;
8'd2:
d_out<=8'd52;
8'd3:
d_out<=8'd51;
8'd4:
d_out<=8'd61;
8'd5:
d_out<=8'd54;
8'd6:
d_out<=8'd58;
8'd7:
d_out<=8'd62;
8'd8:
d_out<=8'd29;
8'd9:
d_out<=8'd54;
8'd10:
d_out<=8'd38;
8'd11:
d_out<=8'd26;
8'd12:
d_out<=8'd38;
8'd13:
d_out<=8'd54;
8'd14:
d_out<=8'd44;
8'd15:
d_out<=8'd36;
8'd16:
d_out<=8'd183;
8'd17:
d_out<=8'd201;
8'd18:
d_out<=8'd94;
8'd19:
d_out<=8'd143;
8'd20:
d_out<=8'd193;
8'd21:
d_out<=8'd201;
8'd22:
d_out<=8'd100;
8'd23:
d_out<=8'd153;
8'd24:
d_out<=8'd160;
8'd25:
d_out<=8'd201;
8'd26:
d_out<=8'd80;
8'd27:
d_out<=8'd117;
8'd28:
d_out<=8'd170;
8'd29:
d_out<=8'd201;
8'd30:
d_out<=8'd85;
8'd31:
d_out<=8'd128;
8'd32:
d_out<=8'd94;
8'd33:
d_out<=8'd54;
8'd34:
d_out<=8'd183;
8'd35:
d_out<=8'd143;
8'd36:
d_out<=8'd103;
8'd37:
d_out<=8'd54;
8'd38:
d_out<=8'd189;
8'd39:
d_out<=8'd153;
8'd40:
d_out<=8'd71;
8'd41:
d_out<=8'd54;
8'd42:
d_out<=8'd169;
8'd43:
d_out<=8'd117;
8'd44:
d_out<=8'd80;
8'd45:
d_out<=8'd54;
8'd46:
d_out<=8'd175;
8'd47:
d_out<=8'd128;
8'd48:
d_out<=8'd225;
8'd49:
d_out<=8'd201;
8'd50:
d_out<=8'd225;
8'd51:
d_out<=8'd234;
8'd52:
d_out<=8'd235;
8'd53:
d_out<=8'd201;
8'd54:
d_out<=8'd231;
8'd55:
d_out<=8'd244;
8'd56:
d_out<=8'd202;
8'd57:
d_out<=8'd201;
8'd58:
d_out<=8'd211;
8'd59:
d_out<=8'd208;
8'd60:
d_out<=8'd211;
8'd61:
d_out<=8'd201;
8'd62:
d_out<=8'd217;
8'd63:
d_out<=8'd219;
8'd64:
d_out<=8'd38;
8'd65:
d_out<=8'd54;
8'd66:
d_out<=8'd29;
8'd67:
d_out<=8'd26;
8'd68:
d_out<=8'd47;
8'd69:
d_out<=8'd54;
8'd70:
d_out<=8'd35;
8'd71:
d_out<=8'd36;
8'd72:
d_out<=8'd15;
8'd73:
d_out<=8'd54;
8'd74:
d_out<=8'd15;
8'd75:
d_out<=8'd0;
8'd76:
d_out<=8'd24;
8'd77:
d_out<=8'd54;
8'd78:
d_out<=8'd20;
8'd79:
d_out<=8'd11;
8'd80:
d_out<=8'd169;
8'd81:
d_out<=8'd201;
8'd82:
d_out<=8'd71;
8'd83:
d_out<=8'd117;
8'd84:
d_out<=8'd178;
8'd85:
d_out<=8'd201;
8'd86:
d_out<=8'd77;
8'd87:
d_out<=8'd128;
8'd88:
d_out<=8'd146;
8'd89:
d_out<=8'd201;
8'd90:
d_out<=8'd56;
8'd91:
d_out<=8'd91;
8'd92:
d_out<=8'd155;
8'd93:
d_out<=8'd201;
8'd94:
d_out<=8'd62;
8'd95:
d_out<=8'd102;
8'd96:
d_out<=8'd80;
8'd97:
d_out<=8'd54;
8'd98:
d_out<=8'd160;
8'd99:
d_out<=8'd117;
8'd100:
d_out<=8'd89;
8'd101:
d_out<=8'd54;
8'd102:
d_out<=8'd166;
8'd103:
d_out<=8'd128;
8'd104:
d_out<=8'd56;
8'd105:
d_out<=8'd54;
8'd106:
d_out<=8'd146;
8'd107:
d_out<=8'd91;
8'd108:
d_out<=8'd66;
8'd109:
d_out<=8'd54;
8'd110:
d_out<=8'd152;
8'd111:
d_out<=8'd102;
8'd112:
d_out<=8'd211;
8'd113:
d_out<=8'd201;
8'd114:
d_out<=8'd202;
8'd115:
d_out<=8'd