GMSK调制器实验报告(课程设计)

更新时间:2023-03-08 08:37:55 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

通信原理实验报告

“GMSK调制器”系统实验

学生姓名班级学号联系电话电子邮件报告日期

指导老师 韩玉芬

_________李鹏飞 ___ ___ 05119班 07号 ___ 13241705355 62284789 lpf111222@bupt.cn _ 2008 年 6_ _月 5 日

电信工程院实验中心一、实验内容

了解GMSK调制器工作原理,并用数字化的方法用硬件产生GMSK调制器的基带波形。 具体要求如下:

1.了解GMSK调制器工作原理,GMSK信号相位路径的计算及GMSK调制器数字化实现的原理。

2.在掌握了GMSK调制器数字化实现地址逻辑的工作原理后,用可编程逻辑器件实现地址逻辑的设计,并仿真各点波形,分析检验其时序逻辑关系。

3.了解GMSK数字基带波形余弦表的编程流程图,并用计算机编出余弦及正弦表。 4.为了检验所编码表的正确性,可进一步利用计算机软件检验从上述码表得出的GMSK基带波形的眼图与理论计算是否一致,若两者一致,说明所编码表正确,可将它写入EPROM中,并将EPROM片子插在GMSK调制器硬件实验板上。

5.在TX2000通信实验板上,正确使用示波器观看GMSK基带信号眼图。

二、实验原理

GMSK(高斯最小移频键控)是GSM蜂窝移动通信系统中使用的数字调制技术,其方法是将基带脉冲信号经过高斯低通滤波器成形为高斯脉冲后,对其进行MSK调制,因而具有恒包络,连续相位的特点。对恒包络的已调信号我们可以使用功率效率高的非线性放大器,相位连续使已调信号的功率谱主瓣窄,旁瓣衰减比MSK更快,因此频谱利用率更高。

本实验通过理论仿真与硬件实现相结合的方式,先利用Matlab编程产生高斯滤波器矩形脉冲响应,并得到GMSK基带信号的正弦余弦表,再用仿真眼图和理论对比,检验编程是否正确,把正余弦表中的数据量化并写入BIN文件,下载到硬件系统中,通过示波器来观察GMSK信号的眼图。最后用Quartus软件仿真并分析地址逻辑。

三、系统设计

1.软件部分

1.1 g(t)函数的产生 g.m文件的源代码:

function x=g(t) global dt t f N fb sx fb=270833; T=1/fb; dt=T/1000; B=0.3/T;

a=sqrt(log(2)/2)/B; t=-2.5*T:dt:2.5*T;

x=1/(4*T)*(erfc(pi/a*(t-T/2))-erfc(pi/a*(t+T/2)));

图一为g(t)函数的波形图:

图表 1 g(t)函数的波形图

函数g(t)的生成代码很简单,只要按照书上的公式打入代码即可,但实验资料书上的公式印刷有错误,造成一些麻烦。按照通原书上的公式就对了。

1.2 GMSK信号相位路径的计算: rom.m文件的源代码:

global dt t f N fb cos_rom sin_rom close all Q=10; fb=270833; fs=8*fb; T=1/fb; B=0.3/T; n=0:31; L=0:3; i=0:7;

fait=zeros(1,1024);

cos_rom=zeros(1,1024); %初始化cos,sin的rom表 sin_rom=zeros(1,1024); for n=0:31 for L=0:3 for i=0:7

m=n; %把当前的n值转化为五位移存器里的地址 n1=fix(m/16); if n1,m=n-16;end; n2=fix(m/8); if n2,m=m-8;end; n3=fix(m/4); if n3,m=m-4;end; n4=fix(m/2); if n4,m=m-2;end; n5=m;

b1=n1; %把单极性的b1、b2、b3、b4、b5变为双极性,为下一步求相位做准备 if b1==0,b1=-1;end; b2=n2;

if b2==0,b2=-1;end; b3=n3;

if b3==0,b3=-1;end; b4=n4;

if b4==0,b4=-1;end; b5=n5;

if b5==0,b5=-1;end;

sx=dt*cumtrapz(g); %等效面积求积分 tt=(i/8)*1000; jifen1=sx(4000+tt); jifen2=sx(3000+tt); jifen3=sx(2000+tt); jifen4=sx(1000+tt); jifen5=sx(1+tt);

jifen=jifen1*b1+jifen2*b2+jifen3*b3+jifen4*b4; fai=pi*jifen+L*pi/2;

