视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
通信原理matlab课程设计报告
2025-10-05 18:05:17 责编:小OO
文档
目录

一.问题描述-----------------------------------------3

二.实验原理-----------------------------------------4

三.源程序-------------------------------------------6

四.数据测试----------------------------------------16

五.调试分析----------------------------------------22

六.用户使用手册------------------------------------23

七.心得体会----------------------------------------24

一、问题描述

1.使用matlab编程完成HDB3的编码与解码。

2.课程设计需要运用MATLAB编程实现2ASK,2FSK,2PSK,2DPSK调制解调过程,并且输出其源码,调制后码元以及解调后码元的波形。

二、实验原理

1.HDB3编码解码原理

HDB3码:三阶高密度双极性码。

     HDB3码与二进制序列的关系:

     (1)二进制信号序列中的“0”码在HDB3码中仍编为“0”码,二进制信号中“1”码,在HDB3码中应交替地成+1和-1码,但序列中出现四个连“0”码时应按特殊规律编码(引入传号交替反转码的“破坏点”V码);

     (2)二进制序列中四个连“0”按以下规则编码:信码中出现四个连“0”码时,要将这四个连“0”码用000V或B00V取代节来代替(B和V也是“1”码,可正、可负)。这两个取代节选取原则是,使任意两个相邻v脉冲间的传号数为奇数时选用000V取代节,偶数时则选用B00V取代节。

2.二进制数字调制技术原理

数字信号的传输方式分为基带传输和带通传输,在实际应用中,大多数信道具有带通特性而不能直接传输基带信号。为了使数字信号在带通信道中传输,必须使用数字基带信号对载波进行调制,以使信号与信道的特性相匹配。这种用数字基带信号控制载波,把数字基带信号变换为数字带通信号的过程称为数字调制。通常使用键控法来实现数字调制,比如对载波的振幅、频率和相位进行键控。

(1)2ASK信号的产生方法通常有两种:模拟调制和键控法。解调有相干解调和非相干解调。P=1时f(t)=Acoswt;p=0时f(t)=0;其功率谱密度是基带信号功率谱的线性搬移

(2) 一个2FSK信号可以看成是两个不同载波的2ASK信号的叠加。其解调和解调方法和ASK差不多。2FSK信号的频谱可以看成是f1和f2的两个2ASK频谱的组合。

(3) 2PSK以载波的相位变化作为参考基准的,当基带信号为0时相位相对于初始相位为0, 当基带信号为1时相对于初始相位为180°。

(4) 2DPSK调制原理方框图如下图。

S(t)

            

  

 

间接法信号调制器原理方框图

2DPSK信号的解调,主要有两种方法,即相位比较法和相干解调法。相干解调法原理方框图如下图:

 

相干解调法原理方框图

三、源程序

clear

clc

a=20;                           %a表示元素个数,可以修改码元为任意个数如1024

r=unidrnd(2,1,a-1);              %随机产生离散均匀二值分布(1,2),共a-1个

rn=r-1;                          %每个元素减1变为(0,1)二值随机数列

rn=[1,rn];                        %跟书上一致,从1开始随机产生离散均匀二值分布(1,2),共a个

ori=rn;                           %将原序列保存起来,便于后面解码后比较

ori

l=1;                           

for k=1:a-3

   if abs(rn(k))==1           

       m=rn(k);                 %m记录可能存在的连续4个0前面非零码元的符号

   end                         

        if rn(k)==0

            if rn(k+1)==0

                if rn(k+2)==0

                    if rn(k+3)==0  %检测是否连续4个码元都是0

                        rn(k+3)=2*m; %用2表示书上的V

                    end

                end

            end

        end

end

rn ;                                 %插入V(2)后   checked           

l=1;                                 %l=1表示两个V之间有偶数个非零码,0是偶数,所以初始为1,l=-1表示两个V之间有奇数个非零码

