【matlab】 GMSK的调制与解调【附详尽注释】

2023-05-16

  • 简介
  • code

1 简介

MSK调制是调制指数为0.5的二元数字频率调制,具有很好的特性,如恒包络、相对窄的带宽、并可以相干检测。MSK【最小频移键控】信号在任一码元间隔内,其相位变化为Π/2,而在码元转换时刻保持相位连续。

然而,MSK信号的相位变化是折线,在码元转换时刻会产生尖角,从而使其频谱特性的旁瓣降缓慢,带外辐射相对较大。移动数字通信中采用高速传输速率时,要求邻道带外辐射低于-(60~80)dB,而MSK信号不能满足功率谱在相邻信道的取值低于主瓣峰值60dB以上的要求,所以需寻求进一步压缩带宽的方法。

为了进一步改善MSK【最小频移键控】的频谱特性,有效的办法是对基带信号进行平滑处理,使调制后的信号相位在码元转换时刻不仅连续而且变化平滑,从而达到改善频谱特性的目的。

GMSK作为MSK的改进型,即是以高斯低通滤波器作为预调滤波基带滤波器的MSK方式,所以称为高斯MSK或GMSK。

2 code【附详尽注释】

% 附录:MATLAB程序
%绘制调制波形00101010
%
clear all;
close all;

%******************** Preparation part ************************************
% Ts=1/16000;            %基带信号周期为1/16000s,即为16KHz

Tb=1/32000;            %[码元]输入信号周期为Ts/2=1/32000s,即32KHz【奈奎斯特采样】
BbTb=0.5;              %取BbTb为0.5,调制指数为0.5的二元数字频率调制
Bb=BbTb/Tb;            %3dB带宽              -_-半带宽=码元频率一半-_-!
Fc=32000;              %载波频率为32KHz      -_-载波频率=码元频率-_-!
Fc_sample=64;          %每载波采样64个点
B_num=8;               %基带信号为8个码元
Dt=1/(Fc*Fc_sample);   %采样间隔[载波周期/采样点数][4.88281250000000e-07]
B_sample=Tb/Dt;        %每基带码元采样点数 B_sample=Tb/Dt[输入信号/采样间隔]
t=0:Dt:B_num*Tb-Dt;    %仿真时间离散点[采样间隔,码元数*(时间/码元)]
T=Dt*length(t);        %仿真时间值[采样间隔*512个采样点]
Ak=[0 0 1 0 1 0 1 0];        %产生8个基带信号[8个比特]
Ak=2*Ak-1;    %[多此一举]    %单极性码元—>双极性码元
gt=ones(1,B_sample);         %每码元对应的载波信号[1*64]
Akk=sigexpand(Ak,B_sample);  %码元扩展[64*8->1*512]
temp=conv(Akk,gt);           %码元扩展[卷积向量Akk和gt 512+64-1]
Akk=temp(1:length(Akk));     %码元扩展[取出temp变量中前512个,类似于银行存款,第一年存入的钱会一直享受利息值最后一年,第二年存入的钱会一直享受利息值最后一年]

%************************* Filter initialization **************************

tt=-2.5*Tb:Dt:2.5*Tb-Dt;   %{2.5*码元周期}/{采样间隔=[载波周期/采样点数]}
%g(t)=Q[2*pi*Bb*(t-Tb/2)/sqrt(log(2))]-Q[2*pi*Bb*(t+Tb/2)/sqrt(log(2))];
%Q(t)=erfc(t/sqrt(2))/2;
gaussf=erfc(2*pi*Bb*(tt-Tb/2)/sqrt(log(2))/sqrt(2))/2-erfc(2*pi*Bb*(tt+Tb/2)/sqrt(log(2))/sqrt(2))/2; 
%the complementary error function erfc(X) is defined as
%erfc=2/sqrt(pi)int_{x}^{+\infty}exp{-t^2}dt
J_g=zeros(1,length(gaussf)); %使J_g 的长度和Gaussf的一样
%************************ SUM GMSK ****************************************

for i=1:length(gaussf)  %320个点
    if i==1 
        J_g(i)=gaussf(i)*Dt;          %若不乘以Dt,则最后结果要出错?
    else
        J_g(i)=J_g(i-1)+gaussf(i)*Dt; %若不乘以Dt,则最后结果要出错?
    end;
end;

