⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interleaver.c

📁 这是一个c++编写的WCDMA链路采用RAKE接收的方针源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
 * Note: */void wcdma_multistage_interleaver(        int nBits,              /* IN: number of interleaved frames */        int inData[],           /* IN: input bits */        int outData[])          /* OUT: output bits */{    int interleaving_rows;    int interleaving_cols;    int i;    /*     * Find outer interleaving column and row numbers.     * Start from max. column number and test all powers of 2     * between max. and 2.     */    interleaving_cols = MAX_MIL_COLS;    interleaving_rows = -1;    do {        if ( (nBits % interleaving_cols) == 0) {            interleaving_rows =  nBits / interleaving_cols;            break;        }        interleaving_cols = interleaving_cols >> 1;    } while (interleaving_cols > 1);    if (interleaving_rows == -1) {        printf("wcdma_intra_interleaver: incorrect frame data size.\n");        return;    }    if (interleaving_cols > 3) {        wcdma_multistage_interleaver(interleaving_cols,                                     inData, outData);    }    do {        ;    } while ( (interleaving_cols > 3) && (interleaving_rows > 3) );    return;}/* ------------------------------------------------------------------- *//* * Function:    wcdma_intraframe_interleaver * Desc.:       Intra interleaver. * * Note: *              Does interleaving in-place, directly modifiying *              input data vector. */void wcdma_intraframe_interleaver(        int nBits,              /* IN: number of bits */        int inData[])           /* IN/OUT: input/output bits */{    /*     * Do multistage interleaving to single frame.     */    return;}/* ------------------------------------------------------------------- *//* * Function:    wcdma_intraframe_deinterleaver * Desc.:       Intra deinterleaver. * * Note: *              Does deinterleaving in-place, directly modifiying *              input data vector. */void wcdma_intraframe_deinterleaver(        int nBits,              /* IN: number of bits */        double inData[])        /* IN/OUT: input/output bits */{    /*     * Do multistage interleaving to single frame.     */    return;}/* ------------------------------------------------------------------- *//* * Function:    wcdma_inter_interleaving * Desc.:       Inter interleaving over N frames. * * Note: *              Does interleaving in-place, directly modifiying *              input data vector. */void wcdma_interframe_interleaver(        int nBits,              /* IN: number of bits in */        int frame_len,          /* IN: number of bits in a frame */        int inData[],           /* IN: input bits */        int outData[])          /* OUT: output bits */{    int nFrames;    int i;    int tempData[ MAX_FRAMES_TO_INTERFRAME_INTERLEAVE *                  MAX_SLOT_LEN * SLOTS_IN_FRAME ];    /*     * Do block interleaving for the input block.     */    nFrames = nBits / frame_len;    wcdma_block_interleaver(nFrames, frame_len, inData, tempData);#if 0    for (i=0; i < nBits; i++) outData[i] = tempData[i];#else    /*     * Reorder data in interframe multistage interleaver.     * Interleaving patterns for interframe MIL:     *     *  frames |    pattern     * -----------------------------------------------     *      1                     C0     *      2                   C0, C1     *      4                C0, C2, C1, C3     *      8      C0, C4, C2, C6, C1, C5, C3, C7     *     */    if (nFrames == 1) {        memcpy(outData, tempData, nBits * sizeof(int) );    } else if (nFrames == 2) {        memcpy(outData, tempData, nBits * sizeof(int) );    } else if (nFrames == 4) {        memcpy(outData, tempData,               frame_len * sizeof(int) );        memcpy(outData+frame_len, tempData+(2*frame_len),               frame_len * sizeof(int) );        memcpy(outData+(2*frame_len), tempData+frame_len,               frame_len * sizeof(int) );        memcpy(outData+(3*frame_len), tempData+(3*frame_len),               frame_len * sizeof(int) );    } else if (nFrames == 8) {        memcpy(outData, tempData,               frame_len * sizeof(int) );        memcpy(outData+frame_len, tempData+(4*frame_len),               frame_len * sizeof(int) );        memcpy(outData+(2*frame_len), tempData+(2*frame_len),               frame_len * sizeof(int) );        memcpy(outData+(3*frame_len), tempData+(6*frame_len),               frame_len * sizeof(int) );        memcpy(outData+(4*frame_len), tempData+frame_len,               frame_len * sizeof(int) );        memcpy(outData+(5*frame_len), tempData+(5*frame_len),               frame_len * sizeof(int) );        memcpy(outData+(6*frame_len), tempData+(3*frame_len),               frame_len * sizeof(int) );        memcpy(outData+(7*frame_len), tempData+(7*frame_len),               frame_len * sizeof(int) );    } else {       printf("wcdma_frame_interleaver: Wrong number %d of frames.", nFrames);    }#endif    return;}/* ------------------------------------------------------------------- *//* * Function:    wcdma_inter_double_interleaving * Desc.:       Inter interleaving over N frames. * * Note: *              Does interleaving in-place, directly modifiying *              input data vector. */void wcdma_interframe_double_deinterleaver(        int nBits,              /* IN: number of bits in */        int frame_len,          /* IN: number of bits in a frame */        double inData[],        /* IN: input bits */        double outData[])       /* OUT: output bits */{    int nFrames;    int i;    double tempData[ MAX_FRAMES_TO_INTERFRAME_INTERLEAVE *                     MAX_SLOT_LEN * SLOTS_IN_FRAME ];    nFrames = nBits / frame_len;    /*     * Reorder data in interframe multistage interleaver.     * Interleaving patterns for interframe MIL:     *     *  frames |    pattern     * -----------------------------------------------     *      1                     C0     *      2                   C0, C1     *      4                C0, C2, C1, C3     *      8      C0, C4, C2, C6, C1, C5, C3, C7     *     */    if (nFrames == 1) {        memcpy(tempData, inData, nBits * sizeof(double) );    } else if (nFrames == 2) {        memcpy(tempData, inData, nBits * sizeof(double) );    } else if (nFrames == 4) {        memcpy(tempData, inData,               frame_len * sizeof(double) );        memcpy(tempData+frame_len, inData+(2*frame_len),               frame_len * sizeof(double) );        memcpy(tempData+(2*frame_len), inData+frame_len,               frame_len * sizeof(double) );        memcpy(tempData+(3*frame_len), inData+(3*frame_len),               frame_len * sizeof(double) );    } else if (nFrames == 8) {        memcpy(tempData, inData,               frame_len * sizeof(double) );        memcpy(tempData+frame_len, inData+(4*frame_len),               frame_len * sizeof(double) );        memcpy(tempData+(2*frame_len), inData+(2*frame_len),               frame_len * sizeof(double) );        memcpy(tempData+(3*frame_len), inData+(6*frame_len),               frame_len * sizeof(double) );        memcpy(tempData+(4*frame_len), inData+frame_len,               frame_len * sizeof(double) );        memcpy(tempData+(5*frame_len), inData+(5*frame_len),               frame_len * sizeof(double) );        memcpy(tempData+(6*frame_len), inData+(3*frame_len),               frame_len * sizeof(double) );        memcpy(tempData+(7*frame_len), inData+(7*frame_len),               frame_len * sizeof(double) );    } else {       printf("wcdma_frame_interleaver: Wrong number %d of frames.", nFrames);    }    /*     * Do block interleaving for the input block.     */    wcdma_block_float_interleaver(frame_len, nFrames, tempData, outData);    return;}/* ------------------------------------------------------------------- */

⌨️ 快捷键说明

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