wsjhhlj 发表于 2007-5-28 16:19:24

麻烦大家进来看看,CVI编程有的问题

附件程序是用声卡采集的数据再要进入滤波器进行滤波,可是变量设置有点问题,我用前面声卡显示用到的数组Pdata!
在滤波器那部分却说没有初始化!
我知道是怎么回事。

sunshuai03 发表于 2007-5-29 18:51:00

你只是在AcquireData 回调函数中声明了啊,double *(pData)          ;
你前面还定义了一个PBYTE pData;             //数据取指针(字节指针),到底要用哪一个?

wsjhhlj 发表于 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;
double y;
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;      //波形函数返回代码字符串
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;
    doubleripple,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;
}


面板没有修改!
麻烦你看看哈!
谢谢

xuxinsheng 发表于 2007-11-7 16:35:21

关于Labwindows中的waveInOpen()函数调用

你好!
      请问waveInOpen 函数调用中参数是如何设置的?谢谢
页: [1]
查看完整版本: 麻烦大家进来看看,CVI编程有的问题