A Matlab code for the "Maximum Likelihood Sequence Detection" for any CPM modulation (GMSK-RECT-RC....) using the Viterbi Algorithm. This work is based on the book: ' Digital Communication (Proakis)', and thesis: Comparison of Noncoherent detectors for SOQPSK and GMSK in Phase Noise Channels.
If you use this package for your own work, please consider citing it with this piece of BibTeX:
@ARTICLE{9406053,
author={Kassan, Karim and Farès, Haïfa and Christian Glattli, D. and Louët, Yves},
journal={IEEE Transactions on Communications},
title={Performance vs. Spectral Properties For Single-Sideband Continuous Phase Modulation},
year={2021},
volume={},
number={},
pages={1-1},
doi={10.1109/TCOMM.2021.3073792}
}
- Make sure that you have a compatible version of Matlab (this code was tested on Matlab 2018b)
- Download (clone) the files from the repository.
- Open the file called MLSD_Viterbi_CPM.m
- Select the section called Pulse shape & Variable ini
- Select the type of pulses by changing the variable
pulse
number1
is for Lorentzian2
is for GMSK3
is for Raised Cosine4
is for Rectangular- We can define a new pulse if the wanted pulse is not presented. Go to the file called MainFunctions.m, in the first function CREATECPMPULSE and add the pulse, using the same method used to define the other pulses.
- Change the pulse length by changing the variable
pulse_length
. - Select the oversampling by changing the variable
os
. - Select M-ary by changing the
M_ary
(e.g., M=2 for Binary). - Select the minimum Euclidean distance of the modulation by changing the variable
dmin
. - Select after how many observation symbols the Viterbi receiver can make a decision on the detected bit by changing the variable
decision_delay
(usually 50 is high enough).
For points number 9
and 10
. We can obtain dmin
and the number of observation symbols from the code we provided in this link: https://github.com/kassankar/ContinuousPhaseModulation-CPM---EuclideanDistance.
In this example we present the BER of GMSK CPM modulation with BT=0.3
.
pulse = 2;
pulse_length = 3;
os = 2^2;
Ts = 1/os;
M_ary = 2^1;
modulation_index = 0.5;
dmin = 1.78; % GMSK BT=0.3
decision_delay = 50;
For pulse_length = 1
(Full response), with M_ary >2
, we may obtain an error for some modulation indices.
© 2020-2021 Karim Kassan