for s=1:a

    if abs(rn(s))==2

        for d=s+1:a

            if abs(rn(d))==1           %V之间的非零码只有+1,-1遇到一个一使l变一次号,表示偶数或奇数

                l=-l;

            end

            if abs(rn(d))==2

                if l~=1

                l=1;                       %不需要插入B时若检测到V也应把计数器清零

                                            %最初版本的升级处1

                else                           %检测到下一个V时,若为偶数个,则插入B

                rn(d-3)=3*(-(rn(d-4))/(abs(rn(d-4))));               %3代表B,插入不带符号的B

                rn(d:a)=-rn(d:a);

                end                           %V后的符号再交替

            end

            

        end

    end

end

rn                                      %到此处完成了插入不带符号的B

%for s=1:a

   % if abs(rn(s))==3                                %找到B

        %rn(s)=rn(s)*(-(rn(s-1))/(abs(rn(s-1))));           %B(3)与前一个位置的带符号的归一值相乘再取反,实现符号B(3)的极性与前一非符号的相反 

                                               %B后面第三个就是接下来的V,从它开始非零码正负号交替变化

    %end

%end

            

       

HDB=rn;                                        %给B(3)添加了符号,并且实现了V后的符号再交替

HDB                                     

                                                %以上便实现了HDB3的编码

                                                 %下面进行解码

for k=1:a   

    if abs(rn(k))==2

        rn(k-3)=0;rn(k)=0;                       %每个V(2)都变成0,V前面第三个有可能是B(3)有可能是0也恢复为0                      

    end

    if abs(rn(k))==1

        rn(k)=1;

    end

end

rn                                            %解码后的恢复序列

rn-ori                                         %解码与原码比较全为0则解码正确

       

s=menu('通信原理','2ASK','2PSK','2FSK','2DPSK')

switch s

 case 1,scolor='2ASK';

n=8;N=100;K=4;

a=randint(1,n);

bita=[];sl=[];

bitRate=1e3;fc=1e3;%载频1KHZ

t=linspace(0,1/bitRate,N);

for i=1:length(a)

    if a(i)==0

        bit1=zeros(1,N);

    else 

        bit1=ones(1,N);

    end

 bita=[bita,bit1];

 c=sin(2*pi*t*fc);

 sl=[sl c];

end

figure(1);

subplot(K,1,1);plot(bita,'LineWidth',1.5),title('基带信号'),grid on;axis([0,N*length(a),-2.5,2.5]);

tz=bita*6.*sl;

subplot(K,1,2);plot(tz,'LineWidth',1.5);title('ASK调制后信号');grid on;

signal=awgn(tz,80,'measured');

subplot(K,1,3);plot(signal,'LineWidth',1.5),grid on;title('信号+噪声')

Fs=3e3;

[b,a]=ellip(4,0.1,40,[999.9,1000.1]*2/Fs);%设计IIR带通滤波器,阶数为4,通带纹波0.1,阻带衰减40DB

sf=filter(b,a,signal);%信号通过该滤波器

figure(2);

K1=4;

subplot(K1,1,1);plot(sf,'LineWidth',1.5),grid on;title('BPF')

signal2=abs(sf);   %乘同频同相sin

subplot(K1,1,2);plot(signal2,'LineWidth',1.5),grid on;title('全波整流器');  

Fs=3e3;%抽样频率400HZ

[b,a]=ellip(4,0.1,40,[50]*2/Fs);%设计IIR低通滤波器

sf1=filter(b,a,signal2);%信号通过该滤波器,输出信号sf

subplot(K1,1,3);plot(sf1,'LineWidth',1.5),grid on;title('LPF'); 

sf2=[];

LL=fc/bitRate*N;

i=LL/2;

bitb=[];

while (i<=length(sf1)) %判决

sf2=[sf2,sf1(i)>=0.001];

        i=i+LL;

    end    

for i=1:length(sf2)

        if sf2(i)==0

           bit1=zeros(1,N);

        else 

           bit1=ones(1,N);

        end

     bitb=[bitb,bit1];

end

figure(1);

