Main Content

GSM TDMA Frame Parameterization for Waveform Generation

This example shows how to parameterize and generate different GSM TDMA frames and multiframe structures.

Introduction

The GSM standard [1] specifies a TDMA frame as a combination of 8 time slots. Each time slot has a duration of 3/5200 seconds (about 0.577 ms) and a time slot number (TN) from 0 to 7. GSM frames use GMSK modulation, where one symbol is equivalent to one bit. Each time slot is 156.25 bits long. The content of a time slot is called a burst. The transmission timing of a burst within a time slot is defined in terms of the bit number. The bit number (BN) refers to a particular bit period within a time slot. The bit with the lowest bit number is transmitted first. BN0 is the first bit period and BN156 is the last quarter-bit period. This figure shows time frames, time slots, and bursts for a GSM system [1].

A TDMA contains eight time slots with each timeslot separated by a guard period. Each time slot can carry only one type of burst. Available burst types are: normal burst (NB), frequency correction burst (FB), synchronization burst (SB), access burst (AB), or dummy burst [2]. The different burst types and the guard period are described in these next sections.

Normal Burst (NB)

The normal burst consists of these bit fields and can appear in uplink or downlink frames. All tail bits are zero. Based on the specified training sequence code (TSC), the training sequence field contains one of eight possible training sequences.

normalBurstDescription()
ans=6×3 table
     BitNumber     LengthOfField        ContentsOfField     
    ___________    _____________    ________________________

    "0 - 2"         {[     3]}      "tail bits"             
    "3 - 60"        {[    58]}      "encrypted bits"        
    "61 - 86"       {[    26]}      "training sequence bits"
    "87 - 144"      {[    58]}      "encrypted bits"        
    "145 - 147"     {[     3]}      "tail bits"             
    "148 - 156"     {[8.2500]}      "guard period (bits)"   

Access Burst (AB)

The access burst consists of these bit fields and can appear in uplink frames only. All tail bits are zero.

accessBurstDescription()
ans=5×3 table
    BitNumber     LengthOfField       ContentsOfField    
    __________    _____________    ______________________

    "0 - 7"        {[      8]}     "extended tail bits"  
    "8 - 48"       {[     41]}     "synch. sequence bits"
    "49 - 84"      {[     36]}     "encrypted bits"      
    "85 - 87"      {[      3]}     "tail bits"           
    "88 - 156"     {[68.2500]}     "guard period (bits)" 

Frequency Correction Burst (FB)

The frequency correction burst consists of these bit fields and can appear in downlink frames only. All tail bits and fixed bits are zero. Modulating all zeros with the GMSK modulator results in a constant phase rotation of -90 degrees for each symbol duration. Therefore, this burst generates an unmodulated carrier with a positive frequency offset of 1625/24 kHz.

frequencyCorrectionBurstDescription()
ans=4×3 table
     BitNumber     LengthOfField       ContentsOfField   
    ___________    _____________    _____________________

    "0 - 2"         {[     3]}      "tail bits"          
    "3 - 144"       {[   142]}      "fixed bits"         
    "145 - 147"     {[     3]}      "tail bits"          
    "148 - 156"     {[8.2500]}      "guard period (bits)"

Synchronization Burst (SB)

The synchronization burst consists of these bit fields and can appear in downlink frames only. All tail bits are zero.

synchronizationBurstDescription()
ans=6×3 table
     BitNumber     LengthOfField             ContentsOfField         
    ___________    _____________    _________________________________

    "0 - 2"         {[     3]}      "tail bits"                      
    "3 - 41"        {[    39]}      "encrypted bits"                 
    "42 - 105"      {[    64]}      "extended training sequence bits"
    "106 - 144"     {[    39]}      "encrypted bits"                 
    "145 - 147"     {[     3]}      "tail bits"                      
    "148 - 156"     {[8.2500]}      "guard period (bits)"            

Dummy Burst

The dummy burst consists of these bit fields and can appear in downlink frames only. All tail bits are zero. Mixed bits contain a predetermined sequence of ones and zeros.

dummyBurstDescription()
ans=4×3 table
     BitNumber     LengthOfField       ContentsOfField   
    ___________    _____________    _____________________

    "0 - 2"         {[     3]}      "tail bits"          
    "3 - 144"       {[   142]}      "mixed bits"         
    "145 - 147"     {[     3]}      "tail bits"          
    "148 - 156"     {[8.2500]}      "guard period (bits)"

