虚拟仪器实验指导二.docx

上传人:b****7 文档编号:26189909 上传时间:2023-06-17 格式:DOCX 页数:20 大小:206.92KB
下载 相关 举报
虚拟仪器实验指导二.docx_第1页
第1页 / 共20页
虚拟仪器实验指导二.docx_第2页
第2页 / 共20页
虚拟仪器实验指导二.docx_第3页
第3页 / 共20页
虚拟仪器实验指导二.docx_第4页
第4页 / 共20页
虚拟仪器实验指导二.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

虚拟仪器实验指导二.docx

《虚拟仪器实验指导二.docx》由会员分享,可在线阅读,更多相关《虚拟仪器实验指导二.docx(20页珍藏版)》请在冰豆网上搜索。

虚拟仪器实验指导二.docx

虚拟仪器实验指导二

实验二

1.任务

编写一个函数发生器,要求:

能够通过用户界面选择产生正弦波、三角波、锯齿波、方波等函数波形

用曲线图控件绘制用户选择的波形。

2.实验步骤

步骤1:

根据要实现的功能,设计如图2-1所示的用户界面,其具体控件属性设置如表2-1所示。

图2-1最终用户界面

 

表2-1主要控件的基本属性列表

控件类型

ConstantName

属性设置

面板

Panel

PANEL

命令按钮

CommandButton

QUITBUTTON

CallbackFunction

QuitCallback

Lable

__Quit

曲线图控件

Graph

GRAPH1

Control

Mode

Indicator

DataMode

Retain

Lable

波形显示

 

下拉列表控件

Ring

 

WAVEFORM

CallbackFunction

WaveFormChooseCB

Label

波形选择

 

Label/Value

Pairs

Label

Value

0

Label

正弦波

Value

1

Label

三角波

Value

2

Label

锯齿波

Value

3

Label

方波

Value

4

步骤2:

生成代码框架。

选择Code→Generate→AllCode,生成代码框架,接着添加自定义函数show_wave进行显示。

/*下拉列表控件“波形选择”对应的回调函数*/

intCVICALLBACKWaveFormChooseCB(intpanel,intcontrol,intevent,

void*callbackData,inteventData1,inteventData2)

{

switch(event)

{

caseEVENT_COMMIT:

show_wave();

break;

}

return0;

}

然后,在函数show_wave内添加如下代码。

voidshow_wave(void)

{

intPOINTS=200;

intwaveForm;/*波形选择变量*/

doubleample=5.0;/*幅度*/

doublephase=0.0,waveData[POINTS];/*相位和波形数据变量*/

doublesampleRate=10000.0,freq=100.0;/*采样率和频率变量*/

GetCtrlVal(panelHandle,PANEL_WAVEFORM,&waveForm);

switch(waveForm)

{

case0:

/*无波形*/

DeleteGraphPlot(panelHandle,PANEL_GRAPH1,-1,VAL_IMMEDIATE_DRAW);/*清除所画曲线*/

break;

case1:

/*正弦波*/

SineWave(POINTS,ample,freq/sampleRate,&phase,waveData);

break;

case2:

/*三角波*/

TriangleWave(POINTS,ample,freq/sampleRate,&phase,waveData);

break;

case3:

/*锯齿波*/

SawtoothWave(POINTS,ample,freq/sampleRate,&phase,waveData);

break;

case4:

/*方波*/

SquareWave(POINTS,ample,freq/sampleRate,&phase,50.0,waveData);

break;

}

if(waveForm)/*先判断是否选择了波形*/

{

DeleteGraphPlot(panelHandle,PANEL_GRAPH1,-1,VAL_IMMEDIATE_DRAW);

PlotWaveform(panelHandle,PANEL_GRAPH1,waveData,POINTS,VAL_DOUBLE,1.0,0.0,0.0,1.0/sampleRate,VAL_THIN_LINE,VAL_EMPTY_SQUARE,VAL_SOLID,1,VAL_RED);/*画出波形*/

}

}

代码中的函数意义及调用方法如下

(1)函数DeleteGraphPlot清除所画曲线,调用路径为:

Library→UerInterfaceLibrary→Controls/Graphs/StripCharts….→GraphsandStirpCharts→DeleteGraphPlot

其参数设置见图2-2。

(2)函数SineWave,TriangleWave,SawtoothWave,SquareWave分别为正弦波,三角波,锯齿波和方波生成函数。

它们都在Library→AdvancedAnalysisLibrary→SignalGeneration目录下获得,其参数设置如图2-3~2-6所示。

(3)函数PlotWaveform,画曲线图函数,调用路径为:

Library→UerInterfaceLibrary→Controls/Graphs/StripCharts….→GraphsandStirpCharts→PlotWaveform,

其参数设置见图2-7。

图2-2DeleteGraphPlot函数面板

图2-3正弦波生成函数面板

图2-4三角波生成函数面板

图2-5锯齿波生成函数面板

图2-6方波生成函数面板

图2-7PlotWaveform函数面板

步骤3:

运行程序。

选择Run→Debugex1_dbg.exe。

 

选做:

任务:

波形的频率幅度可调;

用曲线图控件绘制波形频谱。

步骤1:

根据功能需要,我们添加一曲线图控件和两数值控件,其具体设置如表2-2所示。

表2-2添加控件的基本属性列表

控件类型

ConstantName

属性设置

曲线图控件

Graph

GRAPH2

Control

Mode

Indicator

DataMode

Retain

Lable

频谱显示

 

数值控件

Numeric

AMPLE

CallbackFunction

ChangeAmpleCB

Lable

幅度

FREQ

CallbackFunction

ChangeFreqCB

Lable

频率

最终界面如图2-8所示。

图2-8最终用户界面

完成用户界面后,编写回调函数ChangeAmpleCB和ChangeFreqCB,注意把其事件改为EVENT_VAL_CHANGED,其代码如下。

/*数值控件AMPLE对应的回调函数*/

intCVICALLBACKChangeAmpleCB(intpanel,intcontrol,intevent,

void*callbackData,inteventData1,inteventData2)

{

switch(event)

{

caseEVENT_VAL_CHANGED:

/*事件不是EVENT_COMMIT*/

show_wave();

break;

}

return0;

}

/*数值控件FREQ对应的回调函数*/

intCVICALLBACKChangeFreqCB(intpanel,intcontrol,intevent,

void*callbackData,inteventData1,inteventData2)

{

switch(event)

{

caseEVENT_VAL_CHANGED:

show_wave();

break;

}

return0;

}

然后还需要对show_wave函数作如下改动:

voidshow_wave(void)

{

intwaveForm;

doubleample;

doublephase=0.0,waveData[POINTS],filterData[POINTS],specData[POINTS];

doublesampleRate=10000.0,freq;

doublecutoff_freq=3000.0;/*设置截止频率*/

GetCtrlVal(panelHandle,PANEL_WAVEFORM,&waveForm);

GetCtrlVal(panelHandle,PANEL_AMPLE,&le);/*获得幅度值*/

GetCtrlVal(panelHandle,PANEL_FREQ,&freq);/*获得频率值*/

switch(waveForm)

{

case0:

DeleteGraphPlot(panelHandle,PANEL_GRAPH1,-1,VAL_IMMEDIATE_DRAW);

break;

case1:

SineWave(POINTS,ample,freq/sampleRate,&phase,waveData);

break;

case2:

TriangleWave(POINTS,ample,freq/sampleRate,&phase,waveData);

break;

case3:

SawtoothWave(POINTS,ample,freq/sampleRate,&phase,waveData);

break;

case4:

SquareWave(POINTS,ample,freq/sampleRate,&phase,50.0,waveData);

break;

}

if(waveForm)

{

DeleteGraphPlot(panelHandle,PANEL_GRAPH1,-1,VAL_IMMEDIATE_DRAW);

PlotWaveform(panelHandle,PANEL_GRAPH1,waveData,POINTS,VAL_DOUBLE,1.0,0.0,0.0,1.0/sampleRate,VAL_THIN_LINE,VAL_EMPTY_SQUARE,VAL_SOLID,1,VAL_RED);

Bw_LPF(waveData,POINTS,sampleRate,cutoff_freq,5,filterData);/*低通滤波*/

Copy1D(filterData,POINTS,specData);/*复制数据*/

Spectrum(specData,POINTS);/*进行功率谱分析*/

DeleteGraphPlot(panelHandle,PANEL_GRAPH2,-1,VAL_IMMEDIATE_DRAW);

PlotWaveform(panelHandle,PANEL_GRAPH2,specData,POINTS,VAL_DOUBLE,1.0,0.0,0.0,sampleRate/POINTS,VAL_THIN_LINE,VAL_EMPTY_SQUARE,VAL_SOLID,1,VAL_RED);/*画出信号的功率谱*/

}

}

上面代码中的函数意义及调用方法如下

(1)函数Bw_LPF

巴特沃兹低通滤波器函数,其调用路径为:

Library→AdvancedAnalysisLibrary→SignalProcessing→IIRDigitalFilters→One-stepFiltersFunctions→LowpassButterworth,其参数设置见图2-8。

(2)函数Copy1D

数组拷贝函数,其调用路径为:

Library→AdvancedAnalysisLibrary→ArrayOperations→1DOperations,其参数设置见图2-9。

(3)函数Spectrum

功率谱函数,其调用路径为:

Library→AdvancedAnalysisLibrary→SignalProcessing→FrequencyDomain→PowerSpectrum,其参数设置见图2-10。

图2-8Bw_LPF函数面板

图2-9Copy1D函数面板

图2-10Spectrum函数面板

最后,保存并运行程序如下:

 

#include

#include

#include

#include"test.h"

staticintpanelHandle;

intmain(intargc,char*argv[])

{

if(InitCVIRTE(0,argv,0)==0)

return-1;/*outofmemory*/

if((panelHandle=LoadPanel(0,"test.uir",PANEL))<0)

return-1;

DisplayPanel(panelHandle);

RunUserInterface();

DiscardPanel(panelHandle);

return0;

}

intCVICALLBACKQuitCallback(intpanel,intcontrol,intevent,

void*callbackData,inteventData1,inteventData2)

{

switch(event)

{

caseEVENT_COMMIT:

QuitUserInterface(0);

break;

}

return0;

}

voidshow_wave(void)

{

intPOINTS=200;

intwaveForm;

doubleample;

doublephase=0.0,waveData[POINTS],filterData[POINTS],specData[POINTS];

doublesampleRate=10000.0,freq;

doublecutoff_freq=3000.0;/*设置截止频率*/

GetCtrlVal(panelHandle,PANEL_WAVEFORM,&waveForm);

GetCtrlVal(panelHandle,PANEL_AMPLE,&le);/*获得幅度值*/

GetCtrlVal(panelHandle,PANEL_FREQ,&freq);/*获得频率值*/

switch(waveForm)

{

case0:

DeleteGraphPlot(panelHandle,PANEL_GRAPH1,-1,VAL_IMMEDIATE_DRAW);

DeleteGraphPlot(panelHandle,PANEL_GRAPH2,-1,VAL_IMMEDIATE_DRAW);

break;

case1:

SineWave(POINTS,ample,freq/sampleRate,&phase,waveData);

break;

case2:

TriangleWave(POINTS,ample,freq/sampleRate,&phase,waveData);

break;

case3:

SawtoothWave(POINTS,ample,freq/sampleRate,&phase,waveData);

break;

case4:

SquareWave(POINTS,ample,freq/sampleRate,&phase,50.0,waveData);

break;

}

if(waveForm)

{

DeleteGraphPlot(panelHandle,PANEL_GRAPH1,-1,VAL_IMMEDIATE_DRAW);

PlotWaveform(panelHandle,PANEL_GRAPH1,waveData,POINTS,VAL_DOUBLE,1.0,0.0,0.0,1.0/sampleRate,VAL_THIN_LINE,VAL_EMPTY_SQUARE,VAL_SOLID,1,VAL_RED);

Bw_LPF(waveData,POINTS,sampleRate,cutoff_freq,5,filterData);/*低通滤波*/

Copy1D(filterData,POINTS,specData);/*复制数据*/

Spectrum(specData,POINTS);/*进行功率谱分析*/

DeleteGraphPlot(panelHandle,PANEL_GRAPH2,-1,VAL_IMMEDIATE_DRAW);

PlotWaveform(panelHandle,PANEL_GRAPH2,specData,POINTS,VAL_DOUBLE,1.0,0.0,0.0,sampleRate/POINTS,VAL_THIN_LINE,VAL_EMPTY_SQUARE,VAL_SOLID,1,VAL_RED);/*画出信号的功率谱*/

}

}

intCVICALLBACKWaveFormChooseCB(intpanel,intcontrol,intevent,

void*callbackData,inteventData1,inteventData2)

{

switch(event)

{

caseEVENT_COMMIT:

show_wave();

break;

}

return0;

}

intCVICALLBACKChangeAmpleCB(intpanel,intcontrol,intevent,

void*callbackData,inteventData1,inteventData2)

{

switch(event)

{

caseEVENT_VAL_CHANGED:

show_wave();

break;

}

return0;

}

intCVICALLBACKChangeFreqCB(intpanel,intcontrol,intevent,

void*callbackData,inteventData1,inteventData2)

{

switch(event)

{

caseEVENT_VAL_CHANGED:

show_wave();

break;

}

return0;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 化学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1