sync_cor.c

来自「TI的DSP C55X的应用程序」· C语言 代码 · 共 308 行 · 第 1/2 页

C
308
字号
0x5fff, 0x6014, 0x6029, 0x603f, 0x6054, 0x6069, 0x607e, 0x6094, 0x60a9,
0x60be, 0x60d3, 0x60e8, 0x60fd, 0x6113, 0x6128, 0x613d, 0x6152, 0x6167,
0x617c, 0x6191, 0x61a6, 0x61bb, 0x61d0, 0x61e5, 0x61fa, 0x620e, 0x6223,
0x6238, 0x624d, 0x6262, 0x6277, 0x628b, 0x62a0, 0x62b5, 0x62ca, 0x62de,
0x62f3, 0x6308, 0x631c, 0x6331, 0x6346, 0x635a, 0x636f, 0x6384, 0x6398,
0x63ad, 0x63c1, 0x63d6, 0x63ea, 0x63ff, 0x6413, 0x6428, 0x643c, 0x6451,
0x6465, 0x6479, 0x648e, 0x64a2, 0x64b6, 0x64cb, 0x64df, 0x64f3, 0x6508,
0x651c, 0x6530, 0x6544, 0x6559, 0x656d, 0x6581, 0x6595, 0x65a9, 0x65bd,
0x65d1, 0x65e6, 0x65fa, 0x660e, 0x6622, 0x6636, 0x664a, 0x665e, 0x6672,
0x6686, 0x669a, 0x66ae, 0x66c2, 0x66d6, 0x66ea, 0x66fd, 0x6711, 0x6725,
0x6739, 0x674d, 0x6761, 0x6774, 0x6788, 0x679c, 0x67b0, 0x67c4, 0x67d7,
0x67eb, 0x67ff, 0x6812, 0x6826, 0x683a, 0x684d, 0x6861, 0x6875, 0x6888,
0x689c, 0x68af, 0x68c3, 0x68d6, 0x68ea, 0x68fd, 0x6911, 0x6924, 0x6938,
0x694b, 0x695f, 0x6972, 0x6986, 0x6999, 0x69ac, 0x69c0, 0x69d3, 0x69e7,
0x69fa, 0x6a0d, 0x6a20, 0x6a34, 0x6a47, 0x6a5a, 0x6a6e, 0x6a81, 0x6a94,
0x6aa7, 0x6aba, 0x6ace, 0x6ae1, 0x6af4, 0x6b07, 0x6b1a, 0x6b2d, 0x6b40,
0x6b53, 0x6b67, 0x6b7a, 0x6b8d, 0x6ba0, 0x6bb3, 0x6bc6, 0x6bd9, 0x6bec,
0x6bff, 0x6c12, 0x6c25, 0x6c37, 0x6c4a, 0x6c5d, 0x6c70, 0x6c83, 0x6c96,
0x6ca9, 0x6cbc, 0x6cce, 0x6ce1, 0x6cf4, 0x6d07, 0x6d1a, 0x6d2c, 0x6d3f,
0x6d52, 0x6d65, 0x6d77, 0x6d8a, 0x6d9d, 0x6daf, 0x6dc2, 0x6dd5, 0x6de7,
0x6dfa, 0x6e0d, 0x6e1f, 0x6e32, 0x6e44, 0x6e57, 0x6e69, 0x6e7c, 0x6e8f,
0x6ea1, 0x6eb4, 0x6ec6, 0x6ed9, 0x6eeb, 0x6efd, 0x6f10, 0x6f22, 0x6f35,
0x6f47, 0x6f5a, 0x6f6c, 0x6f7e, 0x6f91, 0x6fa3, 0x6fb5, 0x6fc8, 0x6fda,
0x6fec, 0x6fff, 0x7011, 0x7023, 0x7035, 0x7048, 0x705a, 0x706c, 0x707e,
0x7091, 0x70a3, 0x70b5, 0x70c7, 0x70d9, 0x70eb, 0x70fd, 0x7110, 0x7122,
0x7134, 0x7146, 0x7158, 0x716a, 0x717c, 0x718e, 0x71a0, 0x71b2, 0x71c4,
0x71d6, 0x71e8, 0x71fa, 0x720c, 0x721e, 0x7230, 0x7242, 0x7254, 0x7266,
0x7278, 0x728a, 0x729b, 0x72ad, 0x72bf, 0x72d1, 0x72e3, 0x72f5, 0x7306,
0x7318, 0x732a, 0x733c, 0x734e, 0x735f, 0x7371, 0x7383, 0x7394, 0x73a6,
0x73b8, 0x73ca, 0x73db, 0x73ed, 0x73ff, 0x7410, 0x7422, 0x7434, 0x7445,
0x7457, 0x7468, 0x747a, 0x748b, 0x749d, 0x74af, 0x74c0, 0x74d2, 0x74e3,
0x74f5, 0x7506, 0x7518, 0x7529, 0x753b, 0x754c, 0x755e, 0x756f, 0x7580,
0x7592, 0x75a3, 0x75b5, 0x75c6, 0x75d8, 0x75e9, 0x75fa, 0x760c, 0x761d,
0x762e, 0x7640, 0x7651, 0x7662, 0x7674, 0x7685, 0x7696, 0x76a7, 0x76b9,
0x76ca, 0x76db, 0x76ec, 0x76fd, 0x770f, 0x7720, 0x7731, 0x7742, 0x7753,
0x7765, 0x7776, 0x7787, 0x7798, 0x77a9, 0x77ba, 0x77cb, 0x77dc, 0x77ed,
0x77ff, 0x7810, 0x7821, 0x7832, 0x7843, 0x7854, 0x7865, 0x7876, 0x7887,
0x7898, 0x78a9, 0x78ba, 0x78cb, 0x78dc, 0x78ed, 0x78fd, 0x790e, 0x791f,
0x7930, 0x7941, 0x7952, 0x7963, 0x7974, 0x7985, 0x7995, 0x79a6, 0x79b7,
0x79c8, 0x79d9, 0x79ea, 0x79fa, 0x7a0b, 0x7a1c, 0x7a2d, 0x7a3d, 0x7a4e,
0x7a5f, 0x7a70, 0x7a80, 0x7a91, 0x7aa2, 0x7ab2, 0x7ac3, 0x7ad4, 0x7ae5,
0x7af5, 0x7b06, 0x7b16, 0x7b27, 0x7b38, 0x7b48, 0x7b59, 0x7b6a, 0x7b7a,
0x7b8b, 0x7b9b, 0x7bac, 0x7bbc, 0x7bcd, 0x7bdd, 0x7bee, 0x7bff, 0x7c0f,
0x7c20, 0x7c30, 0x7c41, 0x7c51, 0x7c61, 0x7c72, 0x7c82, 0x7c93, 0x7ca3,
0x7cb4, 0x7cc4, 0x7cd5, 0x7ce5, 0x7cf5, 0x7d06, 0x7d16, 0x7d26, 0x7d37,
0x7d47, 0x7d57, 0x7d68, 0x7d78, 0x7d88, 0x7d99, 0x7da9, 0x7db9, 0x7dca,
0x7dda, 0x7dea, 0x7dfa, 0x7e0b, 0x7e1b, 0x7e2b, 0x7e3b, 0x7e4c, 0x7e5c,
0x7e6c, 0x7e7c, 0x7e8c, 0x7e9d, 0x7ead, 0x7ebd, 0x7ecd, 0x7edd, 0x7eed,
0x7efe, 0x7f0e, 0x7f1e, 0x7f2e, 0x7f3e, 0x7f4e, 0x7f5e, 0x7f6e, 0x7f7e,
0x7f8e, 0x7f9e, 0x7fae, 0x7fbe, 0x7fce, 0x7fde, 0x7fee};


