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

📄 modulator.cpp

📁 QAM module to use in Java with an easy interface and powerful performance
💻 CPP
字号:
//---------------------------------------------------------------------------


#pragma hdrstop

#include "Modulator.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

//---------------------------------------------------------------------------


__fastcall Modulator::Modulator()
{
        dataformatter=0;
        dataformatter=new DataFormatter;

        gSettings.ModMajorAddCallBackNotificationFuction(SettingsHaveChanged);
        SettingsHaveChanged(CH_ANYTHING);
}

void __fastcall Modulator::SettingsHaveChanged(NotificationEventType WhatHasChanged)
{
        RootRaisedCosine *rrc;
        h.resize(gSettings.ModMajor.Firsize);
        rrc=new RootRaisedCosine(gSettings.ModMajor.Firsize,gSettings.ModMajor.Symbol_Freq,gSettings.ModMajor.Alpha,h.begin());
        delete rrc;
        Wt.SetFreq(gSettings.ModMajor.Freq);
        offset=0;

        symbolbuffsize=2*((int)(gSettings.ModMajor.Firsize*gSettings.ModMajor.Freq/gSettings.Common.Samplerate))+2;
        symbolbuffcntr.resize(symbolbuffsize);
	sinampsymbolbuff.resize(symbolbuffsize);
	cosampsymbolbuff.resize(symbolbuffsize);
        for(int i=0;i<symbolbuffsize;i++){symbolbuffcntr[i]=0;sinampsymbolbuff[i]=0.0;cosampsymbolbuff[i]=0.0;}
        symbolbuffptr=0;
}

void __fastcall Modulator::Update(short * Data, int size)
{
        for(int i=0;i<size;i+=2)
        {

                Wt.WTnextFrame();
                //if on next frame we need to send a symbol
                if(Wt.IfPassesPointNextTime(offset))
                {
                        offset+=gSettings.ModMajor.Gamma;
                        if(offset>=1)offset-=1;
                        int ch;
                        double cosamp;
                        double sinamp;

                        ch=dataformatter->GetNextSymbol();
                        cosamp=gSettings.ModMajor.Cmap[ch].re;
                        sinamp=gSettings.ModMajor.Cmap[ch].im;

                        //work out intapolation between samples
                        double pthis=Wt.FractionOfSampleItPassesBy;
		        double pnext=1-pthis;
        		symbolbuffcntr[symbolbuffptr]=0; //this
	        	sinampsymbolbuff[symbolbuffptr]=sinamp*pthis;
		        cosampsymbolbuff[symbolbuffptr]=cosamp*pthis;
        		symbolbuffptr++;symbolbuffptr%=symbolbuffsize;
	        	symbolbuffcntr[symbolbuffptr]=-1; //next
		        sinampsymbolbuff[symbolbuffptr]=sinamp*pnext;
                	cosampsymbolbuff[symbolbuffptr]=cosamp*pnext;
	        	symbolbuffptr++;symbolbuffptr%=symbolbuffsize;
                }

                double sinsum=0;
        	double cossum=0;
	        for(int i=0;i<symbolbuffsize;i++)
        	{
	        	if(symbolbuffcntr[i]<(gSettings.ModMajor.Firsize))
		        {
        			if(symbolbuffcntr[i]>=0)
	        		{
		        		sinsum+=sinampsymbolbuff[i]*h[symbolbuffcntr[i]];
			        	cossum+=cosampsymbolbuff[i]*h[symbolbuffcntr[i]];
        			}
	        		symbolbuffcntr[i]++;
		        }
        	}

                Data[i]=(short)((Wt.WTSinValue()*sinsum+Wt.WTCosValue()*cossum)*15000.0);
                Data[i+1]=Data[i];
        }
}

__fastcall Modulator::~Modulator()
{
        if(dataformatter)delete dataformatter;
        gSettings.ModMajorRemoveCallBackNotificationFunction(SettingsHaveChanged);
}


//---------------------------------------------------------------------------

⌨️ 快捷键说明

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