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

📄 datademodulation.cpp

📁 在vc上做的802.16d ofdm phy的仿真
💻 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 + -