nn=n*32+L*8+i+1; %当前地址 fait(nn)=fai; cos_rom(nn)=cos(fai); sin_rom(nn)=sin(fai); end end end

这里我直接形成1×1024的矩阵,我觉得这样地址逻辑比较清楚。最外层为五位移存器形成的状态数n的的循环,然后是象限计数器提供的L的循环,最后是8次抽样的循环。这样与实际硬件的地址逻辑笔记比较符合,会省去很多麻烦。在积分的计算上,我用了cumtrapz函数,用等效面积的方法求积分,这样更加符合我对积分的理解。

1.3 眼图的仿真

yantu.m文件的源代码:

global dt t f N fb close all

times=100; Na=10; l=8; M=Na*times; N=times*Na*l;

an=round(rand(1,(M+1))); bn=zeros(1,M); b=zeros(1,(M+5)); c=zeros(1,(M+5));

for ii1=1:M %预编码 bb(ii1)=xor(an(ii1),an(ii1+1)); end

for ii2=1:M

b(ii2+5)=bb(ii2); end c=b;

for ii3=1:(M+5) %生成一组对应的双极性,为下面象限计数器L的计算做准备 if b(ii3)==0,c(ii3)=-1;end; end

cos_fai=zeros(1,N); sin_fai=zeros(1,N); LL=0; for k=1:M

nnn=b(k+1)*16+b(k+2)*8+b(k+3)*4+b(k+4)*2+b(k+5); %当前对应的状态数n值 LL=LL+c(k); LL=mod(LL,4); for ii=1:8

address=nnn*32+LL*8+ii; %当前对应的地址 cos_fai(k*8+ii-8)=cos_rom(address); %用当前的地址读出相位 sin_fai(k*8+ii-8)=sin_rom(address); end end ttt=0:Na*l; figure(1)

set(1,'Position',[10,100,500,400]) %设定窗口位置及大小

figure(2)

set(2,'Position',[600,100,500,400]) %设定窗口位置及大小

figure(1) hold on

for jj=1:Na*l:N-Na*l %画cos的眼图 plot(ttt,cos_fai(jj:jj+Na*l)); end

figure(2) hold on

for jj=1:Na*l:N-Na*l %画sin的眼图 plot(ttt,sin_fai(jj:jj+Na*l)); end

眼图的绘制比较简单,本程序中加入了预编码,为了计算象限数L,又准备了与输入代码对应双极性码。形成地址就从ROM表中读出值并显示在屏幕上,重复显示多次,就形成了眼图。

图二为余弦仿真眼图:

图表 2 余弦仿真眼图

图三为正弦仿真眼图:

图表 3 正弦仿真眼图

1.4 ROM表的量化和BIN文件生成 lianghua.m文件的源代码:

global dt t f N fb close all

cos_bin=zeros(10,1024); sin_bin=zeros(10,1024);

for ii4=1:1024

cos_1=cos_rom(ii4); %cos量化开始 cos_2=(1+cos_1)*511.5; %量化的0-1023 mmm=cos_2;

nnn1=fix(mmm/512); %将这个数10bit量化 if nnn1,mmm=mmm-512;end; cos_bin(1,ii4)=nnn1;

nnn2=fix(mmm/256); if nnn2,mmm=mmm-256;end; cos_bin(2,ii4)=nnn2;

nnn3=fix(mmm/128); if nnn3,mmm=mmm-128;end; cos_bin(3,ii4)=nnn3;

nnn4=fix(mmm/64); if nnn4,mmm=mmm-64;end; cos_bin(4,ii4)=nnn4;

nnn5=fix(mmm/32); if nnn5,mmm=mmm-32;end; cos_bin(5,ii4)=nnn5;

nnn6=fix(mmm/16); if nnn6,mmm=mmm-16;end; cos_bin(6,ii4)=nnn6;

nnn7=fix(mmm/8); if nnn7,mmm=mmm-8;end; cos_bin(7,ii4)=nnn7;

nnn8=fix(mmm/4); if nnn8,mmm=mmm-4;end; cos_bin(8,ii4)=nnn8;

nnn9=fix(mmm/2); if nnn9,mmm=mmm-2;end; cos_bin(9,ii4)=nnn9;

nnn10=fix(mmm); cos_bin(10,ii4)=nnn10; end

for ii5=1:1024

sin_1=sin_rom(ii5); %sin sin_2=(1+sin_1)*511.5; % mmm=sin_2;

nnn1=fix(mmm/512); % if nnn1,mmm=mmm-512;end; sin_bin(1,ii5)=nnn1;

