【数字信号调制】基于matlab GUI FSK调制+解调【含Matlab源码 645期】

举报
海神之光 发表于 2022/05/29 03:20:07 2022/05/29
【摘要】 一、获取代码方式 获取代码方式1: 完整代码已上传我的资源: 【数字信号调制】基于matlab GUI FSK调制+解调【含Matlab源码 645期】 获取代码方式2: 通过订阅紫极神光博客付费专栏...

一、获取代码方式

获取代码方式1:
完整代码已上传我的资源: 【数字信号调制】基于matlab GUI FSK调制+解调【含Matlab源码 645期】

获取代码方式2:
通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。

备注:订阅紫极神光博客付费专栏,可免费获得1份代码(有效期为订阅日起,三天内有效);

二、FSK简介

1 FSK时域信号
数字频率调制(FM)是利用载波的频率传输信息的一种调制方式,其中最简单的是二进制频移键控(2FSK)。FM分为非连续相位FSK和连续相位FSK(CPFSK),两者的区别在于码元转换时刻的载波相位是否连续。
2FSK信号波形如下图所示,信号可以看成是频载为f1和f2的两个振幅键控信号的合成,2FSK信号可表示为:
在这里插入图片描述
式中,
在这里插入图片描述
式中,A是载波振幅,Tb为数字码元周期,{bn}为所传送的数字序列。
在这里插入图片描述
相位连续的FSK信号在码元转换时刻的相位是连续的,波形如下图所示。
在这里插入图片描述
此时调频信号可以表示为:
在这里插入图片描述
式中,fc是未调载波的频率,\delta fd是频偏因子。当m(t)为归一化基带信号时,\delta fd为峰值频偏,令
在这里插入图片描述
式中,h为调制指数或频移指数。

2 相关系数与频谱特性
设FSK信号在一个码元期间内的波形为:
在这里插入图片描述
这两个信号波形的相关系数定义为:
在这里插入图片描述
式中,
在这里插入图片描述
则带入上式有:
在这里插入图片描述
通常
在这里插入图片描述
则相关系数简化为:
在这里插入图片描述
其波形变化图如下所示:
在这里插入图片描述
从图中可以看出,两个信号的相关系数在k*pi的时候为零,也就是说它们具有正交特性。

CPFSK信号的功率谱形状直接由调制指数h确定。当h=0.5时,功率谱曲线为单峰;当h=0.715时,功率谱曲线呈现双峰;当h=1时,功率谱曲线的双峰变成了两条线状谱,且每条线状谱所占的功率都是信号功率的1/4,与离散相位2FSK信号的功率谱曲线相同;当h>1时,双峰的距离逐渐增加。

3 非相干解调
3.1相乘微分型AFC环解调法
AFC环是一个负反馈系统,从电路结构上看,AFC环主要由三种结构形式,比较广泛的是相乘微分型AFC环路。其架构如下图所示:
在这里插入图片描述
如果接收信号与本振信号存在频差,则在一定时间间隔内必然存在相差,将鉴相器输出的相位误差信号微分后,得到反映频差的误差信号,此信号经环路滤波器平滑处理后,控制VCO/NCO的振荡频率向输入信号频率靠近,最终使得频差近似为零。
设输入信号
在这里插入图片描述
VCO输入信号
在这里插入图片描述

在这里插入图片描述
显然有
在这里插入图片描述
当输入信号为单载波信号时,
在这里插入图片描述
故有
在这里插入图片描述
上式反映了输入信号和VCO输出信号的频差。对于FSK信号来讲,上式即为调制信号,对其进行滤波判决,即可完成FSK信号的解调。

3.2 包络检波解调法
2FSK信号的包络检波法解调方框图如下,可以视为由两路2ASK解调电路组成。这里的两个带通滤波器起分路作用,用以分开两路2ASK信号。上支路对应

在这里插入图片描述
下支路对应
在这里插入图片描述
经包络检测后分别取出他们的包络m1(t)和m2(t)。将两路滤波后的包络信号相减,在经过抽样判决,当判决值大于等于0时,判决为1,否则判决为0;
在这里插入图片描述

4 相干解调原理
4.1最佳FSK相干解调器
最佳解调器结构如下图所示,在接收端产生一直信号s1(t)和s2(t)的波形,分别将其与输入波形y(t)在相乘器中相乘,再进行积分。在t=Tb时刻,将两积分器的结果取样,并在比较器中比较判决。因为解调器是对接收码元逐个进行处理的,故在每个码元的终止时刻,在取样之后要将积分器清零,以便接着处理下一个码元。
在这里插入图片描述
相干载波s1(t)和s2(t)通常需要采用载波锁相环路提取,位同步信号则需要专门的位同步锁相环路提取。

4.2 易于实现的FSK相干解调器
4.1中的结构难以实现,通常采用下图结构实现:
在这里插入图片描述
FSK相干解调与ASK相干解调相似,FSK只是在用带通滤波器将信号分成上下两路后,在判决输出前增加一个减法器即可。

三、部分源代码

