wav文件的读取,默认为双声道(若为单声道根据头文件中的参数做个判断即可),一个声道的一组数据为两个字节,所以左声道总数据数为dataSize(字节为单位)/4
#include <stdlib.h>
#include <stdio.h>
#include<malloc.h>
#include <math.h>
struct RIFF_HEADER
{
//RIFF_HEADER
unsigned char szRiffID[4]; // 'R','I','F','F'
unsigned long dwRiffSize;
unsigned char szRiffFormat[4]; // 'W','A','V','E'
// WAVE_FORMAT
}riff_header;
struct FMT_BLOCK
{
// FMT_BLOCK
unsigned char szFmtID[4]; // 'f','m','t',' '
unsigned long dwFmtSize;
// dwFmtSize为16则其后16字节,否则为18,末尾有2个字节的附加信息
unsigned short wFormatTag;
unsigned short wChannels;
unsigned long dwSamplesPerSec;
unsigned long dwAvgBytesPerSec;
unsigned short wBlockAlign;
unsigned short wBitsPerSample;
// unsigned short ultraMessage;
}fmt_block;
struct FACT_BLOCK
{
unsigned char szFactID[4]; // 'f','a','c','t'
unsigned long dwFactSize;
}fact_block;
struct DATA_BLOCK
{
// DATA_BLOCK
unsigned char szDataID[4]; // 'd','a','t','a'
unsigned long dwDataSize;
}data_block;
int main()
{
// int i; //用作循环计数
//unsigned char ch[ch_size]; //用来存储wav文件的头信息
FILE *fp;
const char* wav_path= "d:\\wavcs\\cat.wav";
fp=fopen(wav_path,"rb");//为读,打开一个wav文件
if((fp=fopen(wav_path,"rb"))==NULL) //若打开文件失败,退出
{
printf("can't open this file\n");
exit(0);
}
fread(&riff_header,sizeof(struct RIFF_HEADER),1,fp);
printf("riff_header\n");
printf("%10s%10x%10s",riff_header.szRiffID,riff_header.dwRiffSize,riff_header.szRiffFormat);
printf("\n");
fread(&fmt_block,sizeof(struct FMT_BLOCK),1,fp);
printf("fmt_block\n");
printf("%10s%10x%10x%10x\n%10x%10x%10x%10x",fmt_block.szFmtID,fmt_block.dwFmtSize,fmt_block.wFormatTag,fmt_block.wChannels,fmt_block.dwSamplesPerSec,fmt_block.dwAvgBytesPerSec,fmt_block.wBlockAlign,fmt_block.wBitsPerSample);
printf("\n");
fread(&data_block,sizeof(struct DATA_BLOCK),1,fp);
printf("data_block\n");
printf("%10s%10x",data_block.szDataID,data_block.dwDataSize);
printf("\n");
int data_size=data_block.dwDataSize/2;
printf("datasize%d\n",data_size);
short *datacontent=(short *)malloc(sizeof(short)*data_size);
fread(&datacontent,sizeof(short),data_size,fp);
printf("datacontent\n");
// 读取数据
// int m;//全数据输出的测试
// for(m=354303;m<354304;m++)
// {
// printf("datacount%d\n",m);
// float databyfloat=datacontent[m]/32768.0000;
// printf("%0.4f\n",databyfloat);
// };
int i=0;//取出右声道部分
int n=0;
int single_size=data_block.dwDataSize/4;
printf("singletracksize%d\n",single_size);
float *singletrackdata = (float *)malloc(single_size*sizeof(float));
for(;i <data_size;i++) {//取出左声道部分数据放入数组singletrackdata
if(i%2 == 0) {
singletrackdata[n] = datacontent[i]/32768.0000;
//printf("singletrackdata%d\n",n+1);
//printf("%0.4f\n",singletrackdata[n]);
n++;
}
}
// int m;//单声道数据输出的测试
// for(m=354301;m<354304;m++)
// {
// printf("datacount%d\n",m);
// float databyfloat=singletrackdata[m];
// printf("%0.4f\n",databyfloat);
// };