DSP

读取wav音频

2019-07-13 20:14发布

wav音频格式是微软的制定的一种文件格式,其结构非常简单音频存储格式。为了为接下来学习DSP做准备,我今天查了一些关于读取wav文件的资料,现将其总结与此,并编程实现(代码部分参考了网络上一些代码,修改了其中一些错误之处)。下图是我绘制的wav文件格式结构图:       代码如下:   struct ret_value
{
    char *data;
    unsigned long size;     ret_value()
   {
       data = 0;
       size = 0;
   }
};   void load_wave_file(char *fname, struct ret_value *ret)
{
    FILE *fp;     fp = fopen(fname,"rb");
    if (fp)
    {
        char id[5];          // 5个字节存储空间存储'RIFF'和'/0',这个是为方便利用strcmp
        unsigned long size;  // 存储文件大小
        short format_tag, channels, block_align, bits_per_sample;    // 16位数据
        unsigned long format_length, sample_rate, avg_bytes_sec, data_size; // 32位数据         fread(id, sizeof(char), 4, fp); // 读取'RIFF'
        id[4] = '/0';
  
        if (!strcmp(id, "RIFF"))
        {
            fread(&size, sizeof(unsigned long), 1, fp); // 读取文件大小
            fread(id, sizeof(char), 4, fp);         // 读取'WAVE'
            id[4] = '/0';
            if (!strcmp(id,"WAVE"))
            {
                fread(id, sizeof(char), 4, fp);     // 读取4字节 "fmt ";
                fread(&format_length, sizeof(unsigned long),1,fp);
                fread(&format_tag, sizeof(short), 1, fp); // 读取文件tag
                fread(&channels, sizeof(short),1,fp);    // 读取通道数目
                fread(&sample_rate, sizeof(unsigned long), 1, fp);   // 读取采样率大小
                fread(&avg_bytes_sec, sizeof(unsigned long), 1, fp); // 读取每秒数据量
                fread(&block_align, sizeof(short), 1, fp);     // 读取块对齐
                fread(&bits_per_sample, sizeof(short), 1, fp);       // 读取每一样本大小
                fread(id, sizeof(char), 4, fp);                      // 读入'data'
                fread(&data_size, sizeof(unsigned long), 1, fp);     // 读取数据大小
                ret->size = data_size;
                ret->data = (char *) malloc(sizeof(char)*data_size); // 申请内存空间
                fread(ret->data, sizeof(char), data_size, fp);       // 读取数据             }
            else
           {
                printf("Error: RIFF file but not a wave file/n");
           }
        }
        else
       {
            printf("Error: not a RIFF file/n");
       }
    }
} 下图是利用CImg绘制的信号图形:     这个代码我没有给出,可以参考1D FFT的那个例子。