📄 interleaver.c
字号:
* 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 + -