📄 modulator.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 + -