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

📄 genrxrootraisedcosine.cpp

📁 用matlab程序实现WCDMA系统的仿真
💻 CPP
字号:
#include <math.h>
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#include "mex.h"

#define PI 3.14159265358979

void GenRootRaisedCosine(int , int ,unsigned ,double ,double ,double * ,double * ,unsigned );

void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
/***************************************************************************************
* void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
*
* Copyright 2002 The Mobile and Portable Radio Research Group
*
* Gateway function for GenRxRootRaisedCosine.  Supports that passing of five input parameters
* and two output parameters.  The five input parameters are
*		Lower Bound			Determines the minimum limit of the truncated 
*							impulse response normalized by symbol period
*		Upper Bound			Determines the maximum limit of the truncated 
*							impulse response normalized by symbol period
*		SampleRate			The number of samples per symbol duration
*		RollOff				Rolloff of the Filter.  Must not exceed 1
*		SymbolPeriod		Symbol Duration (in seconds)
*
* The two output parameters are
*		Pulse					Impulse response
*		t_index					Time index
***************************************************************************************/
{
	int MexLBound,MexUBound,PLength;
	unsigned MexSamplesPerSymbol;
	double MexRollOff,MexSymbolPeriod;
	int mrows,ncols;
	double dbleScale,fraction,integer_portion;
	double *pulse,*TimeIndex;
	const mxArray *tprhs;
	
	
	//Check for the proper number of input and output arguments
	if (nrhs != 5) mexErrMsgTxt("\nExactly FIVE input arguemnts are required!!\n");
	else if (nlhs != 2 ) mexErrMsgTxt("\nExactly TWO output arguements are required!!\n");

	//All Inputs must be scalars
	//Lower Bound
	tprhs = *prhs;
	mrows = mxGetM(tprhs);
	ncols = mxGetN(tprhs);
	if ( !mxIsDouble(tprhs) || mxIsComplex(tprhs) || !(mrows ==1 && ncols ==1))
		mexErrMsgTxt("\nLowerBoundT must be a noncomplex scalar\n");
	MexLBound = (int) mxGetScalar(tprhs);


	//Upper Bound
	tprhs = *(prhs+1);
	mrows = mxGetM(tprhs);
	ncols = mxGetN(tprhs);
	if ( !mxIsDouble(tprhs) || mxIsComplex(tprhs) || !(mrows ==1 && ncols ==1))
		mexErrMsgTxt("\nUpperBoundT must be a noncomplex scalar\n");
	MexUBound = (int) mxGetScalar(tprhs);

	//SampleRate
	tprhs = *(prhs+2);
	mrows = mxGetM(tprhs);
	ncols = mxGetN(tprhs);
	if ( !mxIsDouble(tprhs) || mxIsComplex(tprhs) || !(mrows ==1 && ncols ==1))
		mexErrMsgTxt("\nSamples Per Symbol must be a noncomplex scalar\n");
	dbleScale=mxGetScalar(tprhs);
	fraction=modf(dbleScale,&integer_portion);
	if (integer_portion <= 0.0) mexErrMsgTxt("\nMexSamplesPerSymbol must be positive\n");
	MexSamplesPerSymbol = (unsigned) integer_portion;
	if (fraction != 0) mexErrMsgTxt("\nMexSamplesPerSymbol must be an integer\n");

	//RollOff
	tprhs = *(prhs+3);
	mrows = mxGetM(tprhs);
	ncols = mxGetN(tprhs);
	if ( !mxIsDouble(tprhs) || mxIsComplex(tprhs) || !(mrows ==1 && ncols ==1))
		mexErrMsgTxt("\nSamples Per Symbol must be a noncomplex scalar\n");
	MexRollOff=mxGetScalar(tprhs);
	if ((MexRollOff <= 0.0) || (MexRollOff > 1.0)) mexErrMsgTxt("\nMexRollOff must be between 0 and 1\n");

	//Symbol Period
	tprhs = *(prhs+4);
	mrows = mxGetM(tprhs);
	ncols = mxGetN(tprhs);
	if ( !mxIsDouble(tprhs) || mxIsComplex(tprhs) || !(mrows ==1 && ncols ==1))
		mexErrMsgTxt("\nSamples Per Symbol must be a noncomplex scalar\n");
	MexSymbolPeriod=mxGetScalar(tprhs);
	if (MexRollOff <= 0.0)  mexErrMsgTxt("\nSample Period must be positive\n");

	PLength = (MexUBound - MexLBound) * (int) MexSamplesPerSymbol + 1;
	*plhs = mxCreateDoubleMatrix( PLength,1,mxREAL);
	*(plhs+1) = mxCreateDoubleMatrix( PLength,1,mxREAL);
	pulse = mxGetPr(*plhs);
	TimeIndex = mxGetPr(*(plhs+1));
	//Call Root Raised Cosine function
	GenRootRaisedCosine(MexLBound, MexUBound,MexSamplesPerSymbol,MexRollOff, MexSymbolPeriod,pulse,TimeIndex,PLength);
	

}





