|

楼主 |
发表于 2007-5-29 18:54:32
|
显示全部楼层
回复 #2 sunshuai03 的帖子
我把程序改了下!将double *pData
但是运行是说滤波器函数返回值不对啊!
程序如下:
#include <cvirte.h>
#include <userint.h>
#include "sound.h"
#include<analysis.h>
#include<windows.h>
#include<Mmsystem.h>
#include <ansi_c.h>
static int panelHandle;
double DataT;
double x[20000];
double y[20000];
UINT Time;
static int typenn;
int num,status;
IIRFilterPtr filter_information;
HWAVEIN hwi; //设备句柄
WAVEFORMATEX wfx; //波形格式结构
PWAVEHDR pwhr1; //波形缓冲区头指针
double *pDataBuffer1; //缓冲区地址指针
UINT len=1024; //缓冲区长度
double *pData; //数据取指针(字节指针)
UINT DevNum; //设备编号
MMRESULT rult; //波形函数返回结构
char szText[100]; //波形函数返回代码字符串
WAVEINCAPS wavecap; //波形设备性能结构
UINT Time; //显示时间
void CALLBACK WaveInProc(HWAVEIN hwi,UINT uMsg,DWORD dwUser,DWORD dw1,DWORD dw2); //声明波形中断函数
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "sound.uir", PANEL)) < 0)
return -1;
DisplayPanel (panelHandle);
RunUserInterface ();
DiscardPanel (panelHandle);
return 0;
}
void CALLBACK WaveInProc(HWAVEIN hwi,UINT uMsg,DWORD dwUser,DWORD dw1,DWORD dw2)
{ //波形输入回调函数
switch(uMsg)
{
case WIM_OPEN: //波形输入设备启动成功发回的消息
break;
case WIM_DATA: //一个缓冲区以满发回的消息
pData=pDataBuffer1;
PlotStripChart(panelHandle,PANEL_STRIPCHART,pData,127,0,7,VAL_UNSIGNED_CHAR);
rult=waveInPrepareHeader(hwi,pwhr1,sizeof(WAVEHDR));
//准备缓冲
rult=waveInAddBuffer(hwi,pwhr1,sizeof(WAVEHDR));
//使用缓冲区开始新的采集
Time++;
break;
case WIM_CLOSE: //波形输入设备关闭成功发回的消息
break;
}
SetCtrlVal(panelHandle,PANEL_TIME,Time*0.1);
}
int CVICALLBACK pancall (int panel, int event, void *callbackData,
int eventData1, int eventData2)
{
switch (event)
{
case EVENT_GOT_FOCUS:
break;
case EVENT_LOST_FOCUS:
break;
case EVENT_CLOSE:
break;
}
return 0;
}
int CVICALLBACK start (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{ int i=0;
switch (event)
{
case EVENT_COMMIT:
/*************声卡初始化***********/
//rult=waveInGetDevCaps(WAVE_MAPPER,&wavecap,sizeof(wavecap));
//查看声卡支持的格式
/***********波形格式设置**********/
wfx.wFormatTag=WAVE_FORMAT_1M08;
wfx.nChannels=1;
wfx.wBitsPerSample=8;
wfx.nSamplesPerSec=11025; //采样频率
wfx.nAvgBytesPerSec=11025; //每秒吞吐量(字节)
wfx.nBlockAlign=1; //对齐格式(字节)
wfx.cbSize=0;
//DevNum=waveInGetNumDevs();
rult=waveInOpen(&hwi,WAVE_MAPPER,&wfx,(DWORD)(&WaveInProc),(DWORD)
(&DataT),CALLBACK_FUNCTION); //打开波形输入设备
if(rult>0)
{//打开波形输入设备有错误
rult=waveInGetErrorText(rult,(LPSTR)(&szText),100); //获得错误代码
MessagePopup("打开波形输入设备错误!",szText); //提示错误
return -1; //返回
}
pwhr1=GlobalAlloc(GPTR,sizeof(WAVEHDR)); //开辟缓冲区头
pDataBuffer1=GlobalAlloc(GHND,len); //开辟缓冲区
pDataBuffer1=GlobalLock(pDataBuffer1); //锁定缓冲区
pwhr1->lpData=(LPSTR)(pDataBuffer1); //缓冲区指针
pwhr1->dwBufferLength=len; //缓冲区长度
pwhr1->dwFlags=0; //标志
pwhr1->dwBytesRecorded=0; //记录长度
rult=waveInPrepareHeader(hwi,pwhr1,sizeof(WAVEHDR)); //准备缓冲区
rult=waveInAddBuffer(hwi,pwhr1,sizeof(WAVEHDR)); //使用缓冲区
rult=waveInStart(hwi); //开始进行采集
break;
}
return 0;
}
int CVICALLBACK stop (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
rult=waveInStop(hwi); // 停止波形输入
rult=waveInClose(hwi); //关闭波形输入设备
GlobalUnlock(pDataBuffer1); //解除缓冲区锁定
GlobalFree(pDataBuffer1); //释放缓冲区
GlobalFree(pwhr1); //释放缓冲区头
break;
}
return 0;
}
int CVICALLBACK Filtertype (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
//选择滤波器类型
GetCtrlVal (panelHandle, PANEL_RING, &status);
switch (status)
{
case 0:
typenn=0;
//巴特沃斯滤波器
break;
case 1:
typenn=1;
//切比雪 滤波器
break;
case 2:
typenn=2;
//椭圆滤波器
break;
}
break;
case EVENT_RIGHT_CLICK:
break;
}
return 0;
}
int CVICALLBACK AcquireData (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int order=5 ;
double ripple,attenuation,samplefrequency,cutofffrequency ;
int n=127 ;
ripple=5,attenuation=10;
// 定义数组,x表示滤波前数组,y表示滤波后数组 (前面定义)
pData=pDataBuffer1;
switch (event)
{
case EVENT_COMMIT:
//获取滤波器截止频率
GetCtrlVal (PANEL, PANEL_NUMERIC, &cutofffrequency);
//获取采样频率
GetCtrlVal (PANEL, PANEL_NUMERIC_2, &samplefrequency);
if (typenn==0)
{
//巴特沃斯低通滤波
Bw_LPF(pData,0,samplefrequency,cutofffrequency,order,y);
}
if(typenn==1)
//切比雪夫低通滤波器
{
Ch_LPF(pData,1,samplefrequency,cutofffrequency,ripple,order,y);
}
if (typenn==2)
{
Elp_LPF(pData,2,samplefrequency,cutofffrequency,ripple,attenuation,order,y);
}
DeleteGraphPlot(panelHandle,PANEL_GRAPH,-1,VAL_DELAYED_DRAW);
PlotY(panelHandle,PANEL_GRAPH,y,n,VAL_DOUBLE,VAL_THIN_LINE,VAL_EMPTY_SQUARE,VAL_SOLID,1,VAL_BLACK);
break;
case EVENT_RIGHT_CLICK:
break;
}
return 0;
}
int CVICALLBACK quit (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
QuitUserInterface (0);
break;
}
return 0;
}
面板没有修改!
麻烦你看看哈!
谢谢 |
|