📄 datademodulation.cpp
字号:
/***************************************************************************
* Copyright (c) 2003, Coast Co. Ltd.
*
* All rights reserved.
*
*
* Filename:dataDemodulation.cpp
*
* File Description:
*
* Implementation of the data demodulation defined in IEEE 802.16 OFDM.
* -------------------------------------------------------------------------
*
* Revision:1.0
* Author :Hu Bo
* Date :20/12/2004
*
* Revision Details
* -----------------------------------------
*
****************************************************************************/
/*****************************************************************************
* Include Files
****************************************************************************/
#include "global_var.h"
#include "typedef.h"
#include "math.h"
#include "dataDemodulation.h"
#include <stdio.h>
/*****************************************************************************
* Function : dataDemodulation()
*
* Functionality: for QAM, constellation remapping to bits.
* for BPSK/QPSK, limit the output bit width.
*
****************************************************************************/
// soft decision
void dataDemodulation (Int16 *pSymbolDemodIn,
Int16 symbolDemodInLength,
Uint8 softDataPeakBitWidth,
Int16 modulationType,
Int8 *pDemodDataOut,
Int16 demodOutLength)
{
Int16 i,j;
Uint8 averageEnergyBitWidth = 12;
Int8 shiftBitWidth = (averageEnergyBitWidth - softDataPeakBitWidth);
Int8 maxData = (1 << (softDataPeakBitWidth - 1)) - 1;
Int16 symbolUsedLength = 192;
Int16 symbolUsedDataIn[384];
for ( i = 0,j = 0; i < symbolDemodInLength; i++)
{
switch(i)
{
case 12:
case 37:
case 62:
case 87:
case 100:
case 113:
case 138:
case 163:
case 188: break;
default:
{
symbolUsedDataIn[2*j] = pSymbolDemodIn[2*i];
symbolUsedDataIn[2*j+1] = pSymbolDemodIn[2*i+1];
j++;
break;
}
}
}
switch (modulationType)
{
case BPSK:
for (i = 0; i < symbolUsedLength; i++)
{
*pDemodDataOut = (4096 * symbolUsedDataIn[2*i] / 5792 )>> shiftBitWidth;
if (*pDemodDataOut > maxData) *pDemodDataOut = maxData;
if (*pDemodDataOut < -maxData) *pDemodDataOut = -maxData;
pDemodDataOut++;
//pSymbolDemodIn += 2;
}
// demodOutLength = symbolUsedLength;
break;
case QPSK:
for (i = 0; i < symbolUsedLength * 2; i++)
{
*pDemodDataOut = symbolUsedDataIn[i] >> shiftBitWidth;
if (*pDemodDataOut > maxData) *pDemodDataOut = maxData;
if (*pDemodDataOut < -maxData) *pDemodDataOut = -maxData;
pDemodDataOut++;
// pSymbolDemodIn++;
}
// demodOutLength = symbolUsedLength * 2;
break;
case QAM16:
for (i = 0; i < symbolUsedLength * 2; i++)
{
pDemodDataOut[0] = symbolUsedDataIn[i] >> shiftBitWidth;
if (pDemodDataOut[0] > maxData) pDemodDataOut[0] = maxData;
if (pDemodDataOut[0] < -maxData) pDemodDataOut[0] = -maxData;
pDemodDataOut[1] = (g_qamThresholdTable.Qam16Threshold[1] - abs(symbolUsedDataIn[i])) >> shiftBitWidth;
if (pDemodDataOut[1] > maxData) pDemodDataOut[1] = maxData;
if (pDemodDataOut[1] < -maxData) pDemodDataOut[1] = -maxData;
//pSymbolDemodIn++;
pDemodDataOut += 2;
}
// demodOutLength = symbolUsedLength * 4;
break;
case QAM64:
for (i = 0; i < symbolUsedLength * 2; i++)
{
pDemodDataOut[0] = symbolUsedDataIn[i] >> shiftBitWidth;
if (pDemodDataOut[0] > maxData) pDemodDataOut[0] = maxData;
if (pDemodDataOut[0] < -maxData) pDemodDataOut[0] = -maxData;
pDemodDataOut[1] = (g_qamThresholdTable.Qam64Threshold[2] - abs(symbolUsedDataIn[i])) >> shiftBitWidth;
if (pDemodDataOut[1] > maxData) pDemodDataOut[1] = maxData;
if (pDemodDataOut[1] < -maxData) pDemodDataOut[1] = -maxData;
pDemodDataOut[2] = (g_qamThresholdTable.Qam64Threshold[3] - abs(abs(symbolUsedDataIn[i]) - g_qamThresholdTable.Qam64Threshold[2])) >> shiftBitWidth;
if (pDemodDataOut[2] > maxData) pDemodDataOut[2] = maxData;
if (pDemodDataOut[2] < -maxData) pDemodDataOut[2] = -maxData;
// pSymbolDemodIn++;
pDemodDataOut += 3;
}
// demodOutLength = symbolUsedLength * 6;
break;
default:
printf("the modulation type is not available! \n");
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -