m基于matlab的PCM-FM码同步和GMSK的调制和解调方法,包括多符号检测MSD和Turbo编解码

141 阅读3分钟

1.算法描述

  1. 用MATLAB仿真多符号检测(MSD)和Turbo乘积码的编解码,

 

  1. Turbo码同步参数的优化设计及其性能;

 

  1. 比较TPC和纠删码的性能;

 

  1. 学习GMSK的调制、解调方式,利用MATLAB对其进行仿真;并考虑是否可以利用PCM/FM加入PN码或其他方式实现测距功能;

 

       1.高斯最小频移键控(Gaussian Filtered Minimum Shift Keying),这是GSM系统采用的调制方式。数字调制解调技术是数字蜂窝移动通信系统空中接口的重要组成部分。GMSK调制是在MSK(最小频移键控)调制器之前插入高斯低通预调制滤波器这样一种调制方式。GMSK提高了数字移动通信的频谱利用率和通信质量。GMSK调制技术是从MSK(Minimum Shift Keying)调制的基础上发展起来的一种数字调制方式,其特点是在数据流送交频率调制器前先通过一个Gauss滤波器(预调制滤波器)进行预调制滤波,以减小两个不同频率的载波切换时的跳变能量,使得在相同的数据传输速率时频道间距可以变得更紧密。由于数字信号在调制前进行了Gauss预调制滤波,调制信号在交越零点不但相位连续,而且平滑过滤,因此GMSK调制的信号频谱紧凑、误码特性好,在数字移动通信中得到了广泛使用,如广泛使用的GSM(Global System for Mobile communication)移动通信体制就是使用GMSK调制方式。

 

        2.多符号检测(MSD)和Turbo乘积码(TPC)技术联合应用可以大幅提高脉冲编码调制/调频(PCM/FM)遥测系统性能.针对MSD算法计算复杂度高的问题提出了一种改进的MSD算法,可以有效降低计算复杂度;在TPC的传统Chase译码算法中通过简化软输入信息计算可以降低系统存储量.

 

       3.turbo码,又称并行级联卷积码(PCCC,Parallel Concatenated Convolutional Codes),此种编码方法将常用的卷积码和随机交织器巧妙的结合起来,采用并行级联的结构,实现了随机编码的思想。Turbo Codes译码是一类具有反馈结构的伪随机译码器,2个码可以交替互不影响的译码,并且还可以通过关于系统码信息位的软判决输出相互传递信息,进行递推式迭代译码。

 

1.png

2.仿真效果预览

matlab2022a仿真结果如下:

 

2.png

3.png

4.png

5.png

6.png

 

3.MATLAB核心程序 `clc;

clear;

close all;

warning off;

addpath 'func_MSD'

 

Frame_Nums = 400;

Numbers    = 200;

Num_sym    = 10;

SNR1       = [4:1:9];

SNR2       = 10.^(SNR1/10);

VAR        = 1./(SNR2*2);

h          = 0.7;

load('Table.mat');

[Ro,Co]    = size(Table);

Rate       = 10;

Carrier    = 70;

 

for indx2 = 1:length(SNR1)

    indx2

    ERR    = 0;

    var    = VAR(indx2);  

    for nn=1:Frame_Nums

        nn

        Dat_trans  = randsrc(1,Numbers,[0 1]);

        %差分编码

        Dat_trans2 = func_chafen(Dat_trans,Numbers);

        %参数初始化

        parameter;

        %MSD检测

        while indx < Numbers

            tmps        = exp(j4h*number)*Dat_trans2(indx);

            Rec(number) = awgn(tmps,(1-(Rate/Carrier)^2)*SNR1(indx2),'measured');

            number      = number+1;

            indx        = indx + 1;

            if number == Num_sym + 1

               number = 1;

               indx   = indx-2;

               %计算模

               y           = func_abs(Rec,Num_sym);

               %MSD检测

               MSD_results = func_MSD_Check(y,Table,Num_sym,Ro,Co);

               %检测误码率

               for hh=1:Num_sym-2

                   if MSD_results(hh) ~= Dat_trans(hh+times*Co)

                      ERR = ERR + 1;

                   end

               end

               times       = times + 1;   

            end

        end

    end

    Berrs(indx2) = ERR/(NumbersFrame_NumsNum_sym);

end

 

figure;    

semilogy(SNR1,Berrs,'b-o');

legend('ber of MSD');

xlabel('SNR');

ylabel('ber');

grid on;  

 

if Rate == 1;

   save msd1.mat SNR1 Berrs   

end

if Rate == 2;

   save msd2.mat SNR1 Berrs    

end

if Rate == 10;

   save msd3.mat SNR1 Berrs    

end

01-128m`