⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sound.txt

📁 虚拟仪器 声卡采集 信号一些低通滤波处理
💻 TXT
字号:
#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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -