通信原理与MATLAB(十二):MSK的调制解调

1.MSK的调制原理

MSK调制原理如下图所示,基带码元先差分编码,然后经过串并转换分成I、Q两路,再与对应的载波相乘,然后再相加完成MSK的调制。
其中注意:I、Q两路码元分别是差分编码后的相对码的奇数和偶数位置上的码元,I路对应于奇数,Q路对应于偶数。而pk是I路码元,但是其码元宽度Tb是相对码的码元宽度Ts的两倍,并且延时一个Ts;而qk是Q路码元,其码元宽度Tb也是相对码码元宽度Ts的两倍。
例如,绝对码元是10001,如果参考电平是1,那么相对码元是100001,然后经过单极性码变为双极性码,1转换成1,0转换成-1,则I路码元是1 -1 -1,Q路码元是-1 -1 1。pk也是1 -1 -1,但是pk的码元宽度Tb是相对码的码元宽度Ts的两倍,并且延时Ts。而qk是-1 -1 1,但是qk的码元宽度Tb是相对码的码元宽度Ts的两倍。
在这里插入图片描述
在这里插入图片描述

2.MSK的解调原理

MSK的解调原理如下图所示,MSK信号再分为I、Q两路和对应的载波相乘,然后经过低通滤波器后进行抽样判决,判决之后的I、Q路码元进行合并,I路为最终码元序列的奇数位置码元,Q路为最终码元序列的偶数位置码元,然后进行解差分编码,恢复出原始的码元序列。
在这里插入图片描述

3.MSK代码

clear all;                  % 清除所有变量
close all;                  % 关闭所有窗口
clc;                        % 清屏
%% 基本参数
M=11;                       % 产生码元数    
L=100;                      % 每码元复制L次,每个码元采样次数
Ts=0.001;                   % 每个码元的宽度,即码元的持续时间
Rb=1/Ts;                    % 码元速率1K
dt=Ts/L;                    % 采样间隔
TotalT=M*Ts;                % 绝对码总时间
t=0:dt:TotalT-dt;           % 时间1
TotalT2=(M+1)*Ts;           % 相对码总时间
t2=0:dt:TotalT2-dt;         % 时间2
Fs=1/dt;                    % 采样间隔的倒数即采样频率

%% 产生单极性波形
wave=randi([0,1],1,M);      % 产生二进制随机码,M为码元个数

%% 绝对码变相对码
wave2=ones(1,M+1);          % 产生1*(M+1)的全1行向量
%% 相对码第一个参考值为1,相对码b(n+1)=绝对码a(n)和相对码b(n)做异或
for  k = 2:M+1
    wave2(k) = xor(wave(k-1),wave2(k-1));%生成相对码
end
fz=ones(1,L);               % 定义复制的次数L,L为每码元的采样点数
x1=wave(fz,:);              % 将原来wave的第一行复制L次,称为L*M的矩阵
juedui=reshape(x1,1,L*M);   % 将刚得到的L*M矩阵,按列重新排列形成1*(L*M)的矩阵
x2=wave2(fz,:);             % 将原来wave2的第一行复制L次,称为L*(M+1)的矩阵
jidai=reshape(x2,1,L*(M+1));% 将刚得到的L*(M+1)矩阵,按列重新排列形成1*(L*(M+1))的矩阵

%% 单极性变为双极性
% 基带信号变为双极性即jidai为1的时候,jidai为1;jidai为0的时候,jidai为-1
for n=1:length(jidai)
    if jidai(n)==1
        jidai(n)=1;
    else
        jidai(n)=-1;
    end
end

%% 产生I、Q两路码元
I_lu=wave2(1:2:end);        % 相对码的奇数位置为I路码元
Q_lu=wave2(2:2:end);        % 相对码的偶数位置为Q路码元

%% I、Q两路单极性码元变为双极性码元
I_lu=2*I_lu-1;
Q_lu=2*Q_lu-1;

%%I、Q两路码元的单个码元的持续时间是原始码元中单个码元的两倍,Tb=2Ts,并且I路码元延时Ts
fz2=ones(1,2*L);            % 定义复制的次数2L
x3=I_lu(fz2,:);             % 将原来I_lu的第一行复制2L次,称为2L*((M+1)/2)的矩阵
I=reshape(x3,1,(2*L)*((M+1)/2));% 将刚得到的2L*((M+1)/2)矩阵,按列重新排列形成1*(2L*((M+1)/2))的矩阵
x4=Q_lu(fz2,:);             % 将原来Q_lu的第一行复制2L次,称为2L*((M+1)/2)的矩阵
Q=reshape(x4,1,(2*L)*((M+1)/2));% 将刚得到的2L*((M+1)/2)矩阵,按列重新排列形成1*(2L*((M+1)/2))的矩阵
I_yanshi=zeros(1,length(I));% 产生1*length(I)的零向量
% I路延时Ts,即I路1至L置零,原来1(2*L)*((M+1)/2)-L的数移动到L+1至最后
I_yanshi(L+1:end)=I(1:(2*L)*((M+1)/2)-L);

