// test unscrambling of soft bits (helper function to keep code base small) void liquid_scramble_soft_test(unsigned int _n) { unsigned char msg_org[_n]; // input data unsigned char msg_enc[_n]; // scrambled data unsigned char msg_soft[8*_n]; // scrambled data (soft bits) unsigned char msg_dec[_n]; // unscrambled data unsigned int i; // initialize data array (random) for (i=0; i<_n; i++) msg_org[i] = rand() & 0xff; // scramble input memmove(msg_enc, msg_org, _n); scramble_data(msg_enc,_n); // convert to soft bits for (i=0; i<_n; i++) liquid_unpack_soft_bits(msg_enc[i], 8, &msg_soft[8*i]); // unscramble result unscramble_data_soft(msg_soft, _n); // unpack soft bits for (i=0; i<_n; i++) { unsigned int sym_out; liquid_pack_soft_bits(&msg_soft[8*i], 8, &sym_out); msg_dec[i] = sym_out; } // ensure data are equivalent CONTEND_SAME_DATA(msg_org, msg_dec, _n); }
// Help function to keep code base small void modem_test_demodsoft(modulation_scheme _ms) { // generate mod/demod modem mod = modem_create(_ms); modem demod = modem_create(_ms); // unsigned int bps = modem_get_bps(demod); // run the test unsigned int i, s, M=1<<bps; unsigned int sym_soft; unsigned char soft_bits[bps]; float complex x; for (i=0; i<M; i++) { // modulate symbol modem_modulate(mod, i, &x); // demodulate using soft-decision modem_demodulate_soft(demod, x, &s, soft_bits); // check hard-decision output CONTEND_EQUALITY(s, i); // check soft bits liquid_pack_soft_bits(soft_bits, bps, &sym_soft); CONTEND_EQUALITY(sym_soft, i); // check phase error, evm, etc. //CONTEND_DELTA( modem_get_demodulator_phase_error(demod), 0.0f, 1e-3f); //CONTEND_DELTA( modem_get_demodulator_evm(demod), 0.0f, 1e-3f); } // clean it up modem_destroy(mod); modem_destroy(demod); }