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