在C中读取.WAV文件时遇到问题

在C中读取.WAV文件时遇到问题,c,matlab,audio,C,Matlab,Audio,我正在尝试读取一个5秒的.wav文件,其中充满了“静默”,以测试C语言中的代码。我能够读取头文件,但是,当尝试提取内容应该在哪里的日期字段(我认为应该是零)时,它会生成一些数字。根据下面的图片 这是我的C代码: #include <stdio.h> #include <stdlib.h> char buff[10000]; int main(){ int i; FILE * fp; FILE *flog; if ((fp = fope

我正在尝试读取一个5秒的.wav文件,其中充满了“静默”,以测试C语言中的代码。我能够读取头文件,但是,当尝试提取内容应该在哪里的日期字段(我认为应该是零)时,它会生成一些数字。根据下面的图片

这是我的C代码:

#include <stdio.h>
#include <stdlib.h>

char buff[10000];
int main(){

    int i;
    FILE * fp;
    FILE *flog;

    if ((fp = fopen("Silencio2.wav", "rb")) == NULL){
        printf("Fail!");
        exit(1);
    }


    fseek(fp, 44, 0); // read from 44 byte to the end.
    fread(buff,sizeof(int),1024,fp);
    flog = fopen("Silencio2.txt","w"); // make a log file to generate chart

    // print in hex to console and decimal to log file.
    for(i = 0; i < 5000 ; i++){
     printf("%i == %hhx \n",i,buff[i]);
     fprintf(flog,"%d\n",buff[i]);
     buff[i] = 0;
    }
    fclose(flog);
    return 0;
}
[Sile2,Fs] = audioread('Silencio2.wav');
title('Gerado pelo MATLAB');
subplot(2, 1, 2);
plot(CodeSile2);
title('Meu código');
subplot(2, 1, 1);
plot(Sile2);
剩下的问题是:我的结果一致吗?因为除了信号幅度的发散之外,还有一种噪声,我不知道如何解释它的原因。因为信号是通过静音发生器产生的


PS:是的,我知道libsnd,但我想如何在stm32/esp32中使用此代码制作嵌入式系统,库使用的越少越好。

如果数据是16位,为什么一次打印8位?你说你的数据是16位PCM,这意味着每个样本的大小是16位。您正在将数据读入
charbuff[10000]
并使用
buff[i]
打印它,buff[i]是一个字符或8位。您需要以不同的方式解释示例数据。OT:调用C库函数时,请始终检查返回值是否有任何错误指示。当发现错误指示时,然后输出到
stderr
,您的错误消息和系统认为发生错误的文本原因。函数:
perror()
很好地实现了以下功能:
fread(buff,sizeof(int),1024,fp)这读取的总字节数(在16位体系结构上)为2048字节。然而。这:
for(i=0;i<5000;i++){
正在尝试处理5000个字节。因此,从字节2049到5000的所有内容都是垃圾,不是有效的声音数据。此:
16khz
表示每秒16k个样本,因此仅读取前1024个样本仅为可用声音数据的1/16秒。如果数据是16位,为什么每次打印8位?您说您的数据是s 16位PCM,表示每个样本的大小为16位。您正在将数据读入
char buff[10000];
并使用
buff[i]打印它
是字符或8位。您需要以不同的方式解释示例数据。OT:调用C库函数时,始终检查返回值是否有任何错误指示。找到错误指示后,将错误消息和系统认为发生错误的文本原因输出到
stderr
。函数:
perror()
在以下方面做得很好:
fread(buff,sizeof(int),1024,fp);
这读取的总字节数(在16位体系结构上)为2048字节。然而,这:
用于(i=0;i<5000;i++){
正在尝试处理5000个字节。因此,从字节2049到5000的所有内容都是垃圾,不是有效的声音数据。此:
16khz
表示每秒16k个样本,因此仅读取前1024个样本仅为可用声音数据的1/16秒