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

📄 main.h

📁 信号生成:可以生成各种类型的信号包括正弦波、方波、三角波、扫频信号、调幅波、白噪声、窄带随机信号等
💻 H
字号:
//---------------------------------------------------------------------------

#ifndef MainH
#define MainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Buttons.hpp>
#include <ComCtrls.hpp>
#include <ExtCtrls.hpp>
#include <Grids.hpp>
#include "math.h"
#include "YecTypeClass.h"
#include "YeMath.h"

float Uniform(float a, float b, long int *seed)		//产生(a,b)区间上均匀分布的随机数
{													
	//a, b分别为给定区间的上下限, seed为随机数的种子
	float t;	
	*seed=2045*(*seed)+1;
	*seed=*seed-(*seed/1048576)*1048576;
	t=(float)(*seed/1048576.0);
	t=a+(b-a)*t;
	return(t);
}

float Gauss(float mean, float sigma, long int *seed)    //产生正态分布的随机数
{
	//mean: 正态分布的均值    sigma: 正态分布的均方差    *s: 随机数的种子
	int i;
	float x,y;
	for(x=0,i=0;i<12;i++)
		x+=Uniform(0.0,1.0,seed);
	x=(float)(x-6.0);
	y=mean+x*sigma;
	return(y);
}

class TSignal :	public System::TObject
{
protected:
   int   Length;    //数据长度
public:
   int	 ID;        //信号类型
   bool  Selected;  //通道是否选中
   float Speed;     //采样频率
   float *Data;    //浮点数
   __fastcall TSignal(){Selected=true;Length=1024;Speed=1000;Data=new float[Length];};
   virtual __fastcall~TSignal(void){delete []Data;Data=NULL;};
   virtual void __fastcall GetData(){};
   void SetLength(int length)
   {
       delete []Data;
       Data=NULL;
       Length=length;
       Data=new float[length];
   };
};


class TSinSignal :public TSignal
{
public:
	float	Amp;
	float	Freq;
	float	Phase;  //度数
        float   Ratio;  //阻尼
	__fastcall TSinSignal(){ID=0;Amp=1000.0;Freq=10.0;Phase=0.0;Ratio=0.0;};
	virtual void __fastcall GetData()
        {
            for (int i=0;i<Length;i++)
                Data[i]=Amp*sin(6.2832*Freq*float(i)/Speed+Phase*3.1416/180.0)/exp(i*Ratio/1000.0);
        };
};

class TRectSignal :public TSignal
{
public:
	float	Amp;
	float	Freq;
	float	Ratio;
	float	Phase;
	__fastcall  TRectSignal(){ID=1;Amp=1000.0;Freq=10.0;Ratio=50;Phase=0.0;};
	void __fastcall	GetData()
        {
             float amp,temp;
             for (int i=0;i<Length;i++)
             {

                  if(Ratio <= 50) //幅度值为正
	          {
	          	amp = sin(3.1416 * (1.0 - 2.0 * Ratio / 100.0) / 2.0);
		        Data[i] = Amp * (sin(6.2832 * Freq * float(i)/Speed + Phase * 3.1416 / 180.0) > amp ? 1 : -1);
	          }
         	  else
	          {
	        	amp = sin(3.1416 * (3.0 - 2.0 * Ratio / 100.0) / 2.0);
	        	Data[i] = Amp * (sin(6.2832 * Freq *float(i)/Speed + Phase * 3.1416 / 180.0) < amp ? 1 : -1);
	          }
             }
        };
};


class TTriSignal :public TSignal
{
public:
	float	Amp;
	float	Freq;
	float	Phase;
	__fastcall  TTriSignal(){ID=2;Amp=1000.0;Freq=10.0;Phase=0.0;};
	virtual void __fastcall GetData()
        {
            for (int i=0;i<Length;i++)
            {
                 Data[i]=Amp * asin(sin(6.2832 * Freq * float(i)/Speed + Phase * 3.1416 / 180.0)) / 1.5708;
            }
        };
};