%% 绘制码元波形
figure(1);                  % 绘制第1幅图
subplot(411);               % 窗口分割成4*1的,当前是第1个子图 
plot(t,juedui,'LineWidth',2);% 绘制绝对码元波形,线宽为2
title('绝对码信号波形');    % 标题
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签
axis([0,TotalT,-1.1,1.1])   % 坐标范围限制

subplot(412);               % 窗口分割成4*1的,当前是第2个子图 
plot(t2,jidai,'LineWidth',2);% 绘制相对码元波形,线宽为2
title('相对码信号波形');    % 标题
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签
axis([0,TotalT2,-1.1,1.1])  % 坐标范围限制

subplot(413);               % 窗口分割成4*1的,当前是第3个子图 
plot(t2,I,'LineWidth',2);   % 绘制I路码元波形,线宽为2
title('I路信号波形');       % 标题
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签
axis([0,TotalT2,-1.1,1.1])  % 坐标范围限制

subplot(414);               % 窗口分割成4*1的,当前是第4个子图 
plot(t2,Q,'LineWidth',2);   % 绘制Q路码元波形,线宽为2
title('Q路信号波形');       % 标题
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签
axis([0,TotalT2,-1.1,1.1])  % 坐标范围限制
%% MSK调制
fc1=4000;                   % 载波1频率4kHz   
fc2=1/(4*Ts);               % 载波2频率1/(4*Ts)  
zb1=cos(2*pi*fc1*t2);       % 同相载波1
zb2=-sin(2*pi*fc1*t2);      % 正交载波1
zb3=cos(2*pi*fc2*t2);       % 同相载波2
zb4=sin(2*pi*fc2*t2);       % 正交载波2
I_wave=I_yanshi.*zb1;             
I_wave=I_wave.*zb3;         % I路波形
Q_wave=Q.*zb2;       
Q_wave=Q_wave.*zb4;         % Q路波形
msk=I_wave+Q_wave;          % MSK的调制 
figure(2);                  % 绘制第2幅图
subplot(411)                % 窗口分割成4*1的,当前是第1个子图 
plot(t2,I_wave,'LineWidth',2);% 绘制I路信号的波形 
title('I路信号波形')        % 标题
axis([0,TotalT2,-1.1,1.1]); % 坐标范围限制
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签

subplot(412)                % 窗口分割成4*1的,当前是第2个子图 
plot(t2,Q_wave,'LineWidth',2);% 绘制Q路信号的波形 
title('Q路信号波形')        % 标题
axis([0,TotalT2,-1.1,1.1]); % 坐标范围限制
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签

subplot(413)                % 窗口分割成4*1的,当前是第3个子图 
plot(t2,msk,'LineWidth',2); % 绘制MSK的波形 
title('MSK信号波形')        % 标题
axis([0,TotalT2,-1.1,1.1]); % 坐标范围限制
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签
%% 信号经过高斯白噪声信道
tz=awgn(msk,20);            % 信号msk中加入白噪声,信噪比为SNR=20dB
subplot(414);               % 窗口分割成4*1的,当前是第4个子图 
plot(t2,tz,'LineWidth',2);  % 绘制MSK信号加入白噪声的波形
axis([0,TotalT2,-1.5,1.5]); % 坐标范围设置
title('通过高斯白噪声信道后的信号');% 标题
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签
%% 解调部分
jt1=tz.*zb1.*zb3;           % 相干解调,I路乘以相干载波
jt2=tz.*zb2.*zb4;           % 相干解调,Q路乘以相干载波
figure(3);                  % 绘制第3幅图
subplot(511)                % 窗口分割成5*1的,当前是第1个子图 
plot(t2,jt1,'LineWidth',2)  % 绘制I路乘以相干载波后的信号
axis([0,TotalT2,-1.5,1.5]); % 设置坐标范围
title("I路乘以相干载波后的信号")% 标题
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签

