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

📄 sample8.c

📁 机械工业出版社 Lab Windows/CVI逐步深入与开发实例源代码
💻 C
字号:
#include <ansi_c.h>
#include <analysis.h>
#include <cvirte.h>		
#include <userint.h>
#include "sample8.h"
#define NUMPOINTS 256
static int panelHandle;

#include <cvirte.h>   

int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                       LPSTR lpszCmdLine, int nCmdShow)
{
	if (InitCVIRTE (hInstance, 0, 0) == 0)	
		return -1;
		
	if ((panelHandle = LoadPanel (0, "sample8.uir", PANEL)) < 0)
		return -1;
		
    ReplotWaveforms (panelHandle,  PANEL_WINDOW,  EVENT_COMMIT,NULL,NULL,NULL);
    
	DisplayPanel (panelHandle);
	
	RunUserInterface ();
	return 0;
}

int CVICALLBACK PanelCallback (int panel, int event, void *callbackData,
		int eventData1, int eventData2)
{
	switch (event)
		{
		case EVENT_CLOSE:
		
			QuitUserInterface (0);
			
			break;
		}
	return 0;
}

int CVICALLBACK QuitCallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	switch (event)
		{
		case EVENT_COMMIT:
		
			QuitUserInterface (0);
			
			break;
		}
	return 0;
}