subplot(K,1,4); plot(bitb,'LineWidth',1.5),grid on;title('解调后信号'); axis([0,N*length(sf2),-2.5,2.5]);

 case 2,scolor='2PSK';

     l=linspace(0,pi,50);%  数据初始化

t=linspace(0,9*pi,450);

b=1:1:9;

out=1:1:450;

f=1:1:450;

g=1:1:450;

w1=2         %正弦波f1的频率,可以根据自己想要的频率在此改写

        %正弦波f2的频率,可以根据自己想要的频率在此改写

f1=sin(w1*l);

figure(1);

f2=sin(w1*l+pi);

figure(1);

subplot(2,1,1),plot(l,f1),axis([0 pi -1.2 1.2]),xlabel('t'),ylabel('f1');%画出f1信号波形

subplot(2,1,2),plot(l,f2),axis([0 pi -1.2 1.2]),xlabel('t'),ylabel('f2');%画出f2信号波形

a=[0 1 0 0 0 1 1 0 1]

for i=1:9         %2pSK编码

    if a(i)==0

        for k=1:50   %如果二进制原码为0则输出f1波形

            out(k+50*(i-1))=f1(k);

        end

    else 

        for j=1:50

        out(j+50*(i-1))=f2(j); %r如果二进制原码为1则输出f2波形

        end

    end

end

for i=1:9           %2PSK解码

    n=0;m=0;

    for j=1:50

        if out(j+50*(i-1))-f1(j)==0

            n=n+1;

        else  if out(j+50*(i-1))-f2(j)==0

                m=m+1;

              end

        end

    end

if n>m

        b(i)=0;

    else  b(i)=1;

    end

end    

b

for i=1:9   %画出解码后的波形 ,包括原码和解码出的码,进行对比

    for j=1+50*(i-1):50*i

        f(j)=a(i);

        g(j)=b(i);

    end

end

figure(2);

subplot(3,1,1),plot(t,f),axis([0 9*pi -0.2 1.2]),xlabel('t'),ylabel('数字基带调制原码');

subplot(3,1,2),plot(t,out),axis([0 9*pi -1.2 1.2]),xlabel('t'),ylabel('调制好的波形');

subplot(3,1,3),plot(t,g),axis([0 9*pi -0.2 1.2]),xlabel('t'),ylabel('解码得到的码');

[Num,Rat]=biterr(f,g)

  case 3,scolor='2FSK';

%==生成随机码元、基带信号、调制================%

n=8;%随机码元个数

N=100;%模拟一个码元的点数

K=4;%figure1画四个小图

a=randint(1,n)%码元生成

bita=[];%定义空数组,存放基带信号

for i=1:length(a)

    if a(i)==0

        bit1=zeros(1,N);

    else 

        bit1=ones(1,N);

    end

 bita=[bita,bit1];%基带信号

end

figure(1);

subplot(K,1,1);plot(bita,'LineWidth',1.5),title('基带信号'),grid on;axis([0,N*length(a),-2.5,2.5]);

bitRate=1e3;%每一个码元中采样点的间隔宽度0.001s

fc=1e3;%载频1KHZ

t=linspace(0,1/bitRate,N);

tz=[];

    c1=sin(2*pi*t*fc);%载波

    c2=sin(2*pi*t*fc*2);%载波

    for i=1:length(a)

       if a(i)==1

          tz=[tz,c1];

       else

         tz=[tz,c2];

       end

    end

subplot(K,1,2);plot(tz,'LineWidth',1.5);title('2FSK已调信号');grid on;

signal=awgn(tz,20,'measured');%加噪

subplot(K,1,3);plot(signal,'LineWidth',1.5),grid on;title('信号+噪声')

%===========解调============%

Fs=5e3;%采样频率

[b1,a1]=ellip(4,0.1,40,[999.9,1000.1]*2/Fs);%设计IIR带通滤波器,阶数为4,通带纹波0.1,阻带衰减40DB

[b2,a2]=ellip(4,0.1,40,[1999.9,2000.1]*2/Fs);

sa=filter(b1,a1,signal);%信号通过该滤波器

sb=filter(b2,a2,signal);

figure(2);

K1=3;%figure2画(3*2)幅图表示解调过程

subplot(K1,2,1);plot(sa,'LineWidth',1.5),grid on;title('BPF')

subplot(K1,2,2);plot(sb,'LineWidth',1.5),grid on;title('BPF')

%======相乘器=============%

t=linspace(0,1/bitRate,N);

c1=sin(2*pi*t*fc);

c2=sin(2*pi*t*fc*2);

sia=[];

sib=[];

    for i=1:n

        sia=[sia,c1];

        sib=[sib,c2];

    end

        siga=sa.*sia;%乘同频同相sia

        sigb=sb.*sib;%乘同频同相sib

subplot(K1,2,3);plot(siga,'LineWidth',1.5),grid on;title('相乘器');  

subplot(K1,2,4);plot(sigb,'LineWidth',1.5),grid on;title('相乘器');  

%========LPF================%

Fs=5e3;%抽样频率400HZ

[b1,a1]=ellip(4,0.1,40,[50]*2/Fs);%设计IIR低通滤波器

[b2,a2]=ellip(4,0.1,40,[50]*2/Fs);%设计IIR低通滤波器

sfa=filter(b1,a1,siga);%信号通过该滤波器,输出信号sfa

sfb=filter(b2,a2,sigb);%信号通过该滤波器,输出信号sfb

subplot(K1,2,5);plot(sfa,'LineWidth',1.5),grid on;title('LPF'); 

subplot(K1,2,6);plot(sfb,'LineWidth',1.5),grid on;title('LPF');

%===========抽样判决==================%

s2a=[];s2b=[];

LL=fc/bitRate*N;

i1=LL/2;i2=LL;

bitb=[];

while (i1<=length(sfa)) %判决过程

s2a=[s2a,sfa(i1)>=0];

        i1=i1+LL;

end

while (i2<=length(sfb))

s2b=[s2b,sfb(i2)<=0];

  i2=i2+LL;

end    

for i=1:n

if s2a(i)>s2b(i)

           bit1=zeros(1,N);

        else 

           bit1=ones(1,N);

        end

     bitb=[bitb,bit1];

end

figure(1);

subplot(K,1,4); plot(bitb,'LineWidth',1.5),grid on;title('解调后信号'); axis([0,length(bitb),-2.5,2.5]);

  case 4,scolor='2DPSK';

      %- 2DPSK 调制与解调

%---------------------------------------------------

%>>>>>>>>>>>>>>>>>>Initial_Part>>>>>>>>>>>>>>>>>>>>>

%---------------------------------------------------

fs = 30000;

Time_Hold_On = 0.1;

Num_Unit = fs * Time_Hold_On;

High_Level = ones ( 1, Num_Unit );

Low_Level = zeros ( 1, Num_Unit );

w = 300;

A = 1;

%---------------------------------------------------

%>>>>>>>>>>>>>>>>>>Initial_The_Signal>>>>>>>>>>>>>>>

%---------------------------------------------------

Sign_Set = [0,1,1,0,1,0,0,1]

Lenth_Of_Sign = length ( Sign_Set );

st = zeros ( 1, Num_Unit * Lenth_Of_Sign );

sign_orign = zeros ( 1, Num_Unit * Lenth_Of_Sign );

sign_result = zeros ( 1, Num_Unit * Lenth_Of_Sign );

t = 0 : 1/fs : Time_Hold_On * Lenth_Of_Sign - 1/fs;

%---------------------------------------------------

%>>>>>>>>>>>产生基带信号>>>>>>>>>>>>

%---------------------------------------------------

for I = 1 : Lenth_Of_Sign

 if Sign_Set(I) == 1

  sign_orign( (I-1)*Num_Unit + 1 : I*Num_Unit) = High_Level;

 else

  sign_orign( (I-1)*Num_Unit + 1 : I*Num_Unit) = Low_Level;

 end

end

%---------------------------------------------------