subplot(512)                % 窗口分割成5*1的,当前是第2个子图 
plot(t2,jt2,'LineWidth',2)  % 绘制Q路乘以相干载波后的信号
axis([0,TotalT2,-1.5,1.5]); % 设置坐标范围
title("Q路乘以相干载波后的信号")% 标题
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签
%% 加噪信号经过滤波器
% 低通滤波器设计
fp=2*Rb;                    % 低通滤波器截止频率,乘以2是因为下面要将模拟频率转换成数字频率wp=Rb/(Fs/2)
b=fir1(30, fp/Fs, boxcar(31));% 生成fir滤波器系统函数中分子多项式的系数
% fir1函数三个参数分别是阶数,数字截止频率,滤波器类型
% 这里是生成了30(31个抽头系数)的矩形窗滤波器
[h,w]=freqz(b, 1,512);      % 生成fir滤波器的频率响应
% freqz函数的三个参数分别是滤波器系统函数的分子多项式的系数,分母多项式的系数(fir滤波器分母系数为1)和采样点数(默认)512
lvbo1=fftfilt(b,jt1);       % 对信号进行滤波,jt是等待滤波的信号,b是fir滤波器的系统函数的分子多项式系数
lvbo2=fftfilt(b,jt2);       % 对信号进行滤波,jt是等待滤波的信号,b是fir滤波器的系统函数的分子多项式系数

subplot(513);               % 窗口分割成5*1的,当前是第5个子图 
plot(w/pi*Fs/2,20*log(abs(h)),'LineWidth',2); % 绘制滤波器的幅频响应
title('低通滤波器的频谱');  % 标题
xlabel('频率/Hz');          % x轴标签
ylabel('幅度/dB');          % y轴标签

subplot(514)                % 窗口分割成5*1的,当前是第4个子图 
plot(t2,lvbo1,'LineWidth',2);% 绘制I路经过低通滤波器后的信号
axis([0,TotalT2,-1.1,1.1]); % 设置坐标范围
title("I路经过低通滤波器后的信号");% 标题
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签

subplot(515)                % 窗口分割成5*1的,当前是第5个子图 
plot(t2,lvbo2,'LineWidth',2);% 绘制Q路经过低通滤波器后的信号
axis([0,TotalT2,-1.1,1.1]); % 设置坐标范围
title("Q路经过低通滤波器后的信号");% 标题
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签

%% 抽样判决
% 滤波后的信号大于0,判决为1,小于0,判决为-1
for i=1:length(lvbo1)
    if lvbo1(i)>0
        pdst1(i)=1;
    else
        pdst1(i)=-1;
    end
end

for i=1:length(lvbo2)
    if lvbo2(i)>0
        pdst2(i)=1;
    else
        pdst2(i)=-1;
    end
end

% 取码元的中间位置上的值进行判决,由于I路延时了Ts,因此第一个抽样值为2L,间隔为2L
% Q路第一个抽样值为L,间隔为2L
I_panjue=[];
Q_panjue=[];
for j=(2*L):(2*L):((2*L)*((M+1)/2))
    if pdst1(j)>0
        I_panjue=[I_panjue,1];
    else
        I_panjue=[I_panjue,-1];
    end
end

for j=L:(2*L):((2*L)*((M+1)/2))
    if pdst2(j)>0
        Q_panjue=[Q_panjue,1];
    else
        Q_panjue=[Q_panjue,-1];
    end
end

x5=I_panjue(fz2,:);         % 将原来I_panjue的第一行复制2L次,称为2L*((M+1)/2)的矩阵
I_zong=reshape(x5,1,(2*L)*((M+1)/2));% 将刚得到的2L*((M+1)/2)矩阵,按列重新排列形成1*(2L*((M+1)/2))的矩阵
x6=Q_panjue(fz2,:);         % 将原来Q_panjue的第一行复制2L次,称为2L*((M+1)/2)的矩阵
Q_zong=reshape(x6,1,(2*L)*((M+1)/2));% 将刚得到的2L*((M+1)/2)矩阵,按列重新排列形成1*(2L*((M+1)/2))的矩阵

figure(4)                   % 绘制第4幅图
subplot(411)                % 窗口分割成4*1的,当前是第1个子图 
plot(t2,I_zong,'LineWidth',2)% 画出经过抽样判决后的信号
axis([0,TotalT2,-1.1,1.1]); % 设置坐标范用
title("I路经过抽样判决后的信号")% 标题
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签

subplot(412)                % 窗口分割成4*1的,当前是第2个子图 
plot(t2,Q_zong,'LineWidth',2)% 画出经过抽样判决后的信号
axis([0,TotalT2,-1.1,1.1]); % 设置坐标范用
title("Q路经过抽样判决后的信号")% 标题
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签

% 将I路码元为最终输出的奇数位置码元,将Q路码元为最终输出的偶数位置码元
code=[];

for n=1:(M+1)
    if mod(n, 2)~=0
        code = [code, I_panjue((n+1)/2)];
    else
        code = [code, Q_panjue(n/2)];
    end
end
x7=code(fz,:);              % 将原来code的第一行复制L次,称为L*(M+1)的矩阵
dout=reshape(x7,1,L*(M+1)); % 将刚得到的L*(M+1)矩阵,按列重新排列形成1*(L*(M+1))的矩阵

