c语言读取wav音频文件输出浮点内容
时间: 2023-12-08 11:51:25 浏览: 101
C读取wav文件
您可以使用wav文件的头部信息来读取音频数据,并将其转换为浮点数,具体代码示例如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct
{
char chunk_id[4];
int chunk_size;
char format[4];
char subchunk1_id[4];
int subchunk1_size;
short int audio_format;
short int num_channels;
int sample_rate;
int byte_rate;
short int block_align;
short int bits_per_sample;
char subchunk2_id[4];
int subchunk2_size;
} WavHeader;
float* readWavFile(char* filename, int* num_samples)
{
WavHeader header;
FILE* fp = fopen(filename, "rb");
if (fp == NULL) {
printf("Error: could not open file %s\n", filename);
exit(-1);
}
fread(&header, sizeof(WavHeader), 1, fp);
if (header.audio_format != 1) {
printf("Error: only PCM format is supported\n");
exit(-1);
}
if (header.bits_per_sample != 16) {
printf("Error: only 16-bit sample size is supported\n");
exit(-1);
}
*num_samples = header.subchunk2_size / 2;
float* data = (float*)malloc(*num_samples * sizeof(float));
short int buffer;
for (int i = 0; i < *num_samples; i++) {
fread(&buffer, sizeof(buffer), 1, fp);
data[i] = buffer * (1.0 / 32768.0); // convert to float in [-1, 1]
}
fclose(fp);
return data;
}
int main()
{
char* filename = "audio.wav";
int num_samples;
float* data = readWavFile(filename, &num_samples);
// do something with data...
printf("Read %d samples from %s\n", num_samples, filename);
free(data);
return 0;
}
```
在上面的示例中,我们定义了一个`WavHeader`结构体来存储WAV文件的头部信息。然后,我们打开文件,读取头部信息,并检查音频格式是否为PCM格式,采样大小是否为16位。接下来,我们计算音频采样的数量,并分配相应大小的浮点数数组来存储音频数据。最后,我们遍历音频数据并将每个采样值转换为浮点数。
请注意,上面的代码示例只支持单声道、16位PCM格式的WAV文件。如果您需要支持其他格式的音频文件,请根据相关文档自行修改代码。
阅读全文