Repository navigation
DemodM2 Comparison
Konstanty edited this page Jul 23, 2014
·
1 revision
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;
}
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
See https://github.com/UQ-Communication-Systems/public for the latest version of these notes.