subplot(413)                % 窗口分割成4*1的,当前是第3个子图 
plot(t2,dout,'LineWidth',2) % 画出经过抽样判决后的信号
axis([0,TotalT2,-1.1,1.1]); % 设置坐标范用
title("恢复的相对码波形")   % 标题
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签

%% 相对码变绝对码
yuanma=ones(1,M);
for i=1:(M+1)
   if code(i)==1
       code(i)=1;
   else 
       code(i)=0;
   end
end

for k=1:M
   yuanma(k)=xor(code(k),code(k+1)); 
end

x8=yuanma(fz,:);            % 将原来yuanma的第一行复制L次,称为L*M的矩阵
yuanma_wave=reshape(x8,1,L*M);% 将刚得到的L*M+矩阵,按列重新排列形成1*(L*M)的矩阵

subplot(414)                % 窗口分割成4*1的,当前是第3个子图 
plot(t,yuanma_wave,'LineWidth',2) % 画出经过抽样判决后的信号
axis([0,TotalT,-1.1,1.1]);  % 设置坐标范用
title("恢复的绝对码波形")   % 标题
xlabel('时间/s');           % x轴标签
ylabel('幅度');             % y轴标签
%% 绘制频谱
%% 信源频谱
T=t2(end);                  % 时间
df=1/T;                     % 频谱分辨率
N=length(jidai);            % 采样长度
f=(-N/2:N/2-1)*df;          % 频率范围
mf=fftshift(abs(fft(jidai)));%对信源信号采用快速傅里叶变换并移到矩阵中心
figure(5)                   % 绘制第5幅图
subplot(211);               % 窗口分割成2*1的,当前是第1个子图 
plot(f,mf,'LineWidth',2);   % 绘制信源频谱波形
title("基带信号频谱");      % 标题
xlabel('频率/Hz');          % x轴标签
ylabel('幅度');             % y轴标签

%% MSK信号频谱
sf=fftshift(abs(fft(msk)));% 对MSK信号采用快速傅里叶变换并将0-fs频谱移动到-fs/2-fs/2
subplot(212)                % 窗口分割成2*1的,当前是第2个子图 
plot(f,sf,'LineWidth',2)    % 绘制MSK调制信号频谱
title("MSK信号频谱")        % 标题
xlabel('频率/Hz');          % x轴标签
ylabel('幅度');             % y轴标签
 
%% 乘以相干载波后的频谱
mmf=fftshift(abs(fft(jt1)));% 对I路相干载波信号采用快速傅里叶变换并移到矩阵中心
mmf2=fftshift(abs(fft(jt2)));% 对Q路相干载波信号采用快速傅里叶变换并移到矩阵中心
figure(6)                   % 绘制第6幅图
subplot(211);               % 窗口分割成2*1的,当前是第1个子图 
plot(f,mmf,'LineWidth',2)   % 画出I路乘以相干载波后的频谱
title("I路乘以相干载波后的频谱")% 标题
xlabel('频率/Hz');          % x轴标签
ylabel('幅度');             % y轴标签

subplot(212);               % 窗口分割成2*1的,当前是第2个子图 
plot(f,mmf2,'LineWidth',2)  % 画出Q路乘以相干载波后的频谱
title("Q路乘以相干载波后的频谱")% 标题
xlabel('频率/Hz');          % x轴标签
ylabel('幅度');             % y轴标签

%% 经过低通滤波后的频谱
dmf=fftshift(abs(fft(lvbo1)));%对I路低通滤波信号采用快速傅里叶变换并移到矩阵中心
dmf2=fftshift(abs(fft(lvbo2)));%对Q路低通滤波信号采用快速傅里叶变换并移到矩阵中心
figure(7);                  % 绘制第7幅图
subplot(211);               % 窗口分割成2*1的,当前是第1个子图 
plot(f,dmf,'LineWidth',2)   % 画出I路经过低通滤波后的频谱
title("I路经过低通滤波后的频谱");% 标题
xlabel('频率/Hz');          % x轴标签
ylabel('幅度');             % y轴标签

subplot(212);               % 窗口分割成2*1的,当前是第2个子图 
plot(f,dmf2,'LineWidth',2)  % 画出Q路经过低通滤波后的频谱
title("Q路经过低通滤波后的频谱");% 标题
xlabel('频率/Hz');          % x轴标签
ylabel('幅度');             % y轴标签

4.结果图

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

5.特点

最小移频键控(MSK)信号是一种包络恒定、相位连续、带宽最小,并
且严格正交的2FSK信号,抗干扰能力强。

猜你喜欢

转载自blog.csdn.net/qq_47598782/article/details/128630392
今日推荐