%>>>>>>>>>>>>>>>>>>调制部分>>>>>>>>>>>>>>>>>>

%---------------------------------------------------

for I = 1 : Lenth_Of_Sign

 if Sign_Set(I) == 1

  st( (I-1)*Num_Unit + 1 : I*Num_Unit) = A * cos ( 2 * pi * w * t( (I-1)*Num_Unit + 1 : I*Num_Unit ) + ( pi / 2 ) );

 else

  st( (I-1)*Num_Unit + 1 : I*Num_Unit) = A * cos ( 2 * pi * w * t( (I-1)*Num_Unit + 1 : I*Num_Unit ) );

    end

end

figure

subplot ( 2,1,1 )

plot(t, sign_orign);

axis( [ 0 , Time_Hold_On *( Lenth_Of_Sign + 1), - (A / 2), A + (A / 2) ] );

title ( '原始信号' );

grid

subplot ( 2, 1, 2 );

plot ( t, st );

axis( [ 0 , Time_Hold_On *( Lenth_Of_Sign + 1), - 3*(A / 2), 3*(A / 2) ] );

title ( '调制后的信号' );

grid

%---------------------------------------------------

%>>>>>>>>>>>>>>>>>>相乘>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

%---------------------------------------------------

dt  = st .* cos ( 2 * pi * w * t );

figure

plot ( t, dt );

axis( [ 0 , Time_Hold_On *( Lenth_Of_Sign + 1), - 3*(A / 2), 3*(A / 2) ] );

title ( '相乘后的波形' );

grid

%---------------------------------------------------

%>>>>>>>>>>>>>>>>>>>低通滤波部分>>>>>>>>>>>>>>>>>>>>

%---------------------------------------------------

[N,Wn] = buttord( 2*pi*50, 2*pi*150,3,25,'s'); %临界频率采用角频率表示

[b,a]=butter(N,Wn,'s');

[bz,az]=impinvar(b,a,fs); %映射为数字的

dt = filter(bz,az,dt);

figure

plot ( t, dt );

axis( [ 0 , Time_Hold_On *( Lenth_Of_Sign + 1), - 3*(A / 2), 3*(A / 2) ] );

title ( '低通滤波后的波形' );

grid

%---------------------------------------------------

%>>>>>>>>>>>>>抽样判决 & 逆码变换部分>>>>>>>>>>>>>>>

%---------------------------------------------------

for I = 1 : Lenth_Of_Sign

if dt((2*I-1)*Num_Unit/2) < 0.25

  sign_result( (I-1)*Num_Unit + 1 : I*Num_Unit) = High_Level;

 else

  sign_result( (I-1)*Num_Unit + 1 : I*Num_Unit) = Low_Level;

    end

end

figure

plot ( t, sign_result );

axis( [ 0 , Time_Hold_On *( Lenth_Of_Sign + 1), - 3*(A / 2), 3*(A / 2) ] );

title ( '解调后信号' );

grid 

end

四、测试数据

运行程序

命令窗口会显示随进产生的二进制码,对此二进制码进行HDB3编码之后得码元,解码之后得码元以及解码之后得码元与原基带码进行比较得结果 如下图:

还会出现调制解调得选择窗口,来进行选择调制解调方式 如下

在选择窗口中可以看到有四种调制解调方式

选择2ASK进行调制解调

可以看到随机得基带信号,2ASK调制后的信号以及2ASK解调后的信号

进入菜单 从新选择2PSK

可以看到随机产生得2PSK基带信号,2PSK调制后的信号以及2PSK解调后的信号

进入菜单栏重新选择2FSK调制解调

可以看到随机产生得基带信号,使用2FSK调制后的信号以及使用2FSK解调后的信号

进入菜单栏从新选择2DPSK调制解调

以上为随机产生得二进制原始信号以及2DPSK调制之后得信号

使用2DPSK解调之后的信号

五、调试分析

1、调试方法:运行程序,按要求测试各功能能否实现,如果不能实现,则寻找问题原因,修改程序后再次运行,再次测试功能能否实现,直到成功实现所有功能。