J_g=J_g/2/Tb;    %若先前循环不乘以Dt,则最后结果要出错?

%******************** START CALCULATION ***********************************

%计算相位Alpha
Alpha=zeros(1,length(Akk));
k=1;  %计算第1个码元的相位
L=0;
for j=1:B_sample  %采样点数为64
    J_Alpha=Ak(k+2)*J_g(j);  %第3码元对应乘以J_g矢量第j[1-64]个值
    Alpha((k-1)*B_sample+j)=pi*J_Alpha+L*pi/2;% 刷新 Alpha512 中 1-64
end;

k=2;%计算第2个码元的相位
L=0;
for j=1:B_sample%采样点数为64
    J_Alpha=Ak(k+2)*J_g(j)+Ak(k+1)*J_g(j+B_sample);%第3码元对应乘以J_g矢量第j[65-128]个值
                                                   %第4码元对应乘以J_g矢量第j[1-64]个值
    Alpha((k-1)*B_sample+j)=pi*J_Alpha+L*pi/2;% 刷新 Alpha512 中 65-128
end;  

k=3;%计算第3个码元的相位
L=0;
for j=1:B_sample%采样点数为64
    J_Alpha=Ak(k+2)*J_g(j)+Ak(k+1)*J_g(j+B_sample)+Ak(k)*J_g(j+2*B_sample);
                                                 %第3码元对应乘以J_g矢量第j[129-192]个值  
                                                 %第4码元对应乘以J_g矢量第j[65-128]个值
                                                 %第5码元对应乘以J_g矢量第j[1-64]个值
    Alpha((k-1)*B_sample+j)=pi*J_Alpha+L*pi/2;% 刷新 Alpha512 中 129-192
end;  

k=4;%计算第4个码元的相位
L=0;%level为0,表示二进制相位轨迹,因而单位递增pi
for j=1:B_sample%采样点数为64
    J_Alpha=Ak(k+2)*J_g(j)+Ak(k+1)*J_g(j+B_sample)+Ak(k)*J_g(j+2*B_sample)+Ak(k-1)*J_g(j+3*B_sample);
                                                 %第3码元对应乘以J_g矢量第j[193-256]个值
                                                 %第4码元对应乘以J_g矢量第j[129-192]个值
                                                 %第5码元对应乘以J_g矢量第j[65-128]个值
                                                 %第6码元对应乘以J_g矢量第j[1-64]个值
    Alpha((k-1)*B_sample+j)=pi*J_Alpha+L*pi/2;% 刷新 Alpha512 中 193-256
end;

L=0;%level为0,表示二进制相位轨迹,因而单位递增pi
for k=5:B_num-2
    if k==5  %计算第5个码元的相位
        L=0;
    else     %计算第6个码元的相位
        L=L+Ak(k-3);  
    end;
    for j=1:B_sample%采样点数为64
        J_Alpha=Ak(k+2)*J_g(j)+Ak(k+1)*J_g(j+1*B_sample)+Ak(k)*J_g(j+2*B_sample)+Ak(k-1)*J_g(j+3*B_sample)+Ak(k-2)*J_g(j+4*B_sample);
%第3码元对应乘以J_g矢量第j[257-64*5]个值  |%第4码元对应乘以J_g矢量第j[64*4+1-64*5]个值|
%第4码元对应乘以J_g矢量第j[193-64*4]个值  |%第5码元对应乘以J_g矢量第j[193-64*4]个值   |
%第5码元对应乘以J_g矢量第j[129-64*3]个值  |%第6码元对应乘以J_g矢量第j[129-64*3]个值   |
%第6码元对应乘以J_g矢量第j[65-64*2]个值   |%第7码元对应乘以J_g矢量第j[65-64*2]个值    |
%第7码元对应乘以J_g矢量第j[1-64*1]个值    |%第8码元对应乘以J_g矢量第j[1-64*1]个值     |
        Alpha((k-1)*B_sample+j)=pi*J_Alpha+mod(L,4)*pi/2;% 刷新 Alpha512 中 64*4+1 - 64*5
                                         %相位变化+1*pi/2 % 刷新 Alpha512 中 64*5+1 - 64*6
    end;
end;

%B_num-1;
k=B_num-1;%计算第7个码元的相位
L=L+Ak(k-3); %level=0  此时L=1+Ak(4)=1-1=0
for j=1:B_sample%采样点数为64
    J_Alpha=Ak(k+1)*J_g(j+B_sample)+Ak(k)*J_g(j+2*B_sample)+Ak(k-1)*J_g(j+3*B_sample)+Ak(k-2)*J_g(j+4*B_sample);
                                        %第5码元对应乘以J_g矢量第j[64*4+1-64*5]个值   |
                                        %第6码元对应乘以J_g矢量第j[64*3+1-64*4]个值   |
                                        %第7码元对应乘以J_g矢量第j[64*2+1-64*3]个值   |
                                        %第8码元对应乘以J_g矢量第j[64*1+1-64*2]个值   |
    Alpha((k-1)*B_sample+j)=pi*J_Alpha+mod(L,4)*pi/2;%相位变化+0*pi/2 刷新 Alpha512 中 64*6+1-64*7
end;  

%B_num;
k=B_num;%计算第8个码元的相位
L=L+Ak(k-3);%level=1  此时L=0+Ak(4)=0+1=1
for j=1:B_sample%采样点数为64
    J_Alpha=Ak(k)*J_g(j+2*B_sample)+Ak(k-1)*J_g(j+3*B_sample)+Ak(k-2)*J_g(j+4*B_sample);
                                        %第6码元对应乘以J_g矢量第j[64*4+1-64*5]个值   |
                                        %第7码元对应乘以J_g矢量第j[64*3+1-64*4]个值   |
                                        %第8码元对应乘以J_g矢量第j[64*2+1-64*3]个值   |
    Alpha((k-1)*B_sample+j)=pi*J_Alpha+mod(L,4)*pi/2;%相位变化+1*pi/2 刷新 Alpha512 中 64*7+1-64*8
end;  

% 基带波形+相位波形+GMSK波形
x=0;
subplot(311)
plot(t/Tb,Akk,t/Tb,x,'r:');% [t/Tb]    %单极性码元—>双极性码元    Tb=64*Dt
%Tb:[码元]输入信号周期为Ts/2=1/32000s,即32KHz【奈奎斯特采样】
% t=0:Dt:B_num*Tb-Dt;    %仿真时间离散点[采样间隔,码元数*(时间/码元)]
% Dt=1/(Fc*Fc_sample);   %采样间隔[载波周期/采样点数][4.88281250000000e-07]
axis([0 8 -1.5 1.5]);
title('基带波形');

subplot(312)
plot(t/Tb,Alpha*2/pi);
axis([0 8 min(Alpha*2/pi)-1 max(Alpha*2/pi)+1]);
title('相位波形');

S_Gmsk=cos(2*pi*Fc*t+Alpha);%载波频率+相位
subplot(313)
plot(t/Tb,S_Gmsk,t/Tb,x,'r:');
axis([0 8 -1.5 1.5]);
title('GMSK波形');

%解调 % 延迟1bt,移相pi/2  GMSK波形 + 相位波形 + GMSK波形
for n=1:512;  %延迟1bt,移相pi/2 GMSK波形
    if n<=B_sample  % n<64
        Alpha1(n)=0;  % Alpha 前64 置0
    else
        Alpha1(n)=Alpha(n-B_sample);%右移64
    end
end
a=[0 1 1 1 1 1 1 1 ];
ak=sigexpand(a,B_sample); %码元扩展[8*64->1*512]
                          % Ak=[0 0 1 0 1 0 1 0]; %产生8个基带信号[8个比特]
                          % Akk=sigexpand(Ak,B_sample); %码元扩展[8*64->1*512]
temp=conv(ak,gt);         %码元扩展[卷积向量ak和gt 512+64-1]
ak=temp(1:length(ak));    %码元扩展[取出temp变量中前512个]
S_Gmsk1=cos(2*pi*Fc*(t-Tb)+Alpha1+pi/2).*ak; %延迟1Tb[一个码元周期],移相pi/2
figure
subplot(311)
plot(t/Tb,S_Gmsk1);
axis([0 8 -1.5 1.5]);
title('延迟1Tb,移相pi/2 GMSK波形');

xt=S_Gmsk1.*S_Gmsk;
subplot(312)
plot(t/Tb,xt);
axis([0 8 -1.5 1.5]);
title('相乘后波形');

%低通滤波
Fs=10000;     %采样频率【奈奎斯特准则】
rp=3;     rs=50; %通带纹波不超过rp dB 
                 %阻带衰减至少rs dB