int CVICALLBACK ReplotWaveforms (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
    //定义变量,分别表示信号1、2幅度,信号1、2循环数
    double wave1Amp, wave2Amp, wave1Circle, wave2Circle;
    
    //定义变量,分别表示滤波器波纹系数、衰减系数、上限频率、
    //下限频率和采样频率
    double ripple, attenuation,upper_cutoff_frequency,
           lower_cutoff_frequency,sample_rate;
    
    //定义数组,用来储存信号数据,
    //NUMPOINTS表示信号长度,在文件前已定义为256 
	double waveData1[NUMPOINTS],waveData2[NUMPOINTS],
	       tempData[NUMPOINTS],signalData[NUMPOINTS];
	       
    //定义变量,表示滤波器的各参数
    int    i,filter_style,filter_type,filter_order,
           window_style,use_pulse;
           
    //定义IIRFilterPtr类型变量,用来储存滤波器相关信息
    IIRFilterPtr filter_information;
    
	switch (event)
		{
		case EVENT_COMMIT:
		
	       //删除四个Graph控件上的所有曲线
	       DeleteGraphPlot (panelHandle, PANEL_FREQGRAPH, -1, VAL_DELAYED_DRAW);
	       DeleteGraphPlot (panelHandle, PANEL_TIMEGRAPH, -1, VAL_DELAYED_DRAW);
	       DeleteGraphPlot (panelHandle, PANEL_WINDOWGRAPH, -1, VAL_DELAYED_DRAW);
	       DeleteGraphPlot (panelHandle, PANEL_FILTERGRAPH, -1, VAL_DELAYED_DRAW);
	
	       //获取正弦信号1和正弦信号2的参数
	       GetCtrlVal (panelHandle, PANEL_WAVE1AMP, &wave1Amp);
		   GetCtrlVal (panelHandle, PANEL_WAVE2AMP, &wave2Amp);
		   GetCtrlVal (panelHandle, PANEL_WAVE1CIRCLE, &wave1Circle);
		   GetCtrlVal (panelHandle, PANEL_WAVE2CIRCLE, &wave2Circle);
	
	       //产生两个正弦信号
	       SinePattern (NUMPOINTS, wave1Amp, 0.0, wave1Circle, waveData1);
	       SinePattern (NUMPOINTS, wave2Amp, 0.0, wave2Circle, waveData2);
    
           //利用Add1D函数叠加两个正弦信号
           Add1D (waveData1, waveData2, NUMPOINTS, signalData);

	       //显示叠加信号
	       PlotY (panelHandle, PANEL_TIMEGRAPH, signalData, NUMPOINTS,
		          VAL_DOUBLE, VAL_THIN_LINE, VAL_NO_POINT, VAL_SOLID, 1,
		          VAL_BLACK);
	
	       //对叠加信号作FFT变换
	       for(i=0;i<NUMPOINTS;i++) 
	             tempData[i]=0; 
	       FFT (signalData, tempData, NUMPOINTS);
    
           //计算叠加信号FFT变换后的幅度信号  
           for(i=0;i<NUMPOINTS;i++)
		        signalData[i] = sqrt (signalData[i]*signalData[i]
		                       +tempData[i]*tempData[i]);

	       //显示FFT变换后的幅度曲线
	       PlotY (panelHandle, PANEL_FREQGRAPH, signalData, NUMPOINTS/2,
		          VAL_DOUBLE, VAL_THIN_LINE, VAL_NO_POINT, VAL_SOLID, 1,
		          VAL_RED);

	       //获取WINDOW控件的值,作为窗口变换的类型
	       GetCtrlVal (panelHandle, PANEL_WINDOW, &window_style);

	       //计算叠加信号
	       Add1D (waveData1, waveData2, NUMPOINTS, signalData);
    
	      //根据不同的窗口类型,调用不同的窗口函数对信号作窗口变换
	      switch (window_style)
		     {
	        	case 0:
		           	HanWin(signalData, NUMPOINTS);
			        break;
			        
		        case 1:
		          	HamWin(signalData, NUMPOINTS);
		          	break;
		          	
	          	case 2:
	           		BkmanWin(signalData, NUMPOINTS);
	          		break;
	          		
	          	case 3:
	          		ExBkmanWin (signalData, NUMPOINTS);
	        		break;
	        		
	          	case 4:
	           		BlkHarrisWin(signalData, NUMPOINTS);
		         	break;
		   }
	
         //显示窗口变换后的信号    
         PlotY (panelHandle, PANEL_WINDOWGRAPH, signalData, NUMPOINTS,
				VAL_DOUBLE, VAL_THIN_LINE, VAL_NO_POINT, VAL_SOLID, 1,
				VAL_BLUE);

	     //获取滤波器类型
	     GetCtrlVal (PANEL, PANEL_FILTERSTYLE, &filter_style);	     
	     //获取滤波器种类   
	     GetCtrlVal (PANEL, PANEL_FILTERTYPE, &filter_type);          
         //获取滤波器波纹系数        
         GetCtrlVal (PANEL, PANEL_FILTERRIPPLE, &ripple);		     
	     //获取滤波器衰减系数
	     GetCtrlVal (PANEL, PANEL_FILTERATTENUATION, &attenuation); 
         //获取滤波器阶数           
         GetCtrlVal (PANEL, PANEL_FILTERORDER, &filter_order);	     
         //获取滤波器上限频率                
         GetCtrlVal (PANEL, PANEL_HCF, &upper_cutoff_frequency);      
         //获取滤波器下限频率                
         GetCtrlVal (PANEL, PANEL_LCF, &lower_cutoff_frequency);      
         //获取采样频率
         GetCtrlVal (PANEL, PANEL_SAMPLERATE, &sample_rate);	         
	     //是否应用冲击信号代替叠加信号     
	     GetCtrlVal (PANEL, PANEL_USEPULSE, &use_pulse);	             
    
         //根据滤波器种类分配滤波器指针
         switch(filter_type)
            {
               //低通滤波器
               case 0 : 
             	 filter_information = AllocIIRFilterPtr (LOWPASS, filter_order);
                 break;
                 
               //高通滤波器
               case 1: 
	             filter_information = AllocIIRFilterPtr (HIGHPASS, filter_order);
                 break;
                 
               //带通滤波器
               case 2: 
                 filter_information = AllocIIRFilterPtr (BANDPASS, filter_order);    
                 break;

               //带阻滤波器
               case 3: 
                 filter_information = AllocIIRFilterPtr (BANDSTOP, filter_order);    
                 break;
           }
    
         //根据滤波器类型设置滤波器指针
         switch(filter_style)
           {
              //巴特乌斯滤波器
              case 0 : 
				Bw_CascadeCoef (sample_rate, lower_cutoff_frequency,
								upper_cutoff_frequency, filter_information);
                break;
                
              //切比雪夫滤波器
              case 1: 
				Ch_CascadeCoef (sample_rate, lower_cutoff_frequency,
								upper_cutoff_frequency, ripple, filter_information);
                break;
                
              //逆切比雪夫滤波器
              case 2: 
				InvCh_CascadeCoef (sample_rate, lower_cutoff_frequency,
								   upper_cutoff_frequency, attenuation,
								   filter_information);
                break;
                
	          // Elliptic 滤波器
              case 3: 
	            Elp_CascadeCoef (sample_rate, lower_cutoff_frequency,
								 upper_cutoff_frequency, ripple, attenuation,
								 filter_information);
                break;
                
              //贝塞尔滤波器
              case 4: 
				Bessel_CascadeCoef (sample_rate, lower_cutoff_frequency,
									upper_cutoff_frequency, filter_information);
                break;
    }
    
    //判断是否使用冲击信号代替叠加信号,
    //如果是则显示滤波器特性曲线
    if(use_pulse)
		Pulse (NUMPOINTS, 1.0, 0, 1, signalData);
    else
        Add1D (waveData1, waveData2, NUMPOINTS, signalData);
	
	//调用IIRCascadeFiltering函数对数据进行滤波
	IIRCascadeFiltering (signalData, NUMPOINTS, filter_information,
						 tempData);

    //如果是用冲击信号代替叠加信号,做FFT后求幅度
    if(use_pulse)
	{
    	for(i=0;i<NUMPOINTS;i++) 
	           signalData[i]=0; 
	 	FFT (tempData, signalData, NUMPOINTS);
    
        for(i=0;i<NUMPOINTS;i++)
	          tempData[i]=sqrt(signalData[i]*signalData[i]+
	                     tempData[i]*tempData[i]); 
	}

	//显示滤波后的信号或滤波器特性曲线
	PlotY (panelHandle, PANEL_FILTERGRAPH, tempData, NUMPOINTS/2,
		   VAL_DOUBLE, VAL_THIN_LINE, VAL_NO_POINT, VAL_SOLID, 1,
		   VAL_DK_GREEN);
			break;
		}
	return 0;
}

⌨️ 快捷键说明

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