spectrumdisplay.cpp

来自「QAM module to use in Java with an easy i」· C++ 代码 · 共 100 行

CPP
100
字号
//---------------------------------------------------------------------------


#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 + =
减小字号Ctrl + -
显示快捷键?