wp=2*pi*50; ws=2*pi*800;% Passband corner frequency 通带截止频率
                        % Stopband corner frequency 阻带截止频率
[n,wn]=buttord(wp,ws,rp,rs,'s') %巴特沃斯滤波器的阶数和截止频率
% 这个函数返回满足性能所需通带波纹和阻带衰减条件下的最低阶N及截止频率
% in which case Wp and Ws are in radians/second

% *****设计一个n阶巴特沃斯模拟低通滤波器。画出其幅度和相位响应*************
[z,p,k]=buttap(n); %Butterworth滤波器原型,返回零点、极点和增益
% H(s) = z(s)/p(s) = k/( (s-p(1))(s-p(2))(s-p(3))...(s-p(1)))
[bp,ap]=zp2tf(z,p,k); %convert to transfer function form
[bs,as]=lp2lp(bp,ap,wn);
[b,a]=bilinear(bs,as,Fs);
y=filter(b,a,xt);
subplot(313)
plot(t/Tb,y,t/Tb,x,'r:');
axis([0 8 -1.5 1.5]);
title('经过低通滤波器后波形');

for i=1:8
    if y(i*B_sample)>0  % 8*64 = 512
        bt(i)=1
    else
        bt(i)=0
    end
end
bt=2*bt-1;  %解调,反向解码
btt=sigexpand(bt,B_sample);   %码元扩展
temp1=conv(btt,gt);           %码元扩展
btt=temp1(1:length(btt));     %码元扩展
figure
subplot(311)
plot(bt)
title('抽样值');
axis([0 8 -1.5 1.5]);
subplot(312)
plot(t/Tb,Akk,t/Tb,x,'r:');
axis([0 8 -1.5 1.5]);
title('原基带波形');
subplot(313)
plot(t/Tb,btt,t/Tb,x,'r:');
axis([0 8 -1.5 1.5]);
title('解调后波形');
title('抽样值');
axis([0 8 -1.5 1.5]);
subplot(312)
plot(t/Tb,Akk,t/Tb,x,'r:');
axis([0 8 -1.5 1.5]);
title('原基带波形');
subplot(313)
plot(t/Tb,btt,t/Tb,x,'r:');
axis([0 8 -1.5 1.5]);
title('解调后波形');


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【matlab】 GMSK的调制与解调【附详尽注释】 的相关文章

  • 将此 MATLAB 代码转换为 Python 时我做错了什么?

    我正在努力将生成波形的 MATLAB 代码转换为 Python 就上下文而言 这是原子力显微镜带激发响应的模拟 与代码错误无关 在 MATLAB 中从 r vec 生成的图形与我在 Python 中生成的图形不同 我是否正确地将 MATLA
  • 对多个属性使用一种设置方法 MATLAB

    我有几个属性基本上使用相同的属性set method classdef MyClass properties A B end methods function mc MyClass a b Constructor mc A a mc B b
  • 在 MATLAB 中使用 FFT 的频率响应

    这是场景 使用频谱分析仪 我有输入值和输出值 样本数是32000采样率为2000样本 秒 输入是正弦波50 hz 输入为电流 输出为压力 单位 psi 我如何使用 MATLAB 根据这些数据计算频率响应 使用 MATLAB 中的 FFT 函
  • 按元素出现的频率对数组元素进行排序

    是否可以在 matlab octave 中使用sort函数根据元素的相对频率对数组进行排序 例如数组 m 4 4 4 10 10 10 4 4 5 应该产生这个数组 5 10 10 10 4 4 4 4 4 5是出现频率较低的元素 位于顶部
  • 将自动生成的 Matlab 文档导出为 html

    我想为我开发的 Matlab 工具箱生成完整的帮助 我已经看到如何显示自定义文档 http www mathworks fr fr help matlab matlab prog display custom documentation h
  • 在 matlab 中求 3d 峰的体积

    现在我有一个带有峰值的 3D 散点图 我需要找到其体积 我的数据来自图像 因此 x 和 y 值表示 xy 平面上的像素位置 z 值是每个像素的像素值 这是我的散点图 scatter3 x y z 20 z filled 我试图找到数据峰值的
  • 如何在 Matlab 中对数组应用低通或高通滤波器?

    有没有一种简单的方法可以将低通或高通滤波器应用于 MATLAB 中的数组 我对 MATLAB 的强大功能 或数学的复杂性 有点不知所措 需要一个简单的函数或一些指导 因为我无法从文档或网络搜索中找到答案 看着那 这filter http w
  • 在 Matlab 中将 datenum 转换为 datetime 的最快方法

    我在 Matlab 中将 datenum 转换为 datetime 时遇到问题 Given dnum floor now floor now 1 我尝试了以下方法 datenum dnum 但这没有用 我发现有效的方法是 datetime
  • Matlab:如何更改矩阵的存储方式?从 1x1x3 到 1x3?

    我目前有 val 1 0 7216 val 2 0 7216 val 3 0 7216 但我想要 0 7216 0 716 0 721 我可以做什么样的操作来做到这一点 The reshape函数将在这里解决问题 Arrange the e
  • 如何告诉 mex 链接到 /usr/lib 中的 libstdc++.so.6 而不是 MATLAB 目录中的 libstdc++.so.6?

    现在 MATLAB 2012a 中的 mex 仅正式支持 gcc 4 4 6 但我想使用 gcc 4 7 风险自负 现在如果我直接用 mex 编译一些东西 它会抱怨 usr lib gcc i686 linux gnu 4 7 cc1plu
  • 括号中的波形符字符

    在 MATLAB 中 以下代码执行什么操作 m func returning matrix 波浪号运算符 的作用是什么 在 Matlab 中 这意味着不要将函数中相应的输出参数分配到赋值的右侧 因此 如果func returning mat
  • 黑白随机着色的六角格子

    我正在尝试绘制一个 10 000 x 10 000 随机半黑半白的六边形格子 我不知道如何将该格子的六边形随机填充为黑色和白色 这是我真正想要从这段代码中得到的示例 但我无法做到 https i stack imgur com RkdCw
  • 如何使用 MATLAB 的 substruct 函数创建表示使用“end”的引用的结构?

    我想使用substruct http www mathworks com help matlab ref substruct html函数创建一个结构体以供使用subsref 目的是使用索引字符串subsref而不是通常的 符号 因为我正在
  • glpk.LPX 向后兼容性?

    较新版本的glpk没有LPXapi 旧包需要它 我如何使用旧包 例如COBRA http opencobra sourceforge net openCOBRA Welcome html 与较新版本的glpk 注意COBRA适用于 MATL
  • 有效地绘制大时间序列(matplotlib)

    我正在尝试使用 matplotlib 在同一轴上绘制三个时间序列 每个时间序列有 10 6 个数据点 虽然生成图形没有问题 但 PDF 输出很大 在查看器中打开速度非常慢 除了以栅格化格式工作或仅绘制时间序列的子集之外 还有其他方法可以获得
  • 图像处理 - 使用 opencv 进行服装分割

    我正在使用 opencv 进行服装特征识别 第一步 我需要通过从图像中移除脸部和手来分割 T 恤 任何建议表示赞赏 我建议采用以下方法 Use 阿德里安 罗斯布鲁克的用于检测皮肤的皮肤检测算法 谢谢罗莎 格隆奇以获得他的评论 在方差图上使用
  • ROC曲线和libsvm

    给定一条 ROC 曲线plotroc m see here http www csie ntu edu tw cjlin libsvmtools roc curve for binary svm 理论问题 如何选择要使用的最佳阈值 编程问题
  • Matlab 的 imresize 函数中用于插值的算法是什么?

    我正在使用 Matlab Octaveimresize 对给定的二维数组重新采样的函数 我想了解如何使用特定的插值算法imresize works 我在Windows上使用八度 e g A 1 2 3 4 是一个二维数组 然后我使用命令 b
  • @(t)在Matlab中是什么意思? [复制]

    这个问题在这里已经有答案了 正如标题所示 考虑到下面的上下文 t 在 Matlab 中到底意味着什么 computeNumericalGradient 是一个函数 cofiCostFunc 也是一个接受一堆参数的函数 问题是 t 对 cof
  • 检测数据集中线性行为的算法

    我已经发布了一个关于对数据集的一部分进行多项式拟合的算法 https stackoverflow com q 17595932 2320757前一段时间收到一些建议去做我想做的事 但我现在面临另一个问题 我尝试应用答案中建议的想法 我的目标

随机推荐