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