function varargout = GUI_2FSK(varargin)
% GUI_2FSK MATLAB code for GUI_2FSK.fig
%      GUI_2FSK, by itself, creates a new GUI_2FSK or raises the existing
%      singleton*.
%
%      H = GUI_2FSK returns the handle to a new GUI_2FSK or the handle to
%      the existing singleton*.
%
%      GUI_2FSK('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in GUI_2FSK.M with the given input arguments.
%
%      GUI_2FSK('Property','Value',...) creates a new GUI_2FSK or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before GUI_2FSK_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to GUI_2FSK_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help GUI_2FSK

% Last Modified by GUIDE v2.5 30-Nov-2018 14:09:53

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @GUI_2FSK_OpeningFcn, ...
                   'gui_OutputFcn',  @GUI_2FSK_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before GUI_2FSK is made visible.
function GUI_2FSK_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to GUI_2FSK (see VARARGIN)

% Choose default command line output for GUI_2FSK
handles.output = hObject;

i=20;                %二级制基带数据个数
fc=1000;             %抽样频率
j=i*fc;
s=round(rand(1,i));     %产生二级制基带数
t=linspace(0,i,j);
f1=10;               %载波1频率
f2=30;               %载波2频率
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%产生基带信号
s1=t;
for n=1:i
    if s(n)<1;
        for m=j/i*(n-1)+1:j/i*n
             s1(m)=0;
             end
        else
         for m=j/i*(n-1)+1:j/i*n
             s1(m)=1;
             end
        end
end
    s2=t;
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%基带信号求反
    for n=1:j;
         if s1(n)>=1;
             s2(n)=0;
             else
           s2(n)=1;
             end
    end;
    %figure(1);subplot(411);plot(t,s1);title('基带信号');axis([0,i,-1,2]);
        
    %subplot(412);plot(t,s2);title('基带信号求反');axis([0,i,-1,2]);
   
    F1=cos(2*pi*f1*t);    %载波信号1
    F2=cos(2*pi*f2*t);    %载波信号2
    %subplot(413);plot(t,F1);title('载波信号1');
    				
   
    Fsk=s1.*F1+s2.*F2;    %2Fsk调制
    %figure(2);subplot(311);plot(t,Fsk);title('2FSK调制信号')  
    
    
    


SNR_dB=15;          %定义信噪比     
SNR=10^(SNR_dB/10);  %定义线性信噪比
Ps=1;                %发射功率
Pn=Ps/SNR;           %噪声方差
F3=cos(2*pi*f1*t+pi/4);    
F4=cos(2*pi*f2*t+pi/4);
Fsk1=s1.*F3+s2.*F4;
t1=length(t);
z=sqrt(Pn/2)*randn(1,t1); 
h=1;              %AWGN信道下,信道增益h=1
Fskh=Fsk1*h+z;       %通过AWGN信道后产生pi/4的相移
%subplot(312);plot(t,z);       %噪声波形        title('噪声波形')
   

%subplot(313);plot(t,Fskh);title('通过信道加噪声后的接受信号');   axis([0,i,-1,1]);

b1=fir1(101,[10/500 15/500]);    %设置带通滤波器参数
b2=fir1(101,[30/500 40/500]); 
Fskh1=filter(b1,1,Fskh);              %经过带通滤波器后的信号
Fskh2=filter(b2,1,Fskh);            
%figure(3);subplot(211);plot(t,Fskh1);title('经过带通滤波器b1后的波形');axis([0,i,-1,1]);

%subplot(212);plot(t,Fskh2);title('经过带通滤波器b2后的波形');



FskH1=Fskh1.*Fskh1;
FskH2=Fskh2.*Fskh2; %经过相乘器
%figure(4);subplot(211);plot(t,FskH1);title('经过相乘器后Fskh1的波形')



%subplot(212);plot(t,FskH2);title('经过相乘器后Fskh2的波形')



bn=fir1(101,[2/500 10/500]);   %设置低通滤波器参数
st1=filter(bn,1,FskH1);           %经过低通滤波器
st2=filter(bn,1,FskH2);

%figure(5) ;subplot(211);plot(t,st1);title('经过低通滤波器bn后的波形')

%subplot(212);plot(t,st2);title('经过低通滤波器bn后的波形')


%判决
st1_sum=zeros(1,i); 
st2_sum=zeros(1,i);
for p=1:i           %抽样判决,在每一个基带代码带宽内按抽样频率抽样并相加比较
     for j=1000*(p-1)+1:1000*p
          st1_sum(p)=st1_sum(p)+st1(j);
          st2_sum(p)=st2_sum(p)+st2(j);
     end
     if(st1_sum(p)>=st2_sum(p))
          s_est(p)=1;
     else  s_est(p)=0;
     end
end

s3=t;                %解调后的基带信号
for n=1:i
    if s_est(n)<1;
        for m=j/i*(n-1)+1:j/i*n
             s3(m)=0;
             end
        else
         for m=j/i*(n-1)+1:j/i*n
             s3(m)=1;
             end
        end
end
%figure(6);subplot(211);plot(t,st);title('经过抽样判决器后的波形')


%subplot(212);plot(t,Fskh);title('原始的波形');axis([0,i,-1,1]);






%%%%%%%%%%%%%%%%%实际误码率曲线和理论误码率对比
PBSUM=0;
for n=1:10  %信噪比循环
   for m=1:1000     %蒙特卡洛循环
      SNR=n;
Ps=100;     %发射功率
Pn=Ps/SNR;
z=sqrt(Pn/2)*randn(1,t1);  %噪声方差
h=1;
Fskh=Fsk1*h+z;       %通过AWGN信道后产生pi/4的相移

b1=fir1(101,[10/500 15/500]);
b2=fir1(101,[30/500 40/500]);  %设置带通参数
Fskh1=filter(b1,1,Fskh);
Fskh2=filter(b2,1,Fskh);            %经过带通滤波器后的信号
FskH1=Fskh1.*Fskh1;
FskH2=Fskh2.*Fskh2;          %经过相乘器


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201

四、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 沈再阳.精通MATLAB信号处理[M].清华大学出版社,2015.
[2]高宝建,彭进业,王琳,潘建寿.信号与系统——使用MATLAB分析与实现[M].清华大学出版社,2020.
[3]王文光,魏少明,任欣.信号处理与系统分析的MATLAB实现[M].电子工业出版社,2018.

文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。

原文链接:qq912100926.blog.csdn.net/article/details/115292847

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。