DemodM2 Comparison - 2013-UQ-Communication-Systems/public GitHub Wiki

C++/Gnuradio Code:

int
demodm2_impl::general_work (int noutput_items,
                   gr_vector_int &ninput_items,
                   gr_vector_const_void_star &input_items,
                   gr_vector_void_star &output_items)
{
    const float *in = (const float *) input_items[0];
    uint8_t *out = (uint8_t *) output_items[0];
    int n_in_items = ninput_items[0];

    int i = 0, o;
    // until we reout of space in the output - or the input.
    for (o=0; o<noutput_items && (i < n_in_items); o++) {

       // for the oth output symbol, lets get out data
       float Ts = my_samples_per_bit; // samples per bit
       float sum[4] = {0, 0, 0, 0}; // 4 parts of the bit.
       for (int z=i; z<i+Ts/4; z++) {
          sum[0] += in[z];
       }
       for (int z=i+Ts/4+1; z<i+Ts/2; z++) {
          sum[1] += in[z];
       }
       for (int z=i+Ts/2+1; z<i+Ts*3/4; z++) {
          sum[2] += in[z];
       }
       for (int z=i+Ts*3/4; z<i+Ts; z++) {
          sum[3] += in[z];
       }
       i += Ts;

       float decide = fabs((sum[0]+sum[2]) - (sum[1]+sum[3]));

       // how to debug an output... NOT recommended if the data rate is high
       // std::cout << decide << "\n";

       // set output (note it is reversed like in the MATLAB/Octave code)
       out[o] = decide > my_threshold ? 0 : 1;
    }
    // Tell runtime system how many input items we consumed on
    // each input stream.
    consume_each (i);

    // Tell runtime system how many output items we produced.
    return o;
}

MATLAB Code

function [output] = demodm2(data, Ts, threshold)
output = [];
for k=1:Ts:length(data)

    % integrate each half bit
    sum1 = 0;
    for (m=1:Ts/4)
        sum1 = sum1 + data(k+m - 1);
    end

    sum2 = 0;
    for (m=Ts/4+1:Ts/2)
        sum2 = sum2 + data(k+m - 1);
    end

    sum3 = 0;
    for (m=Ts/2+1:3*Ts/4)
        sum3 = sum3 + data(k+m - 1);
    end

    sum4 = 0;
    for (m=3*Ts/4+1:Ts)
        sum4 = sum4 + data(k+m - 1);
    end

    if (abs(sum1+sum3 - sum2-sum4) < threshold)
        output = [output 1];
    else
        output = [output 0];
    end

    %display(sprintf('diff=%f', abs(sum1+sum3 - sum2-sum4)));
end