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