示例#1
0
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++;
    }
}