Guard Period

The GSM standard, [3], requires mobile stations to attenuate their transmission during the period between bursts. The ramp-up and ramp-down of the signal power level occurs during the guard periods. The useful part of a burst starts half way through the bit number 0. The useful part ends halfway through BN87 for ABs and BN147 for NBs, FBs, SBs, and dummy bursts. This figure shows the useful and active parts of a burst.

Generate Single Uplink Frame

Configure an uplink GSM TDMA frame using the gsmUplinkConfig object.

cfg = gsmUplinkConfig()
cfg = 
  gsmUplinkConfig with properties:

           BurstType: [NB    NB    NB    NB    NB    NB    NB    NB]
    SamplesPerSymbol: 16
                 TSC: [0 1 2 3 4 5 6 7]
         Attenuation: [0 0 0 0 0 0 0 0]
         PulseLength: 4
            RiseTime: 2
           RiseDelay: 0
            FallTime: 2
           FallDelay: 0

Set time slots 2 and 5 to carry access bursts. Since MATLAB® array indices start from 1, but time slots start from 0, set the third and sixth elements of the BurstType to "AB".

cfg.BurstType([2 5] +1) = "AB"
cfg = 
  gsmUplinkConfig with properties:

           BurstType: [NB    NB    AB    NB    NB    AB    NB    NB]
    SamplesPerSymbol: 16
                 TSC: [0 1 2 3 4 5 6 7]
         Attenuation: [0 0 0 0 0 0 0 0]
         PulseLength: 4
            RiseTime: 2
           RiseDelay: 0
            FallTime: 2
           FallDelay: 0

Assign training sequence codes 3, 5, 1, 7, 0, and 2 to time slots 0, 1, 3, 4, 6, and 7, respectively.

cfg.TSC([0 1 3 4 6 7] +1) = [3 5 1 7 0 2]
cfg = 
  gsmUplinkConfig with properties:

           BurstType: [NB    NB    AB    NB    NB    AB    NB    NB]
    SamplesPerSymbol: 16
                 TSC: [3 5 2 1 7 5 0 2]
         Attenuation: [0 0 0 0 0 0 0 0]
         PulseLength: 4
            RiseTime: 2
           RiseDelay: 0
            FallTime: 2
           FallDelay: 0

Generate the baseband samples of the frame using the gsmFrame function.

x = gsmFrame(cfg);

Plot the frame. Get the sample rate of the generated waveform by using the gsmInfo function, and then calculate the time axis values in ms. The plot shows 8 bursts in the frame, with guard periods between each burst. As described in the Access Burst (AB) section, ABs are short burst and have a wider guard period than other bursts.

wfInfo = gsmInfo(cfg); 
Rs = wfInfo.SampleRate;
t = (0:length(x) - 1)/Rs*1e3;
subplot(2,1,1)
plot(t,abs(x))
grid on
axis([0 5 0 1.2])
title('GSM Uplink TDMA Frame - Amplitude')
xlabel('Time (ms)')
ylabel('Amplitude')
subplot(2,1,2)
plot(t,unwrap(angle(x)))
grid on
title('GSM Uplink TDMA Frame - Phase')
xlabel('Time (ms)')
ylabel('Phase (rad)')

Plot the spectrogram of the frame.

figure
spectrogram(x,500,[],[],Rs,'centered')
title('GSM Uplink TDMA Frame - Spectrogram')

Generate Single Downlink Frame

Configure a downlink GSM TDMA frame using the gsmDownlinkConfig object.

cfg = gsmDownlinkConfig
cfg = 
  gsmDownlinkConfig with properties:

           BurstType: [NB    NB    NB    NB    NB    NB    NB    NB]
    SamplesPerSymbol: 16
                 TSC: [0 1 2 3 4 5 6 7]
         Attenuation: [0 0 0 0 0 0 0 0]
         PulseLength: 4
            RiseTime: 2
           RiseDelay: 0
            FallTime: 2
           FallDelay: 0

Set time slots 0 to carry a frequency correction burst, set time slots 4 and 6 to carry dummy bursts, and set time slot 2 to be empty.