/* External Data */

/* Code */

int sync_corr( int *I_SRC, int *Q_SRC, int *filt )
{
    int     i, j, sync_point,index, corr_mag, max, I_temp, Q_temp;
    int     *sync_ptr, *rc_data, sync_i, sync_q, rc_i, rc_q;        
    long    I_ltemp, Q_ltemp;    

/**************************************/
/* Filter just enough data to span    */
/* correlation window                 */
/*                                    */
/* Store resultant 76 I,Q pairs       */
/* into temp_rc[] storage.            */
/**************************************/

    rc_data = temp_rc;  /* Set pointer to temporary storage for filter output */
    
    I_SRC += 8;         /* Intentional offset to start 2 symbols */
    Q_SRC += 8;         /* to left of expected sync point.       */
    
    for (i = 0 ; i < 76 ; i++)
    {
        I_ltemp = _lsmpy((*(I_SRC++)), (*filt) );
        Q_ltemp = _lsmpy((*(Q_SRC++)), (*filt++) );
        for (j = 47 ; j > 0 ; j--)
        {
            /* I_temp += (*(I_SRC++)) * (*filt); */
            /* Q_temp += (*(Q_SRC++)) * ((*filt++)); */; 
            I_ltemp = _smac(I_ltemp, (*(I_SRC++)), (*filt) );
            Q_ltemp = _smac(Q_ltemp, (*(Q_SRC++)), (*filt++) );
        } 
        
        filt  -= 48;    /* Set Filter pointer back to start */
        
        I_SRC -= 47;    /* Start 1 sample over next time */
        Q_SRC -= 47;
        
        *(rc_data++) = (I_ltemp>>18);   /* Store Filter Output I term in Q13 format */
        *(rc_data++) = (Q_ltemp>>18);   /* Store Filter Output Q term in Q13 format */
    }

/****************************************/
/* Correlate with Sync Word for Slot #0 */  
/* Keep track of correlation peak.      */
/****************************************/

    max = 0;                    /* Correlation Magnetude Maximum */
    
    sync_point = 0;             /* Index into data to sync point */
     
    rc_data = temp_rc;          /* Set pointer to beginning of filtered data */
    
    for (i = 0 ; i < 16 ; i++)
    {  
      /* Zero resultant correlation vector components */
        I_ltemp = 0;
        Q_ltemp = 0;                              
        
      /* Point to M.E.P. buffer for slot #0 Sync word */    
        sync_ptr = cor_sync;    
     
      /* Perform Correlation at offset 'i' into data */
        for (j = 15 ; j > 0 ; j--)  
        {
            sync_i = *(sync_ptr++);
            sync_q = *(sync_ptr++);
            rc_i   = *(rc_data++);
            rc_q   = *(rc_data++); 
            rc_data += 6;
            I_ltemp = _smac(I_ltemp, sync_i, rc_i);
            I_ltemp = _smac(I_ltemp, sync_q, rc_q); 
            Q_ltemp = _smac(Q_ltemp, sync_i, rc_q);
            Q_ltemp = _smas(Q_ltemp, sync_q, rc_i); 
        }
        rc_data -= 118;  /* 120 would set pointer back to start              */
                         /* we will start 1 sample (I,Q pair) over next time */

      /* Compute Correlation Magnetude & Maximize */
        /* corr_mag = (float)sqrt(I_temp*I_temp + Q_temp*Q_temp); */
		I_temp = (I_ltemp>>16);
		Q_temp = (Q_ltemp>>16);
		
		I_ltemp = _lsmpy(I_temp, I_temp);
		I_ltemp = _smac(I_ltemp, Q_temp, Q_temp); 
		index = (I_ltemp>>16);
 		corr_mag = sqrt_tab[index>>5];

        if( corr_mag > max )
        {
            sync_point = i;
            max = corr_mag;
        }
    }
    
    return( sync_point + 8 );   /* Note that we started at offset = 8 */
}


⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?