void GenRootRaisedCosine(int LowerBoundT, int UpperBoundT,unsigned SamplesPerSymbol,double RollOff,double SymbolPeriod,double *filter,double *t_index,unsigned NumSamples)
/******************************************************************************************
/ void GenRootRaisedCosine(int LowerBoundT, int UpperBoundT,unsigned SamplesPerSymbol,
/      double RollOff,double SymbolPeriod,double *filter,double *t_index,unsigned NumSamples)
/
/ Copyright 2002 The Mobile and Portable Radio Research Group
/
/ GenRootRaisedCosine produces the impulse response of a root raised cosine filter and
/ stores it in an array.  Note that the impulse of a root raised cosine filter ranges
/ from -infinity to infinity.  It is therefore necessary to truncated from LowerBoundT to
/ UperBountT.
/
/ Parameters
/   Input
/      LowerBoundT        Determines the minimum limit of the truncated imulse response
/                         normalized by symbol period
/      UpperBoundT        Determines the maximum limit of the truncated imulse response
/                         normalized by symbol period
/      SamplesPerSymbol   The number of samples per symbol duration
/      RollOff            Rolloff of the Filter.  Must not exceed 1
/      SymbolPeriod       Symbol Duration (in seconds)
/ 
/   Output
/      *filter            Pointer ot an array that contains the filter impulse response
/      *t_index           Pointer ot an array that contains the associated time.
/      NumSamples         Length of the output array
/
/******************************************************************************************/
{
	double *filter_temp,*t_temp;	//Temporary pointers for *filter and *t_index
	double cos_arg;					//Stores arguement to cosine funciton
	double bottom_arg;				//Stores non-trivial term in the denominator
	double coeff;					//Stores the normalizing coefficient
	double SampleDuration;			//Stores the sample period
	int k;
	//Determine Array length
	NumSamples = (UpperBoundT-LowerBoundT)*SamplesPerSymbol+1;

	
	//Compute impulse response
	SampleDuration = SymbolPeriod/SamplesPerSymbol;
	coeff = (4.0 * RollOff * sqrt(SampleDuration)) / (PI * sqrt(SymbolPeriod));

    t_temp=t_index;
	filter_temp=filter;
	for (k=0; k< (int) NumSamples;k++)
	{
		//Compute time index
		*t_temp=(LowerBoundT * SymbolPeriod) + (k * SampleDuration);
		if (*t_temp == double (0.0)) *t_temp = 1e-20;
		cos_arg = (1 + RollOff) * (PI * *t_temp / SymbolPeriod);
//		sin_arg = (1 - RollOff) * (PI * *t_temp / SymbolPeriod);
		bottom_arg = (double) 4.0 * RollOff * *t_temp / SymbolPeriod;
		t_temp++;
		*filter_temp++ = coeff * (cos(cos_arg) ) / (1 - (bottom_arg * bottom_arg));
	}
}

⌨️ 快捷键说明

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