📄 spectrumdisplay.cpp
字号:
//---------------------------------------------------------------------------
#pragma hdrstop
#include "SpectrumDisplay.h"
#include "Spectrum.h"
#include "main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
__fastcall SpectrumDisplay::SpectrumDisplay()
{
if((gSettings.Common.Samplerate)<90000)N=16384;
else N=16384*2;
if((gSettings.Common.Samplerate)>100000)N=16384*2*2;
in = (double*) fftw_malloc(sizeof(double) * N);
out = (double*) fftw_malloc(sizeof(double) * N);
p=fftw_plan_r2r_1d(N,in,out,FFTW_R2HC,FFTW_MEASURE);
ABuf.resize(2);
for(unsigned int i=0;i<ABuf.size();i++)
{
ABuf[i].resize(N);
for(int j=0;j<N;j++)ABuf[i][j]=0.0;
}
ASum.resize(N);
for(int j=0;j<N;j++)ASum[j]=0.0;
APtr=0;
NPtr=0;
MABuf.resize(100);
MASum=0.0;
for(unsigned int i=0;i<MABuf.size();i++)MABuf[i]=0.0;
MAPtr=0;
}
__fastcall SpectrumDisplay::~SpectrumDisplay()
{
fftw_destroy_plan(p);
fftw_free(in);
fftw_free(out);
}
void __fastcall SpectrumDisplay::Update(short * Data, int size)
{
for(int i=0;i<size;i+=2)
{
double sig=(((double)Data[i])+((double)Data[i+1]));
in[NPtr]=sig;
NPtr++;NPtr%=N;
if(NPtr==0)
{
fftw_execute(p);
for(int j=0;j<N/2;j++)ASum[j]-=ABuf[APtr][j];
for(int j=0;j<N/2;j++)
{
MASum-=MABuf[MAPtr];
MABuf[MAPtr]=fabs(out[j])+fabs(out[N-j]);
MASum+=MABuf[MAPtr];
MAPtr++;MAPtr%=MABuf.size();
ABuf[APtr][j]=(MASum/100000.0);
ASum[j]+=ABuf[APtr][j];
}
APtr++;APtr%=ABuf.size();
DisplaySpectrum();
}
}
}
void __fastcall SpectrumDisplay::DisplaySpectrum()
{
int ix,iy;
Graphics::TBitmap *bm = new Graphics::TBitmap;
bm->Width = SpectrumForm->SpectrumImage->Width;
bm->Height = SpectrumForm->SpectrumImage->Height;
bm->HandleType = bmDIB;
bm->Canvas->Pen->Color=clGreen;
bm->Canvas->MoveTo(0,bm->Height);
double xscale=((double)(N/4))/((double)bm->Width);
double yscale=0.0016*(double)bm->Height*(QAMForm->demod->dd.PowerMultiplyer);
for(ix=0;ix<bm->Width;ix++)
{
iy=bm->Height-(yscale*ASum[(int)(((double)ix)*xscale)]);
if((ix>0)&&(ix<bm->Width)&&(iy<bm->Height))
{
if(iy>0)bm->Canvas->LineTo(ix,iy);
else bm->Canvas->LineTo(ix,0);
}
}
SpectrumForm->SpectrumImage->Picture->Bitmap=bm;
delete bm;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -