// // Cognitive radio simulator // #include #include #include #include #include "cognitive_radio_test.h" // options #define PACKET_SIZE 1024 // packet size (number of bits) #define NUM_TRIALS 250 // number of epochs #define REPORT_TRIALS 10 // print report every so often int main() { // bookkeeping variables and buffers unsigned int num_bits=PACKET_SIZE; char msg_in[num_bits], msg_out[num_bits]; float I[num_bits], Q[num_bits]; unsigned int num_symbols, num_bits_out; float noise_psd = -100.0f; // noise power spectral density float noise_power, noise_std; // quality of service metrics unsigned int num_bit_errors; float throughput_bps; // metadata defaults struct metadata_t mdt; metadata md = &mdt; md->mod_scheme = MOD_QAM; // MOD_PSK, MOD_QAM, MOD_PAM, MOD_DPSK md->mod_bps = 4; // modulation scheme [bits/s] md->tx_power_dBW = -3.0f; // transmit power [dBW] md->symbol_rate = 250e3f; // symbol rate [symbols/s] unsigned int i; // generate random message for (i=0; isymbol_rate); noise_std = powf(10.0f, (noise_power - md->tx_power_dBW) / 10.0f) / 2.0f; // execute transmitter execute_tx(md, msg_in, num_bits, I, Q, &num_symbols); // execute channel execute_channel(md, noise_std, I, Q, num_symbols); // execute receiver execute_rx(md, I, Q, num_symbols, msg_out, &num_bits_out); // // *** compute quality of service metrics *** // // count errors, etc. num_bit_errors = count_errors(msg_in, msg_out, num_bits); throughput_bps = ((float)(md->mod_bps)) * md->symbol_rate; if ( ((i+1)%REPORT_TRIALS)==0 || (i+1)==NUM_TRIALS) { // print results printf("%u\t%.2f\terrors:\t%u\t/ %u, power: %.1f dBW, Fs: %.3f kHz\n", i+1, 0.0f, num_bit_errors, num_bits, md->tx_power_dBW, md->symbol_rate/1e3 ); } // // *** execute cognition here *** // // simple power adaptation if (num_bit_errors > 30) { md->tx_power_dBW += 0.1f; } else { md->tx_power_dBW -= 0.1f; } } printf("done.\n"); return 0; }