nnn2=fix(mmm/256); if nnn2,mmm=mmm-256;end; sin_bin(2,ii5)=nnn2;

量化开始 量化的0-1023 将这个数10bit量化 nnn3=fix(mmm/128); if nnn3,mmm=mmm-128;end; sin_bin(3,ii5)=nnn3;

nnn4=fix(mmm/64); if nnn4,mmm=mmm-64;end; sin_bin(4,ii5)=nnn4;

nnn5=fix(mmm/32); if nnn5,mmm=mmm-32;end; sin_bin(5,ii5)=nnn5;

nnn6=fix(mmm/16); if nnn6,mmm=mmm-16;end; sin_bin(6,ii5)=nnn6;

nnn7=fix(mmm/8); if nnn7,mmm=mmm-8;end; sin_bin(7,ii5)=nnn7;

nnn8=fix(mmm/4); if nnn8,mmm=mmm-4;end; sin_bin(8,ii5)=nnn8;

nnn9=fix(mmm/2); if nnn9,mmm=mmm-2;end; sin_bin(9,ii5)=nnn9;

nnn10=fix(mmm); sin_bin(10,ii5)=nnn10; end

cos_low=zeros(1,1024);

for ii6=1:1024 %cos低8位

cos_low(ii6)=cos_bin(3,ii6)*128+cos_bin(4,ii6)*64+cos_bin(5,ii6)*32+cos_bin(6,ii6)*16+cos_bin(7,ii6)*8+cos_bin(8,ii6)*4+cos_bin(9,ii6)*2+cos_bin(10,ii6); end

sin_low=zeros(1,1024);

for ii7=1:1024 %sin低8位

sin_low(ii7)=sin_bin(3,ii7)*128+sin_bin(4,ii7)*64+sin_bin(5,ii7)*32+sin_bin(6,ii7)*16+sin_bin(7,ii7)*8+sin_bin(8,ii7)*4+sin_bin(9,ii7)*2+sin_bin(10,ii7);

end

cos_sin=zeros(1,1024);

for ii8=1:1024 %cos和sin的高2位

cos_sin(ii8)=sin_bin(1,ii8)*128+sin_bin(2,ii8)*64+cos_bin(1,ii8)*2+cos_bin(2,ii8); end

cos_low_bin=zeros(1,8192); sin_low_bin=zeros(1,8192); cos_sin_bin=zeros(1,8192); for ii9=1:1024

cos_low_bin(8*ii9-7)=cos_low(ii9); %每个数据间插入7个0 sin_low_bin(8*ii9-7)=sin_low(ii9); cos_sin_bin(8*ii9-7)=cos_sin(ii9); end

fid_cos=fopen('cos.bin','w'); %生成bin文件 fwrite(fid_cos,cos_low_bin); %数据写入bin文件 fclose(fid_cos);

fid_sin=fopen('sin.bin','w'); fwrite(fid_sin,sin_low_bin); fclose(fid_sin);

fid_cs=fopen('cs.bin','w'); fwrite(fid_cs,cos_sin_bin); fclose(fid_cs);

程序中采用了单极性量化,即首先将余弦表中的数都加一使其变成0—2之间的数,然后将位于0—2之间的数乘以511.5均匀量化成0—1023中的某个数,再转化为10比特二进制数就完成量化,然后把两组低八位与高两位分别存于三片ROM中,再生成bin文件用于实际硬件的下载。

虽然第一次验收失败了,但我很快发现了错误之处,是因为每个数据间插入7个0的循环语句有了一个出了很低级的错误,修改正确后的再次验收,顺利通过。

2.硬件部分

2.1地址逻辑的设计

用了VHDL语言仿真了地址逻辑的产生电路。 VHDL语言的代码如下:

library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;

entity GMSK is port(

clk:in std_logic; data:out std_logic; A3:out std_logic; A4:out std_logic; A5:out std_logic; A6:out std_logic; A7:out std_logic; A8:out std_logic; A9:out std_logic; A10:out std_logic; A11:out std_logic; A12:out std_logic ); end GMSK;

architecture address of GMSK is signal count_4:integer range 0 to 1; signal clk_2:std_logic; signal clk_4:std_logic;

signal b1,b2,b3,b4,b5,b6:std_logic; signal add_count:integer range 0 to 3; signal m:std_logic_vector(6 downto 0); begin process(clk) begin

