Tag Archives: AWGN

MSK Demodulation Using a Discriminator

It is widely believed that performance of non-coherent receivers is much worse than performance of coherent receivers in terms of Bit Error Rate (BER). Although this is true to some extent but as we show in this post the difference in performance is not that much in case of Minimum Shift Keying (MSK). In fact, there is only a difference of about one dB in an AWGN environment at high Signal to Noise Ratios (SNR). The difference is somewhat larger in flat fading environment but given the simplicity of implementation of a non-coherent receiver the trade-off might be worth it.
Given below is the Octave code and simulation results of a discriminator-based MSK receiver architecture in an AWGN environment. It is seen that at low SNR the difference in performance is about 2dB but this reduces to less than a dB in the high SNR region (there is a slight difference in how EbNo and SNR is defined but we use it interchangeably). The difference in performance in a flat fading environment is about 3-4 dB, keeping all other variables to be the same. It must also be noted that we are using one sample per symbol, the results change somewhat if we increase the number of samples per symbol.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%      MINIMUM SHIFT  KEYING      %
%                                 % 
%       BER OF MSK IN AWGN        %
%   WITH DISCRIMINATOR DETECTOR   %
%                                 %
%         www.raymaps.com         %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all
close all

no_of_bits=1e7;
Eb=1;
EbNodB=10;

% MODULATION
bits_in=round(rand(1,no_of_bits));
bipolar_symbols=bits_in*2-1;
commulative_phase=(pi/2)*cumsum(bipolar_symbols);
tx_signal=exp(i*commulative_phase);

% AWGN CHANNEL
EbNo=10^(EbNodB/10);
sigma=sqrt(Eb/(2*EbNo));
AWGN_noise=randn(1,no_of_bits)+i*randn(1,no_of_bits);
rx_signal=tx_signal+sigma*AWGN_noise;

% DEMODULATION
complex_rotation=([rx_signal, 1]).*conj([1, rx_signal]);
angle_increment=arg(complex_rotation(1:end-1));
detected_symbol=sign(angle_increment);
bits_out=detected_symbol*0.5+0.5;

% BER CALCULATION
ber_simulated=sum(bits_out!=bits_in)/no_of_bits;
ber_theoretical=0.5*erfc(sqrt(EbNo));

MSK Bit Error Rate using a Discriminator
MSK Bit Error Rate using a Discriminator
Note: 
1. Discriminator detector just outputs a +1 if the phase is increasing and outputs a -1 if the phase is decreasing.
2. In the code above we first find the advance of the exponential over the symbol period and then find the angle incremented. But discriminator can also be implemented by first finding the phase of the exponential and then taking a time derivative. Results remain exactly the same.
3. The results are much worse if we do over-sampling i.e. if we increase the number of samples per symbol. This is not totally understood at the moment and will be subject of a future post.
4. One advantage of using non-coherent receiver architecture is that you do not require carrier phase synchronization.