cfg.BurstType(0 +1) = "FB";
cfg.BurstType([4 6] +1) = "Dummy";
cfg.BurstType(2 +1) = "Off"
cfg = 
  gsmDownlinkConfig with properties:

           BurstType: [FB    NB    Off    NB    Dummy    NB    Dummy    NB]
    SamplesPerSymbol: 16
                 TSC: [0 1 2 3 4 5 6 7]
         Attenuation: [0 0 0 0 0 0 0 0]
         PulseLength: 4
            RiseTime: 2
           RiseDelay: 0
            FallTime: 2
           FallDelay: 0

Generate the baseband samples of the frame using the gsmFrame function. This function inserts random bits instead of encrypted bits.

x = gsmFrame(cfg);

Plot the frame.

wfInfo = gsmInfo(cfg); 
Rs = wfInfo.SampleRate;
t = (0:length(x) - 1)/Rs*1e3;
subplot(2,1,1)
plot(t,abs(x))
grid on
axis([0 5 0 1.2])
title('GSM Uplink TDMA Frame - Amplitude')
xlabel('Time (ms)');ylabel('Amplitude')
subplot(2,1,2)
plot(t,unwrap(angle(x)))
grid on
title('GSM Uplink TDMA Frame - Phase')
xlabel('Time (ms)')
ylabel('Phase (rad)')

Plot the spectrogram of the frame. This plot shows the single tone during time slot 0 due to the FB.

figure
spectrogram(x,500,[],[],Rs,'centered')
title('GSM Uplink TDMA Frame - Spectrogram')

Generate Multiframe Structure

Create a 51-frame multiframe structure, as shown in the figure in the Introduction section. Create three gsmDownlinkConfig objects with specified burst configurations. To assemble the 51-frame multiframe, use the first and second gsmDownlinkConfig objects once and repeat the third gsmDownlinkConfig objects for the next 49 frames. Repeat the multiframe structure 3 times.

cfg1 = gsmDownlinkConfig('BurstType',["FB" "NB" "NB" "NB" "NB" "Dummy" "NB" "NB"]);
cfg2 = gsmDownlinkConfig('BurstType',["SB" "NB" "NB" "NB" "NB" "Dummy" "NB" "NB"]);
cfg3 = gsmDownlinkConfig('BurstType',["NB" "NB" "NB" "NB" "NB" "Dummy" "NB" "NB"]);
wfInfo = gsmInfo(cfg); 
frameLength = wfInfo.FrameLengthInSamples;
x = zeros(frameLength*51*3,1);
for p=1:3
    x1 = gsmFrame(cfg1);
    x2 = gsmFrame(cfg2);
    x3 = gsmFrame(cfg3,49);
    x((p-1)*frameLength*51+1:p*frameLength*51) = [x1;x2;x3];
end

Simulate Power Control and Propagation Loss Effects

Due to power control and unique propagation loss for each user, the power of each time slot within a frame might be different. Set the power attenuation for time slots 0, 3, and 7 to 2, 6, and 10 dB, respectively.

cfg = gsmUplinkConfig;
cfg.Attenuation([0 3 7] +1) = [2 6 10]
cfg = 
  gsmUplinkConfig with properties:

           BurstType: [NB    NB    NB    NB    NB    NB    NB    NB]
    SamplesPerSymbol: 16
                 TSC: [0 1 2 3 4 5 6 7]
         Attenuation: [2 0 0 6 0 0 0 10]
         PulseLength: 4
            RiseTime: 2
           RiseDelay: 0
            FallTime: 2
           FallDelay: 0

x = gsmFrame(cfg);
wfInfo = gsmInfo(cfg);
Rs = wfInfo.SampleRate;
t = (0:length(x) - 1)/Rs*1e3;
plot(t, 20*log10(abs(x)))
axis([0 5 -20 5])
grid on
title('GSM Uplink TDMA Frame Power')
xlabel('Time (ms)')
ylabel('Power (dB)')

Adjust Ramp-Up and Ramp-Down Behavior

GSM bursts must ramp up and ramp down during guard periods [2]. The gsmFrame function implements the rise and fall characteristics of the bursts as a sinusoid. The burst ramps up from zero to full amplitude in the number of symbol durations specified by the RiseTime property value. The resolution of RiseTime is 1/Nsps, where Nsps represents the SamplesPerSymbol property value of the gsmDownlinkConfig object.

