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

📄 sefade.cpp

📁 有关卷积编码的维特比算法,是硬判决的啊,希望大家
💻 CPP
字号:
#include<math.h>
#include<stdlib.h>
#include<iostream.h>
#include "Sefade.h"

#define pi 3.1415926535897932384626433832795

Sefade::Sefade()
{
}

Sefade::~Sefade()
{
}

void Sefade::sefd(double *idt,double *qdt,int *itau,double *dlvl,double *th,int n0,double *itn,int n1,int nsamp,double tstp,double fd,double flat,double *ramp)
{
	int a,b,c=0;
	double total_attn,atts;
	double *idata,*qdata,*iout,*qout;
	
	idata=new double [nsamp];
	qdata=new double [nsamp];
	iout=new double [nsamp];
	qout=new double [nsamp];
	
	for(a=0;a<nsamp;a++)
	{
		*(iout+a)=0;
		*(qout+a)=0;
		*(ramp+a)=0;
	}
	
	total_attn=0;

	for(a=0;a<n1;a++)		total_attn=total_attn+pow(10,(0.1*dlvl[a]));
	
	for(a=0;a<n1;a++)
	{
		for(b=0;b<nsamp;b++)
		{
			*(idata+b)=*(idt+b);
			*(qdata+b)=*(qdt+b);
		}
		
		atts=pow(10,(0.05*dlvl[a]));
		
		if(dlvl[a]<=-40.0)
			atts=0.0;
		delay(idata,qdata,nsamp,itau[a]);
		
		fade(idata,qdata,nsamp,tstp,fd,n0,itn[a],flat);
        
		for(b=0;b<nsamp;b++)
		{		
			iout[b]=iout[b]+atts*idata[b]/sqrt(total_attn);
			qout[b]=qout[b]+atts*qdata[b]/sqrt(total_attn);
		}
	}
	
	for(b=0;b<nsamp;b++)
	{
		*(th+b)=atan2(qout[b],iout[b])+3.14159;
		*(ramp+b)=sqrt(pow(*(iout+b),2)+pow(*(qout+b),2));
	  
		*(idt+b)=*(iout+b);
		*(qdt+b)=*(qout+b);
	}
    delete [] idata;
	delete [] qdata;
	delete [] iout;
	delete [] qout;
}

void Sefade::fade(double *idata,double *qdata,int nsamp,double tstp,double fd,int n0,double counter,double flat)
{
	double ac0,as0,N;
	double *ic,*cwn,*cwmt,*xc,*xs,*iout,*qout;
	int n;

	ic=new double [nsamp];
	cwn=new double [nsamp];
	cwmt=new double [nsamp];
	xc=new double [nsamp];
	xs=new double [nsamp];
	iout=new double [nsamp];
	qout=new double [nsamp];

	if(fd!=0.0)
	{
		ac0=sqrt(1.0/(2.0*((double)n0+1)));//power normalized constant(ich)
		as0=sqrt(1.0/(2.0*(double)n0));//power normalized constant(qch)
		
		N=4*n0+2;

		for(i=0;i<nsamp;i++)
		{
			*(xc+i)=0;
			*(xs+i)=0;
			*(ic+i)=(double)counter+i+1;
		}

		for(i=0;i<nsamp;i++)
		{
			for(n=1;n<=n0;n++)
			{
				cwn[i]=cos(cos(2.0*pi*(double)n/N)*ic[i]*2.0*pi*fd*tstp);
			    xc[i]=xc[i]+cos(pi*(double)n/n0)*cwn[i];
			    xs[i]=xs[i]+sin(pi*(double)n/n0)*cwn[i];
			}
		}

		for(i=0;i<nsamp;i++)
		{
			cwmt[i]=sqrt(2.0)*cos(ic[i]*2.0*pi*fd*tstp);
			xc[i]=(2.0*xc[i]+cwmt[i])*ac0;
			xs[i]=2.0*xs[i]*as0;

			if(flat==1)
			{
				iout[i]=sqrt(pow(xc[i],2)+pow(xs[i],2))*idata[i];
				qout[i]=sqrt(pow(xc[i],2)+pow(xs[i],2))*qdata[i];
			}
			else
			{
				iout[i]=xc[i]*idata[i]-xs[i]*qdata[i];
				qout[i]=xs[i]*idata[i]+xc[i]*qdata[i];
			}
		}

		for(i=0;i<nsamp;i++)
		{
			*(idata+i)=*(iout+i);
			*(qdata+i)=*(qout+i);
		}

	}
	
    delete [] ic;
	delete [] cwn;
	delete [] cwmt;
	delete [] xc;
	delete [] xs;
	delete [] iout;
	delete [] qout;
}

void Sefade::delay(double *idata,double *qdata,int nsamp,int idel)
{
	double *iout,*qout;

	iout=new double [nsamp];
	qout=new double [nsamp];

	for(i=0;i<nsamp;i++)
	{
		*(iout+i)=0;
		*(qout+i)=0;
	}

	if(idel!=0)
	{
		for(i=0;i<idel;i++)
		{
			*(iout+i)=0;
			*(qout+i)=0;
		}
		for(i=idel;i<nsamp;i++)
		{
			*(iout+i)=*(idata+i-idel);
			*(qout+i)=*(qdata+i-idel);
		}
		for(i=0;i<nsamp;i++)
		{
			*(idata+i)=*(iout+i);
			*(qdata+i)=*(qout+i);
		}
	}
	delete [] iout;
	delete [] qout;
}






⌨️ 快捷键说明

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