zoukankan      html  css  js  c++  java
  • C读取DAT,提取AD数据,转成WAV文件

     

     wav 文件格式参考资料:http://www.sonicspot.com/guide/wavefiles.html

    DAT数据格式 5A 5A 5A 5A xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ( 帧头 ) 帧头后面依次为第一块AD通道1数据(2 byte),第二块AD通道1数据(2 byte),第一块AD通道2数据(2 byte),第二块AD通道2数据(2 byte),.。。。。。。。。第一块AD通道6数据(2 byte),第二块AD通道6数据(2 byte)。我提取的是第一块AD通道6数据。然后进行转成16bit,然后-32768变成正负信号,因为AD采集的是0-5V信号,减去32768将其变成-2.5V~+2.5V。然后根据wav文件结构将其写入wav文件.

    代码
      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 
      4 #define SIZE 1000*1024
      5 
      6 typedef struct twav_header
      7 {
      8     // RIFF WAVE chunk, 12 bytes
      9     unsigned char RIFF[4];
     10     unsigned int  dwFilesize;
     11     unsigned char WAVE[4];
     12     
     13     // Format chunk, 24 bytes
     14     unsigned char fmt[4];
     15     unsigned int  dwChunksize;
     16     unsigned short wCompress;
     17     unsigned short wChannelnum;
     18     unsigned int   dwSamplerate;
     19     unsigned int   dwBytepersec;
     20     unsigned short wBlockAlign;
     21     unsigned short wBitsPerSample;
     22     
     23     // Data chunk, 8 bytes
     24     unsigned char data[4];
     25     unsigned int  dwDataSize;
     26 }wav_header;
     27 
     28 char riff[4= {'R','I','F','F'};
     29 char wav[4]  = {'W','A','V','E'};
     30 char fmt[4]  = {'f','m','t'0x20};
     31 char data[4= {'d','a','t','a'};
     32 
     33 int main()
     34 {
     35     wav_header wavhead;
     36     FILE *fp;
     37     FILE *fpout;
     38     char infile[10], outfile[10];
     39     unsigned char * pBuffer;
     40     unsigned short * pwBuffer;
     41     unsigned short * pw11Buffer;
     42     unsigned short * pwnormBuffer; // Normalized data buffer
     43     int i,cnt,channelno;
     44     
     45     pBuffer    = (unsigned char  *)malloc( SIZE     *sizeof(unsigned char) );
     46     memset(pBuffer, 0, SIZE);
     47     
     48     pwBuffer   = (unsigned short *)malloc( (SIZE/2 )*sizeof(unsigned short) );
     49     memset(pBuffer,    0, (SIZE/2 )*sizeof(unsigned short));
     50     
     51     pw11Buffer = (unsigned short *)malloc( (SIZE/12)*sizeof(unsigned short) );
     52     memset(pw11Buffer, 0, (SIZE/12)*sizeof(unsigned short));
     53     
     54     pwnormBuffer = (unsigned short *)malloc( (SIZE/12)*sizeof(unsigned short) );
     55     memset(pwnormBuffer, 0, (SIZE/12)*sizeof(unsigned short));
     56     
     57     puts("Input file name:");
     58     gets(infile);
     59     puts("Output file name:");
     60     gets(outfile);
     61     puts("Channel no(1-12):");
     62     scanf("%d"&channelno);
     63 
     64     if( (fp=fopen(infile, "rb")) == NULL )
     65     {
     66         printf("Cannot open file\n");
     67         return 0;
     68     }
     69     fseek(fp,0L,SEEK_SET);
     70     fread(pBuffer,1,SIZE,fp);
     71     
     72     // Convert 8 bit to 16 bit
     73     for(i=0; i<SIZE/2; i++)
     74         pwBuffer[i] = pBuffer[2*i]*256 + pBuffer[2*i+1];
     75     
     76     // Extract channel channelno data
     77     cnt = 0;
     78     for(i=0; i<SIZE/2; i++)
     79         if( (pwBuffer[i-1== 0x5A5A&& (pwBuffer[i] == 0x5A5A) )
     80             pw11Buffer[cnt++= pwBuffer[i + channelno];
     81 
     82     // Normalize the data, (data-32768)
     83     for(i=0; i<cnt; i++)
     84         pwnormBuffer[i] = pw11Buffer[i] - 32768;
     85         
     86     //for(i=0; i<10; i++)
     87     //    printf("%4X %4X\n", pw11Buffer[i], pwnormBuffer[i]);
     88     
     89     // Initialize the wav file header
     90     memcpy(wavhead.RIFF, riff, 4);
     91     wavhead.dwFilesize = cnt*2 + sizeof(wav_header) - 8;
     92     memcpy(wavhead.WAVE, wav , 4);
     93     memcpy(wavhead.fmt,  fmt , 4);
     94     wavhead.dwChunksize = 0x10;
     95     wavhead.wCompress = 1;
     96     wavhead.wChannelnum = 1;
     97     wavhead.dwSamplerate = 1000;
     98     wavhead.dwBytepersec = 2*1000;
     99     wavhead.wBlockAlign = 2;
    100     wavhead.wBitsPerSample = 16;
    101     memcpy(wavhead.data, data, 4);
    102     wavhead.dwDataSize = cnt*2;
    103     
    104     // Write the data into DAT file
    105     if( (fpout=fopen(outfile, "wb")) == NULL )
    106     {
    107         printf("Cannot open file\n");
    108         return 0;
    109     }
    110     
    111     fwrite(&wavhead, sizeof(wav_header), 1, fpout);
    112     fwrite(pwnormBuffer, sizeof(unsigned short), cnt, fpout);
    113     
    114     free(pBuffer); free(pwBuffer); free(pw11Buffer);
    115     system("pause");
    116 }
    117 
  • 相关阅读:
    软工实践寒假作业(1/2)
    javaSprintBoot技术总结
    个人作业——软件工程实践总结&个人技术博客
    个人作业软件评测
    结对第二次作业——某次疫情统计可视化的实现
    结对第一次—疫情统计可视化(原型设计)
    软工实践寒假作业(2/2)
    《软件工程》_寒假作业1_职业生涯规划
    部署前端项目和后端项目到服务器
    软件工程实践总结&个人技术博客
  • 原文地址:https://www.cnblogs.com/yanhc/p/1635828.html
Copyright © 2011-2022 走看看