// TODO : test this method BSYNC() BSYNC(_create_msequence)(unsigned int _g, unsigned int _k) { // validate input if (_k == 0) { fprintf(stderr,"bsync_xxxt_create_msequence(), samples/symbol must be greater than zero\n"); exit(1); } unsigned int m = liquid_msb_index(_g) - 1; // create/initialize msequence msequence ms = msequence_create(m, _g, 1); BSYNC() fs = (BSYNC()) malloc(sizeof(struct BSYNC(_s))); unsigned int n = msequence_get_length(ms); fs->sync_i = bsequence_create(n * _k); #ifdef TC_COMPLEX fs->sync_q = bsequence_create(n * _k); #endif fs->sym_i = bsequence_create(n * _k); #ifdef TI_COMPLEX fs->sym_q = bsequence_create(n * _k); #endif msequence_reset(ms); #if 0 bsequence_init_msequence(fs->sync_i,ms); #ifdef TC_COMPLEX msequence_reset(ms); bsequence_init_msequence(fs->sync_q,ms); #endif #else unsigned int i; unsigned int j; for (i=0; i<n; i++) { unsigned int bit = msequence_advance(ms); for (j=0; j<_k; j++) { bsequence_push(fs->sync_i, bit); #ifdef TC_COMPLEX bsequence_push(fs->sync_q, bit); #endif } } #endif msequence_destroy(ms); fs->n = _k*n; return fs; }
void ofdmframesync_reset(ofdmframesync _q) { #if 0 // reset gain parameters unsigned int i; for (i=0; i<_q->M; i++) _q->G[i] = 1.0f; #endif // reset synchronizer objects nco_crcf_reset(_q->nco_rx); msequence_reset(_q->ms_pilot); // reset timers _q->timer = 0; _q->num_symbols = 0; _q->s_hat_0 = 0.0f; _q->s_hat_1 = 0.0f; _q->phi_prime = 0.0f; _q->p1_prime = 0.0f; // set thresholds (increase for small number of subcarriers) _q->plcp_detect_thresh = (_q->M > 44) ? 0.35f : 0.35f + 0.01f*(44 - _q->M); _q->plcp_sync_thresh = (_q->M > 44) ? 0.30f : 0.30f + 0.01f*(44 - _q->M); // reset state _q->state = OFDMFRAMESYNC_STATE_SEEKPLCP; }
void ofdmframegen_reset(ofdmframegen _q) { msequence_reset(_q->ms_pilot); // clear internal postfix buffer unsigned int i; for (i=0; i<_q->taper_len; i++) _q->postfix[i] = 0.0f; }
void bpacketsync_assemble_pnsequence(bpacketsync _q) { // reset m-sequence generator msequence_reset(_q->ms); unsigned int i; for (i=0; i<8*_q->pnsequence_len; i++) bsequence_push(_q->bpn, msequence_advance(_q->ms)); }
// reset frame generator object void gmskframegen_reset(gmskframegen _q) { // reset GMSK modulator gmskmod_reset(_q->mod); // reset states _q->state = STATE_PREAMBLE; msequence_reset(_q->ms_preamble); _q->frame_assembled = 0; _q->frame_complete = 0; _q->symbol_counter = 0; }
// generate p/n sequence void bpacketgen_assemble_pnsequence(bpacketgen _q) { // reset m-sequence generator msequence_reset(_q->ms); unsigned int i; unsigned int j; for (i=0; i<_q->pnsequence_len; i++) { unsigned char byte = 0; for (j=0; j<8; j++) { byte <<= 1; byte |= msequence_advance(_q->ms); } _q->pnsequence[i] = byte; } }
void gmskframegen_write_preamble(gmskframegen _q, float complex * _y) { unsigned char bit = msequence_advance(_q->ms_preamble); gmskmod_modulate(_q->mod, bit, _y); // apply ramping window to first 'm' symbols if (_q->symbol_counter < _q->m) { unsigned int i; for (i=0; i<_q->k; i++) _y[i] *= hamming(_q->symbol_counter*_q->k + i, 2*_q->m*_q->k); } _q->symbol_counter++; if (_q->symbol_counter == _q->preamble_len) { msequence_reset(_q->ms_preamble); _q->symbol_counter = 0; _q->state = STATE_HEADER; } }
void ofdmoqamframe64sync_reset(ofdmoqamframe64sync _q) { // reset pilot sequence generator msequence_reset(_q->ms_pilot); // reset auto-correlators autocorr_cccf_clear(_q->autocorr); _q->rxx_mag_max = 0.0f; // reset frequency offset estimation, correction _q->nu_hat = 0.0f; nco_crcf_reset(_q->nco_rx); nco_crcf_reset(_q->nco_pilot); pll_reset(_q->pll_pilot); // clear input buffer windowcf_clear(_q->input_buffer); // clear analysis filter bank objects firpfbch_clear(_q->ca0); firpfbch_clear(_q->ca1); // reset gain parameters _q->g = 1.0f; // coarse gain estimate unsigned int i; for (i=0; i<_q->num_subcarriers; i++) _q->G[i] = 1.0f; for (i=0; i<4; i++) _q->y_phase[i] = 0.0f; // reset state _q->state = OFDMOQAMFRAME64SYNC_STATE_PLCPSHORT; //_q->state = OFDMOQAMFRAME64SYNC_STATE_PLCPLONG0; _q->timer = 0; _q->num_symbols = 0; _q->num_data_symbols = 0; _q->num_samples = 0; _q->sample_phase = 0; }
int main(int argc, char*argv[]) { // options unsigned int m=5; // shift register length, n=2^m - 1 char filename[64] = ""; // output filename int dopt; while ((dopt = getopt(argc,argv,"uhm:f:")) != EOF) { switch (dopt) { case 'u': case 'h': usage(); return 0; case 'm': m = atoi(optarg); break; case 'f': // copy output filename string strncpy(filename,optarg,64); filename[63] = '\0'; break; default: exit(1); } } // ensure output filename is set if (strcmp(filename,"")==0) { fprintf(stderr,"error: %s, filename not set\n", argv[0]); exit(1); } // validate m if (m < 2) { fprintf(stderr,"error: %s, m is out of range\n", argv[0]); exit(1); } // create and initialize m-sequence msequence ms = msequence_create_default(m); msequence_print(ms); unsigned int n = msequence_get_length(ms); unsigned int sequence[n]; // sequence signed int rxx[n]; // auto-correlation // initialize sequence unsigned int i; for (i=0; i<n; i++) sequence[i] = msequence_advance(ms); // reset sequence msequence_reset(ms); // create and initialize first binary sequence on m-sequence bsequence bs1 = bsequence_create(n); bsequence_init_msequence(bs1, ms); // create and initialize second binary sequence on same m-sequence bsequence bs2 = bsequence_create(n); bsequence_init_msequence(bs2, ms); // when sequences are aligned, autocorrelation is equal to length unsigned int k=0; rxx[k++] = 2*bsequence_correlate(bs1, bs2) - n; // when sequences are misaligned, autocorrelation is equal to -1 for (i=0; i<n-1; i++) { bsequence_push(bs2, msequence_advance(ms)); rxx[k++] = 2*bsequence_correlate(bs1, bs2)-n; } // clean up memory bsequence_destroy(bs1); bsequence_destroy(bs2); msequence_destroy(ms); // // generate auto-correlation plot // // open output file FILE * fid = fopen(filename,"w"); if (fid == NULL) { fprintf(stderr,"error: %s, could not open file \"%s\" for writing.\n", argv[0], filename); exit(1); } // print header fprintf(fid,"# %s : auto-generated file (do not edit)\n", filename); fprintf(fid,"# invoked as :"); for (i=0; i<argc; i++) fprintf(fid," %s",argv[i]); fprintf(fid,"reset\n"); fprintf(fid,"set terminal postscript eps enhanced color solid rounded\n"); fprintf(fid,"set xrange [-1:%u];\n", n+1); fprintf(fid,"set size ratio 0.3\n"); fprintf(fid,"set xlabel 'delay (number of samples)'\n"); fprintf(fid,"set nokey # disable legned\n"); //fprintf(fid,"set grid xtics ytics\n"); //fprintf(fid,"set grid linetype 1 linecolor rgb '%s' lw 1\n", LIQUID_DOC_COLOR_GRID); fprintf(fid,"set multiplot layout 2,1 scale 1.0,1.0\n"); fprintf(fid,"# sequence\n"); fprintf(fid,"set ylabel 'sequence'\n"); fprintf(fid,"set yrange [-0.1:1.1]\n"); fprintf(fid,"plot '-' using 1:2 with steps linetype 1 linewidth 4 linecolor rgb '%s'\n",LIQUID_DOC_COLOR_BLUE); for (i=0; i<n; i++) { fprintf(fid," %6u %6u\n", i, sequence[i]); } fprintf(fid,"e\n"); fprintf(fid,"# auto-correlation\n"); fprintf(fid,"set ylabel 'auto-correlation'\n"); fprintf(fid,"set yrange [%f:1.1]\n", -5.0f / (float)n); fprintf(fid,"plot '-' using 1:2 with lines linetype 1 linewidth 4 linecolor rgb '%s'\n",LIQUID_DOC_COLOR_GREEN); for (i=0; i<n; i++) { fprintf(fid," %6u %12.4e\n", i, (float)rxx[i] / (float)n); } fprintf(fid,"e\n"); fprintf(fid,"unset multiplot\n"); // close output file fclose(fid); printf("results written to %s.\n", filename); return 0; }