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

📄 compower.cpp

📁 脑电信号分析软件
💻 CPP
字号:

#include <vcl.h>
#pragma hdrstop
#include "Main.h"
#include "ComPower.h"
#include <math.h>
#define FFTPOINT    512     //     256       1024
//#define M_PI  4.0*atan(1.0)

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TPPpower *PPpower;
//---------------------------------------------------------------------------
__fastcall TPPpower::TPPpower(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void DrawRect(TCanvas *ptr,int left,int top, int right,int bottom, TColor color);
void Write_line(TCanvas *ptr, int x, int y, int x1 ,int y1, TColor color);
//---------------------------------------------------------------------------
 void DrawRect(TCanvas *ptr,int left,int top, int right,int bottom, TColor color)
{
    ptr->Brush->Color=color;
    ptr->FillRect(Rect(left,top,right,bottom));
}
//---------------------------------------------------------------------------
void Write_line(TCanvas *ptr,int x,int y, int x1,int y1, TColor color)
{
     if (x==x1 && y==y1)
     {
        ptr->Pixels[x][y]=color;
        return;
     }
	 ptr->Pen->Color=color;
	 ptr->MoveTo(x,y);
	 ptr->LineTo(x1,y1);
}
//--------------------------------------------------------------------------
void __fastcall TPPpower:: DrawBakGrndGrid_Picture()
 {
    int Offset_x=(Image1->Width-512)/2;
    int Offset_y=Image1->Height-220;
    Image1->Canvas->Pen->Style=psDot;
    for(int i=Image1->Height-Offset_y;i>=Offset_y;i-=20) //  -20
      {
            Write_line(Image1->Canvas,Offset_x+20,i,Image1->Width-Offset_x-10+20,i,clSilver);//画横线
            Image2->Canvas->Brush->Style=bsClear;

      }
    for(int j=Offset_x+20;j<=512+Offset_x+20;j+=50)     //Offset_x
       {
            Write_line(Image1->Canvas,j,Offset_y+10,j,Image1->Height-Offset_y,clSilver); //画竖线
       }

 }

//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TPPpower:: DrawBackGroundGrid_PowerOut(int step,int q)//此处用于化功率输出的背景色及网格
{
    fs=100;
    int Offset_x=(Image2->Width-512)/2+10;
    int Offset_y=Image2->Height-220;
    int count1=q;
    int count2=0;
    int index_50= 512*2*50/fs;

    Image2->Canvas->Pen->Style=psDot;

    for(int i=Image2->Height-Offset_y;i>=0;i-=200/q)
        {
            Write_line(Image2->Canvas,Offset_x+20,50+i,Image2->Width-Offset_x+40,50+i,clSilver);//画横线
            Image2->Canvas->Brush->Style=bsClear;
            if (count1==0)
                Image2->Canvas->TextOut(Offset_x-10,50+i-5,"    0");      // 230
            else
                Image2->Canvas->TextOut(Offset_x-10,50+i-5,AnsiString(-count1*10));     // 230
            count1--;
        }
    Image2->Canvas->TextOut(Offset_x-10,50+0,"P/dB");     //   230
    Image1->Canvas->TextOut(Image2->Width/2-30,20,"所选信号");

    for(int j=Offset_x;j<=512+Offset_x;j+=index_50)
        {
            Write_line(Image2->Canvas,j+20,50+0,j+20,50+Image2->Height-Offset_y,clSilver); //画竖线
            if (count2==0)
                Image2->Canvas->TextOut(j+20,50+Image2->Height-Offset_y+2,"0");
            else
                Image2->Canvas->TextOut(j-10+20,50+Image2->Height-Offset_y+2,AnsiString(count2*50));
            count2++;
        }
    Image2->Canvas->TextOut(512+Offset_x+25,50+Image2->Height-Offset_y,"f/Hz");
    Image2->Canvas->Pen->Style=psSolid;
   // Image2->Canvas->Font =16;
    Image2->Canvas->TextOut(Image2->Width/2-30,20,"功率谱显示");
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
 int  __fastcall TPPpower:: Min_Max(double YComplex[])
{
    double q;
    double Min_Power=1;
    int quotient;
   // int Max_i;
    int  NPoint =FFTPOINT;          //此处给出特定的值,

    Max_Power=0;
    for(int i=0;i<NPoint;i++)
    {
        q=YComplex[i];
        if (q<Min_Power)
            Min_Power=q;
        if (q>Max_Power)
        {
            Max_Power=q;
           // Max_i=i;
        }
    }
    //Label3->Caption=AnsiString(fs*Max_i/NPoint);
    quotient=-10*log10(Min_Power/Max_Power)/10+1;
    return quotient;
}
//----------------------------------------------------------------------------
void __fastcall TPPpower:: Draw_PowerOut(int step,int q,double YComplex[])   //功率输出画图
{
    int i=0;
    int Offset_x=(Image2->Width-512)/2+30;
    for (int ix=0;ix<512 ;ix+=step)     //          Npoint/2
    {
        Write_line(Image2->Canvas,ix+Offset_x, 50+20-10*log10(YComplex[i]/Max_Power)*200/(q*10),ix+step+Offset_x,50+20-10*log10(YComplex[i+1]/Max_Power)*200/(q*10),clBlue);
        i++;
    }
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void FFTInit(double wx[],double wy[])   //初始化加权向量
{
	int i;
	double factr, angle;
       //double  M_PI;
        //M_PI=4.0*atan(1.0);  M_PI
	factr = 2.0 * 3.1415 / (double)FFTPOINT;

	for (i = 0;i < FFTPOINT;i++)
	{
		angle = (double)i * factr;
		wx[i] = cos(angle);
		wy[i] = sin(angle);
	}
}
int bitr(int k, int logn)
{
	short int ans = 0;
	short int j = k;

	for (short int i = 0;i < logn;i++)
	{
		ans = (ans << 1) + (j & 1);
		j = j >> 1;
	}
	return (ans);
}
void fft(double datax[],double datay[],double wx[],double wy[],int length)
{  // FFT运算函数,入口DATAX,DATAY,WX,WY  出口DATAX,DATAY
	short int n1, logn, i, j, k, l, logl, p;
	float sx, sy, tx, ty;   //   complex
	logn = 9;//10;
	n1 = length >> 1;
	j = logn - 1;
	k = 0;
	//------ transform

	for (logl = 0;logl < logn;logl++)
	{
		do
		{
			for (i = 0;i < n1;i++)
			{
				p = bitr((k >> j), logn);
				l = k + n1;
				//---------- conj
				sx = wx[p];
				sy = -wy[p];
				//---------- multiply
				tx = sx * datax[l] - sy * datay[l];
				ty = sx * datay[l] + sy * datax[l];
				//---------- sub
				datax[l] = datax[k] - tx;
				datay[l] = datay[k] - ty;
				//---------- add
				datax[k] = tx + datax[k];
				datay[k] = ty + datay[k];
				k++;
			} // dofor i

			k += n1;
            if(n1 == 0) break;   //////////////////////////////////////
		}
		while (k < length);

		k = 0;

		j--;

		n1 = n1 >> 1;
        if(n1 == 0) break;   /////////////////////////////////
	}
	//-------- reorder
	for (i = 1;i < length;i++)
	{
		k = bitr(i, logn);

		if (i > k)
		{
			//-------- exchange i,k elements
			sx = datax[i];
			sy = datay[i];
			datax[i] = datax[k];
			datay[i] = datay[k];
			datax[k] = sx;
			datay[k] = sy;
		}
	}
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void MagFFT(double Mag[],double datax[],double datay[],int length )
{    int i;
      double RealData,ImagData;
    for (i=0;i<length;i++)
    {
       RealData = (datax[i])*(datax[i]) ;
       ImagData=  (datay[i])*(datay[i]);
       Mag[i]= ((RealData+ImagData))/( length);    //
    }
}
//----------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TPPpower::Button1Click(TObject *Sender)
{
PPpower->Close();
}
//---------------------------------------------------------------------------
void __fastcall TPPpower::Button2Click(TObject *Sender)
{
     int p,q;
     int iFileHandle,i;
     int Sta_x,En_x;
     int iBytesRead;
     int Lead;
     int s;

     int Number;
     double FFTMag[FFTPOINT+5];
     double max,min,swing;
     double wx[FFTPOINT+5],wy[FFTPOINT+5];   //计算FFT用
     double datax[FFTPOINT+5],datay[FFTPOINT+5];  // 计算FFT用
     int Offset_x=(Image1->Width-512)/2;

     s=2*512/FFTPOINT;//计算每点的间隔
     iBytesRead=FFTPOINT;
     Sta_x=MainForm->Start_x;
     En_x=MainForm->End_x;
     Lead=MainForm->Lead_Num ;

      DrawRect(Image1->Canvas,0,Image1->Height,Image1->Width,0,clMenu);
      DrawRect(Image2->Canvas,0,Image2->Height,Image2->Width,0,clMenu);

      if(Sta_x == En_x)
       {      return;    }
      if (En_x-Sta_x+1>512)   ///取数据的长度大于512时
              En_x=512+Sta_x;
        for(p=Sta_x;p<En_x;p++)
        {
                for(q=0;q<16;q++)
                {
                        Fileleng[p-Sta_x].td[q]=MainForm->buf[p*16+q] ;
                        Buf_Show[p-Sta_x].td[q]=MainForm->buf[p*16+q] ;   ////用于放置实际显示的图像数据

                }
        }

   if (En_x-Sta_x+1<512) ////取数据小于512时,将后面补零
   {
       for (p=En_x-Sta_x+1;p<512;p++)
         {
             for(q=0;q<16;q++)
             {
                 Fileleng[p].td[q]=0;//MainForm->buf[i*16+q] ;
             }
         }
    }
        for(p=0;p<FFTPOINT;p++)
       {
                datax[p]=(double)Fileleng[p].td[Lead];
                datay[p] = 0;
        }
        Image1->Canvas->FillRect(Image1->ClientRect);
        Image1->Canvas->Pen->Color=clBlack;
        for (i = Offset_x+20;i < iBytesRead -1+Offset_x;i++)     //
        {
            Image1->Canvas->MoveTo(i, Image1->Height*0.6-Buf_Show[i-Offset_x].td[Lead]*0.03);  //      Image1->Height*0.8-
            Image1->Canvas->LineTo(i+1,Image1->Height*0.6- Buf_Show[i+1-Offset_x].td[Lead]*0.03); //   Image1->Height*0.8-
        }
        DrawBakGrndGrid_Picture();
 //-----进行FFT变换-------------------------------------------------------
        FFTInit(wx,wy);
        fft(datax,datay,wx,wy,iBytesRead);
        MagFFT(FFTMag,datax,datay,iBytesRead);
//------功率输出画图---------------------------------------------------------
        Number=Min_Max(FFTMag);
        DrawBackGroundGrid_PowerOut(s,Number);   //画出输出信号功率谱的背景
        Draw_PowerOut(s,Number,FFTMag);        //画出输出信号的功率谱
}
//---------------------------------------------------------------------------
void __fastcall TPPpower::FormCloseQuery(TObject *Sender, bool &CanClose)
{
     MainForm->Timer3->Enabled=true;
     RepainPic=true;
}
//---------------------------------------------------------------------------

//--------------------------------------------------------------------------
 void __fastcall TPPpower::FormCreate(TObject *Sender)
{
    RepainPic=false;
}



⌨️ 快捷键说明

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