Adjust the ramp-up characteristics of the bursts. Since SamplesPerFrame is 16, you can specify RiseTime with a symbol duration resolution of 0.0625. Set RiseTime to a duration of 3.125 symbols.

cfg = gsmDownlinkConfig;
cfg.RiseTime = 3.125;

Visualize and check if the rise-time characteristics are within the GSM specifications by using the gsmCheckTimeMask function.

gsmCheckTimeMask(cfg)

Move the start of the rise time duration to the left by 1.5 symbols by setting the RiseDelay to -1.5. When RiseDelay is 0, the burst reaches full amplitude at the start of the useful part of the burst.

cfg.RiseDelay = -1.5;
gsmCheckTimeMask(cfg)

The burst ramps down from full amplitude to zero in the number of symbol durations specified by the FallTime property. The resolution of FallTime is 1/Nsps, where Nsps represents the SamplesPerSymbol property value of the gsmDownlinkConfig object. Set FallTime to a duration of 2.75 symbols.

Move the start of the fall time to the right by 0.25 symbols durations by setting the FallDelay to 0.25. When FallDelay is 0, the burst starts to ramp down from full amplitude at the end of the useful part of the burst.

cfg = gsmDownlinkConfig;
cfg.FallTime = 2.75;
cfg.FallDelay = 0.25;
gsmCheckTimeMask(cfg)

References

[1] 3GPP TS 45.001. "GSM/EDGE Physical layer on the radio path. General description." 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.

[2] 3GPP TS 45.002, "GSM/EDGE Multiplexing and multiple access on the radio path." 3rd Generation Partnership Project; Technical Specification Group Radio Access Network

[3] 3GPP TS 45.004, "GSM/EDGE Modulation." General description." 3rd Generation Partnership Project; Technical Specification Group Radio Access Network

Helper Functions

normalBurstDescription

This function formats a table to show information about normal burst fields.

function d = normalBurstDescription()
BitNumber = ["0 - 2";"3 - 60";"61 - 86";...
    "87 - 144";"145 - 147";"148 - 156"];
LengthOfField = {3;58;26;58;3;8.25};
ContentsOfField = [...
    "tail bits";...
    "encrypted bits";...
    "training sequence bits";...
    "encrypted bits";...
    "tail bits";...
    "guard period (bits)"...
    ];
d = table(BitNumber,LengthOfField,ContentsOfField);
end

frequencyCorrectionBurstDescription

This function formats a table to show information about frequency correction burst fields.

function d = frequencyCorrectionBurstDescription()
BitNumber = ["0 - 2";"3 - 144";"145 - 147";"148 - 156"];
LengthOfField = {3;142;3;8.25};
ContentsOfField = [...
    "tail bits";...
    "fixed bits";...
    "tail bits";...
    "guard period (bits)"...
    ];
d = table(BitNumber,LengthOfField,ContentsOfField);
end

synchronizationBurstDescription

This function formats a table to show information about synchronization burst fields.

function d = synchronizationBurstDescription()
BitNumber = ["0 - 2";"3 - 41";"42 - 105";...
    "106 - 144";"145 - 147";"148 - 156"];
LengthOfField = {3;39;64;39;3;8.25};
ContentsOfField = [...
    "tail bits";...
    "encrypted bits";...
    "extended training sequence bits";...
    "encrypted bits";...
    "tail bits";...
    "guard period (bits)"...
    ];
d = table(BitNumber,LengthOfField,ContentsOfField);
end

dummyBurstDescription

This function formats a table to show information about dummy burst fields.

function d = dummyBurstDescription()
BitNumber = ["0 - 2";"3 - 144";"145 - 147";"148 - 156"];
LengthOfField = {3;142;3;8.25};
ContentsOfField = [...
    "tail bits";...
    "mixed bits";...
    "tail bits";...
    "guard period (bits)"...
    ];
d = table(BitNumber,LengthOfField,ContentsOfField);
end

accessBurstDescription

This function formats a table to show information about access burst fields.

function d = accessBurstDescription()
BitNumber = ["0 - 7";"8 - 48";"49 - 84";...
    "85 - 87";"88 - 156"];
LengthOfField = {8;41;36;3;68.25};
ContentsOfField = [...
    "extended tail bits";...
    "synch. sequence bits";...
    "encrypted bits";...
    "tail bits";...
    "guard period (bits)"...
    ];
d = table(BitNumber,LengthOfField,ContentsOfField);
end