cpubbs论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

LabVIEW+单片机学习套件全套教程资料下载[免费]LabVIEW论坛精华列表贴USB0816数据采集卡《LabVIEW宝典》
LabWindows/CVI论坛精华贴NET0816以太网数据采集卡RC0210远程设备授权系统 关闭关停锁定打开设备 户外分布式数据采集
NET1624低速高精度以太网数据采集卡WIFI0824SD无线WIFI网络数据采集卡脱机运行 SD存储 小尺寸微型 串口采集远程采集 安卓 手持移动采集 纪录仪
查看: 2722|回复: 3

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

[复制链接]
发表于 2007-5-28 16:19:24 | 显示全部楼层 |阅读模式
附件程序是用声卡采集的数据再要进入滤波器进行滤波,可是变量设置有点问题,我用前面声卡显示用到的数组Pdata!
在滤波器那部分却说没有初始化!
我知道是怎么回事。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2007-5-29 18:51:00 | 显示全部楼层
你只是在AcquireData 回调函数中声明了啊,double *(pData)          ;  
你前面还定义了一个PBYTE pData;             //数据取指针(字节指针)  ,到底要用哪一个?
 楼主| 发表于 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;
}


面板没有修改!
麻烦你看看哈!
谢谢
发表于 2007-11-7 16:35:21 | 显示全部楼层

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

你好!
      请问waveInOpen 函数调用中参数是如何设置的?谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cpubbs论坛. ( 粤ICP备09171248号 )

GMT+8, 2025-4-22 11:07 , Processed in 0.807732 second(s), 8 queries , Gzip On, File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表