void firpfbch_analyzer_execute(firpfbch _c, float complex * _x, float complex * _y) { unsigned int i; for (i=0; i<_c->num_channels; i++) firpfbch_analyzer_push(_c,_x[i]); // run the analysis filters on the given input firpfbch_analyzer_run(_c,_y); // save the run state : IDFT input X -> X_prime firpfbch_analyzer_saverunstate(_c); }
void ofdmoqamframe64sync_execute_rxsymbols(ofdmoqamframe64sync _q, float complex _x) { unsigned int k=_q->sample_phase; #if 0 // synthesize timing offset if (_q->num_symbols > _q->m + 5) { k = (k+1)%_q->num_subcarriers; //k = (k+_q->num_subcarriers-1)%_q->num_subcarriers; } #endif if ((_q->num_samples % 64) == k) { // run analyzers firpfbch_analyzer_run(_q->ca0, _q->Y0); firpfbch_analyzer_run(_q->ca1, _q->Y1); firpfbch_analyzer_saverunstate(_q->ca0); firpfbch_analyzer_saverunstate(_q->ca1); #if DEBUG_OFDMOQAMFRAME64SYNC_PRINT printf("symbol[%3u] : %4u\n", _q->num_symbols, _q->num_samples); #endif // determine what type of symbol is produced at the // output of the analysis filter banks, compensating // for the filter delay (e.g. short/long sequence, // data symbol. etc.) if (_q->num_symbols == _q->m) { // save first S1 symbol } else if (_q->num_symbols == _q->m + 1) { // save second S1 symbol } else if (_q->num_symbols == _q->m + 2) { // ignore first S2 symbol, S2[0] } else if (_q->num_symbols == _q->m + 3) { // save S2[1] #if DEBUG_OFDMOQAMFRAME64SYNC_PRINT printf(" estimating gain [0]...\n"); #endif ofdmoqamframe64sync_estimate_gain_plcplong(_q); #if DEBUG_OFDMOQAMFRAME64SYNC memmove(_q->S1a, _q->Y0, (_q->num_subcarriers)*sizeof(float complex)); memmove(_q->S1b, _q->Y1, (_q->num_subcarriers)*sizeof(float complex)); #endif /* printf("exiting prematurely\n"); ofdmoqamframe64sync_destroy(_q); exit(1); */ } else if (_q->num_symbols == _q->m + 4) { // save S2[2], estimate gain #if DEBUG_OFDMOQAMFRAME64SYNC_PRINT printf(" estimating gain [1]...\n"); #endif ofdmoqamframe64sync_estimate_gain_plcplong(_q); #if DEBUG_OFDMOQAMFRAME64SYNC memmove(_q->S1a, _q->Y0, (_q->num_subcarriers)*sizeof(float complex)); memmove(_q->S1b, _q->Y1, (_q->num_subcarriers)*sizeof(float complex)); #endif } else if (_q->num_symbols == _q->m + 5) { // ignore last S2 symbol, S2[3] } else if (_q->num_symbols > _q->m + 5) { // execute rxpayload ofdmoqamframe64sync_rxpayload(_q,_q->Y0,_q->Y1); //printf(" ==> data symbol %u\n", _q->num_data_symbols); _q->num_data_symbols++; } _q->num_symbols++; } }