class TScanSignal :public TSignal
{
public:
	float	Amp;
	float	StartFreq;
	float	StopFreq;
	float	ScanTime;
	int	ScanMode;
	__fastcall	TScanSignal(){ID=3;Amp=1000.0;StartFreq=10.0;StopFreq=60.0;ScanTime=1.0;ScanMode=0;};
	virtual void __fastcall GetData()
        {
            int n;float temp,curf;
            for (int i=0;i<Length;i++)
            {
	        if(ScanMode == 1)	//对数扫频
	        {
	             n = int((float(i)/Speed - ScanTime) / ScanTime) + 1;
		     curf = StartFreq + (StopFreq - StartFreq) * log10((float(i)/Speed - ScanTime * n) * 10.0 / ScanTime);
		     Data[i] = Amp* sin(6.2832 * curf * (float(i)/Speed - ScanTime * n));
	        }
            	else				//线性扫频
	        {
	             n = int((float(i)/Speed - ScanTime) / ScanTime) + 1;
		     curf = StartFreq + (StopFreq - StartFreq) * (float(i)/Speed - ScanTime * n) / ScanTime;
		     Data[i] = Amp * sin(6.2832 * curf * (float(i)/Speed - ScanTime * n));
	        }
            }
        };
};
class TNoiseSignal :public TSignal
{
public:
	float	Amp;
        float   FangCha;
	__fastcall	TNoiseSignal(){ID=5;Amp=0.0;FangCha=1.0;};
	virtual void __fastcall GetData()
        {
             randomize();
	     long int seed=rand();
             //产生长度为Length的Gauss白噪声
             float tang=1.0;
	     for(int i=0; i<Length; i++)
		Data[i]=Gauss(Amp, FangCha,&seed);
        };
};
class TAmSignal :public TSignal
{
public:
	float	Amp;
	float	CarrierFreq;
	float	SignalFreq;
	__fastcall	TAmSignal(){ID=4;Amp=1000.0;CarrierFreq=100;SignalFreq=10.0;};
	virtual void __fastcall GetData()
        {
             for (int i=0;i<Length;i++)
             {
                   Data[i]=Amp*(sin(6.2832 *CarrierFreq * float(i)/Speed) + sin(6.2832 * CarrierFreq *float(i)/Speed) * sin(6.2832 * SignalFreq * float(i)/Speed));
             }
        };
};

class TPulseSignal:public TSignal
{
public:
    float Amp;
    float PulseWidth;
    int   Type; //0-半正弦脉冲 1后锯齿脉冲  2梯形脉冲
    __fastcall TPulseSignal(){ID=6;Amp=1000.0;PulseWidth=100.0;Type=0;}; //脉冲宽度为5mS
    virtual void __fastcall GetData()
    {
        int d=PulseWidth*Speed/1000.0;  //信号点数0.003*100000=300点
        int startpoint=d*0.4;    //信号起始点,其它为0
        float f=500.0/PulseWidth;  //信号频率100Hz
        for (int i=0;i<Length;i++)
           Data[i]=0.0;
        if (d>Length)
        {
           ShowMessage("请加长脉冲信号数据的长度!!!");
           return;
        }
        if (Type==0)
        {
            for (int i=0;i<d;i++)
            {
                Data[i+startpoint]=Amp*sin(6.2832*f*float(i)/Speed);
            }
        }
        else if (Type==1)
        {
            for (int i=0;i<d;i++)
            {
                Data[i+startpoint]=float(i)*Amp/float(d);
            }
        }
        else if (Type==2)  //梯形脉冲 0.1 0.8 0.1
        {
            int firstpoint=0.1*d;
            int secondpoint=0.9*d;
            for (int i=0;i<firstpoint;i++)
            {
                Data[i+startpoint]=float(i+1)*Amp*10.0/float(d);
            }
            for (int i=firstpoint;i<=secondpoint;i++)
            {
                Data[i+startpoint]=Amp;
            }
            for (int i=0;i<firstpoint;i++)
            {
                Data[i+startpoint+secondpoint]=Amp-float(i+1)*Amp*10.0/float(d);
            }            
        }

        float mydata[1024];
        memcpy(mydata,Data,1024*4);
        int m=1;
    };
};

class TNarrowNoiseSignal:public TSignal //窄带随机
{
public:
	float	Amp;
        float   FangCha;
	float	StartFreq;
        float   StopFreq;
	__fastcall TNarrowNoiseSignal(){ID=7;Amp=0.0;FangCha=1;StartFreq=100.0;StopFreq=200.0;};
	virtual void __fastcall GetData()
        {
             int i;
             float *data=new float[Length];
             //先产生随机信号
             randomize();
	     long int seed=rand();
             float tang=1.0;
	     for(i=0; i<Length; i++)
		data[i]=Gauss(Amp, FangCha,&seed);
             //再进行数字滤波
	     float a[200],b[200];
	     float px[500],py[500];
	     for (i=0;i<500;i++) {px[i]=0.0;py[i]=0.0;}
	     if (StopFreq>=float(Speed)/2.0) StopFreq=Speed/2.0;
             if (StartFreq>=Speed/2.0) StartFreq=Speed/2.0;
             if (StartFreq>StopFreq)
	     {
	          float temp=StartFreq;StartFreq=StopFreq;StopFreq=temp;
	     }
             iirbcf(0,2,5,4,0.0,StartFreq/Speed,StopFreq/Speed,0.0,3.0,b,a);
	     filterp(b,a,5,4,data,Data,Length,px,py);
        };
};
//----------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-managed Components
        TGroupBox *GrbSignal;
        TGroupBox *GrbSavePara;
        TLabel *Label21;
        TEdit *EdtSavePath;
        TButton *Button3;
        TLabel *Label22;
        TEdit *EdtSaveName;
        TLabel *Label23;
        TComboBox *CmbTestNo;
        TGroupBox *GroupBox1;
        TComboBox *CmbMaxChannel;
        TLabel *Label18;
        TLabel *Label17;
        TEdit *EdtLength;
        TEdit *EdtSpeed;
        TLabel *Label1;
        TLabel *Label19;
        TLabel *Label20;
        TBitBtn *BitBtn2;
        TBitBtn *BitBtn3;
        TPageControl *PgcType;
        TTabSheet *TbsSin;
        TLabel *Label5;
        TLabel *Label6;
        TLabel *Label7;
        TLabel *Label28;
        TEdit *TxtSinPhase;
        TEdit *TxtSinAmp;
        TEdit *TxtSinFreq;
        TTabSheet *TbsRect;
        TLabel *Label2;
        TLabel *Label4;
        TLabel *Label10;
        TLabel *Label27;
        TEdit *TxtRectAmp;
        TEdit *TxtRectFreq;
        TEdit *TxtRectRatio;
        TEdit *TxtRectPhase;
        TTabSheet *TabSheet1;
        TLabel *Label3;
        TLabel *Label8;
        TLabel *Label9;
        TLabel *Label24;
        TEdit *TxtTriAmp;
        TEdit *TxtTriFreq;
        TEdit *TxtTriPhase;
        TTabSheet *TabSheet3;
        TLabel *Label11;
        TLabel *Label12;
        TLabel *Label14;
        TLabel *Label26;
        TEdit *TxtScanAmp;
        TEdit *TxtScanStartFreq;
        TEdit *TxtScanTime;
        TEdit *TxtScanStopFreq;
        TRadioGroup *RdgScanMode;
        TTabSheet *TabSheet2;
        TLabel *Label13;
        TLabel *Label15;
        TLabel *Label16;
        TLabel *Label25;
        TEdit *TxtAmAmp;
        TEdit *TxtAmCarrierFreq;
        TEdit *TxtAmSignalFreq;
        TTabSheet *TabSheet4;
        TLabel *Label29;
        TLabel *Label30;
        TEdit *TxtNoiseAmp;
        TLabel *Label31;
        TEdit *TxtNoiseFangCha;
        TTabSheet *TabSheet5;
        TLabel *Label32;
        TLabel *Label33;
        TEdit *TxtPulseAmp;
        TLabel *Label34;
        TEdit *TxtPulseWidth;
        TLabel *Label35;
        TComboBox *CmbPulseType;
        TLabel *Label36;
        TEdit *TxtSinRatio;
        TLabel *Label37;
        TTabSheet *TabSheet6;
        TLabel *Label38;
        TLabel *Label40;
        TEdit *TxtNarrowNoiseStartFreq;
        TLabel *Label41;
        TEdit *TxtNarrowNoiseStopFreq;
        TLabel *Label39;
        TEdit *TxtNarrowNoiseAmp;
        TLabel *Label42;
        TEdit *TxtNarrowNoiseFangCha;
        void __fastcall CmbMaxChannelChange(TObject *Sender);
        void __fastcall BitBtn3Click(TObject *Sender);
        void __fastcall Button3Click(TObject *Sender);
        void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private:	// User declarations
        void __fastcall ChTypeChange(TObject *Sender);
        void __fastcall Update(int chan,int type);
        void __fastcall ChTypeEnter(TObject *Sender);
public:		// User declarations
   TLabel    *ChLabel[16];
   TComboBox *ChType[16];
   TList *SignalList;
   int    CurSetChan;   //当前设置的通道序号

        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

⌨️ 快捷键说明

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