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

📄 spectrumdisplay.cpp

📁 QAM module to use in Java with an easy interface and powerful performance
💻 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 + -