读取wav音频

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的那个例子。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值