c语言读取wav音频文件输出浮点内容
时间: 2023-12-08 21:53:58 浏览: 78
您可以使用c语言的文件操作函数(如fopen、fread等)来读取wav音频文件,然后解析wav文件头,根据文件头中的信息,读取音频数据。读取的数据是二进制的,需要根据文件头中的采样位数等信息,进行相应的转换,才能得到最终的浮点数值。以下是一个简单的示例代码:
```c
#include <stdio.h>
#include <stdint.h>
typedef struct {
char chunkID[4];
uint32_t chunkSize;
char format[4];
char subchunk1ID[4];
uint32_t subchunk1Size;
uint16_t audioFormat;
uint16_t numChannels;
uint32_t sampleRate;
uint32_t byteRate;
uint16_t blockAlign;
uint16_t bitsPerSample;
char subchunk2ID[4];
uint32_t subchunk2Size;
} WavHeader;
int main () {
FILE *fp;
WavHeader header;
fp = fopen("test.wav", "rb");
if (fp == NULL) {
printf("Failed to open file\n");
return -1;
}
// read wav header
fread(&header, sizeof(WavHeader), 1, fp);
// validate wav header
if (header.chunkID[0] != 'R' || header.chunkID[1] != 'I' ||
header.chunkID[2] != 'F' || header.chunkID[3] != 'F' ||
header.format[0] != 'W' || header.format[1] != 'A' ||
header.format[2] != 'V' || header.format[3] != 'E' ||
header.subchunk1ID[0] != 'f' || header.subchunk1ID[1] != 'm' ||
header.subchunk1ID[2] != 't' || header.subchunk1ID[3] != ' ' ||
header.subchunk2ID[0] != 'd' || header.subchunk2ID[1] != 'a' ||
header.subchunk2ID[2] != 't' || header.subchunk2ID[3] != 'a') {
printf("Invalid wav file\n");
fclose(fp);
return -1;
}
// read audio data
int numSamples = header.subchunk2Size / (header.bitsPerSample / 8);
float *audioData = (float*) malloc(sizeof(float) * numSamples);
int16_t sampleValue;
for (int i = 0; i < numSamples; i++) {
fread(&sampleValue, header.bitsPerSample / 8, 1, fp);
audioData[i] = (float)sampleValue / ((1 << (header.bitsPerSample - 1)) - 1);
}
// print audio data
for (int i = 0; i < numSamples; i++) {
printf("%f\n", audioData[i]);
}
fclose(fp);
free(audioData);
return 0;
}
```
需要注意的是,上述代码针对的是16位采样位数的wav文件,如果采样位数不同,读取数据的方式也需要相应修改。另外,为了简化代码,我们使用了动态内存分配来存储音频数据,实际应用中需要根据具体情况来选择合适的存储方式。
阅读全文