2、问题分析与解决措施.

在调试过程中遇到了

(1)输出数据出错.

错误:有时运行程序,在产生随机二进制码时由于程序的不稳定,在产生1的时候却产生了2,进行程序修改之后是之变得稳定。

(2)输出提示语句未显示

错误:提示语与程序中设置显示语言发生冲突。

(3)使用menu模块时未能成功连接

错误:连接语使用不一致

六、用户使用手册

《通信原理(第六版)》  

樊昌信 曹丽娜编

国防工业出版社

《MATLAB程序设计与应用(第二版)》

刘卫国主编

高等教育出版社

七、心得体会

通过这两周的通信原理课程设计实践,我复习了MATLAB编程语言的基本概念、语法、语义和数据类型的使用特点,加深了对课堂所学理论知识的理解,掌握了运用结构化程序设计的基本思想和方法,更重要的是培养了自己的自学能力。

因为这是我们第二次接触MATLAB编程语言,在编写程序以及调试的过程中遇到了很多困难,但是我通过去图书馆查找资料,请教同学老师,再自己一点点改善程序,最终编写出一个比较完善的程序,实现了所有要求功能,这是最值得我欣慰的一点。

    以下是我的几点切身感受:

   (一)编写程序需要一个清醒的头脑,明确的思路,同时也要有耐心毅力。

刚拿到程序设计课题时,我感觉一片茫然,因为在之前的信号处理学习中,只是在一些例题中接触过MATLAB语言,甚至没有看过一些基础的书籍,更没有上过课,所以初次遇到一个实际问题,感觉无从下手。这是由于自己对MATLAB的模块设计不够理解,同时对MATLAB的基本语句一无所知,不过通过请教老师懂得了首先要设计guide目录,再根据用户输入,执行swtich语句,在每个case后调用一个函数,来实现要求的功能,这样一下子豁然开朗,掌握了基本设计思路之后,后面的编程就顺利多了。至此,我真真体会到清晰地思路对成功编写一个程序的重要性。

  当然成功编写一个程序绝非易事,之前,我总以为程序能够正常运行,就代表着编程成功,后来我才发现我大错特错了。我用了三天时间,完成了程序的编写、改错,但我立刻发现尽管程序能够正常运行,部分功能却不完善,甚至不能实现。经过一次又一次调试、修改又修改,一点一点发现问题并改正,我才真正发现编程远没有想象中的简单。它需要的不仅是清晰地编程思路、编程技巧,还需要有耐心有毅力,不要放弃。

(二)我们在大学需要学习的不仅是基础知识、专业知识,更重要的是一种学习能力。

正如老师所说学习是终生的,因此学习能力也就能让我们受益终生。由于课堂时间有限,MATLAB课程只能靠我们自学,然而guide画图功能我们必须用到,因此只能通过自习,实践也证明我们是有自学的潜能的,通过自学课本,不理解的知识,通过查找资料,请教老师,最终掌握知识,因此,这次课程设计时间培养了我们的自学能力。

(三)要学会向他人请教,与他人合作。

在编程过程中,我遇到了许多问题,通过查找资料也未能找到原因,每次我想老师请教,老师总能不厌其烦地一点点讲解。有时,老师为了帮我在那几百行的程序中找到问题,花上一个多小时,这让我非常感动。大学中的老师是每个大学生的好资源,他的博学、重教,向他们请教会有很大收获。

在编程过程中,我与我组成员共同讨论,为对方查找错误,提示建议,在这个过程中我收获甚多,也培养了自己的合作精神。

   (四)要学会总结,提高。

在编程过程中,我发现自己的程序还有很多地方可以完善。程序的界面可以做得更加人性化,这样使用户使用更加方便,画图函数也还可以改进,例如:在使用figure分图显示的时候,我尽量选择部分图,都在一个figure中显示,这样既符合了,老师的要求——尽量在一个图中完成设计,同时也使整个设计的显得干净利落。下载本文

显示全文
专题