if(clk'event and clk='1') then

m<=(m(5 downto 0)&(m(4) xor m(0) xor(not(m(6)or m(5)or m(4)or m(3)or m(2)or m(1)or m(0))))); --生成m序列 k=7

clk_2<=not clk_2; --二分频

if(count_4=1) then --四分频

clk_4<=not clk_4; count_4<=0; else

count_4<=count_4+1;

end if;

b1<=m(0); b2<=b1; b3<=b2; b4<=b3; b5<=b4; b6<=b5; if(b6='1') then

add_count<=add_count+1; else

add_count<=add_count-1; end if;

case add_count is --象限数决定A6、A7

when 0=>A6<='0';A7<='0'; when 1=>A6<='1';A7<='0'; when 2=>A6<='0';A7<='1'; when 3=>A6<='1';A7<='1'; end case;

end if; end process; data<=b3; A3<=clk_4; A4<=clk_2; A5<=clk; A8<=b1; A9<=b2; A10<=b3; A11<=b4; A12<=b5; end address;

本来打算用元件连接成图来做出地址逻辑,可是觉得用VHDL语言编程实现更有挑战性,就用了VHDL语言,起初感觉m序列的产生太难了,后来在以前的数电书上好好看了m序列的产生电路,就解决了。由于只是分析地址逻辑,就没有加如预编码等部分。

2.2地址逻辑的仿真设计波形

图四为地址逻辑的仿真设计波形:

图表 4 地址逻辑的仿真设计波形

A3,A4,A5是时钟的分频,A6、A7代表的是L,它主要以在0-3内的递增或递减或0突变为3突变为0,而A8、A9、A10、A11、A12代表的是移位寄存器的五位信息码,A12、A11、A10、A9都分别是其下一个延时之后的结果,而data是m伪随机序列。

三、实验心得

这次我的课程设计选择了韩老师的GMSK实验,起初的动因是想在学期内结束课设,把假期的时间更多地用于考研,而且随大流地去做通原课上公布的课设,对待的态度肯定不会有这次这么认真,如果浪费了课设这一锻炼的机会,大学就里没有几次让我们动手的机会了。

刚开始接触这个实验,感觉很难理解。我是五一以后才开始的,有这门实验课程的同学甚至都有验收了的,给我很大压力,听说韩老师比较注重独立思考的能力,这让我化压力为动力,连续几天都看GMSK相关的资料。终于懂了实验让我做什么!

开始编程就比较顺利了,matlab我已在通原实验课上刚刚学过,用起来很顺手。在看了资料后,我稍稍改动了一下实验做法,把ROM表直接写成1×1024的矩阵,这样0-1023对应与10比特的地址,思路清晰了很多。

在积分计算时,我选择了cumtrapz函数,它通过计算曲线与x轴之间的面积来计算积分,我对积分理解就是这样,所以编程的思路就很清晰,很顺利的做出ROM表。

眼图的仿真,起初在处理时没区分好单极性和双极性码在应用场合,出了错误。后来从头检查,发现了这个错误。眼图出来以后,很有成就感。对这个实验的理解加强了很多。

量化和生成BIN文件起初以为很难,但是好好做了后,感觉只要前面的程序用心编了,这里会很轻松就突破,只是知道fwrite函数的用法,再结合本次要生成的BIN文件的结构特点,很容易出来。那天晚上来验收的同学很多,第一次纯粹没有任何波形,检查发现是每个数据间插入7个0的循环语句有了一个出了很低级的错误,修改后就成功了。

最后的地址逻辑的产生,做这个的时候同宿舍的多半同学在做电子设计大赛,好几个人都是负责编VHDL的,这激发了我对VHDL的兴趣,找出以前的数电实验课本,就自己编了起来,m序列的产生很长时间没出来,后来好好看了数电书上的m序列产生电路,用了一句代码就出来了。仿真出地址逻辑的波形,对实验的理解就更加深了一步。

总结实验,明白了GMSK调制器在工程的实现原理,原本以为就像通原课本的框图上那样信号通过高斯滤波器,再去MSK调制,这样的话会用许多模拟器件,而且精度很难保证,设备的成本会很高。而像这样提前算好数据写入ROM,需要用地址去读取,方便快捷,精度高。这个思路对工程开发很有用,亲自完整地实现一遍后,更感觉收获颇多,感觉这次课设没有白做。

最后感谢韩老师在带实验课和组织电子设计大赛的百忙时间里给我完成这回的课程设计的机会,谢谢您的辅导!

本文来源:https://www.bwwdw.com/article/4j23.html

Top