在c ++中读取.wav数据时出现意外输出

时间:2014-07-30 12:22:12

标签: c++ file audio wav

我制作了一个非常简单的方法,但遇到了一些麻烦。

我想读取.wav文件的数据。我只对前80个样品感兴趣,所以我接下来要做的就是。 我根据使用fseek转到文件的字节44(数据开始的地方) https://ccrma.stanford.edu/courses/422/projects/WaveFormat/

然后我读了24位的块(我绝对确定.wav文件有24位的样本,因为我创建它+检查它)

这是我的代码:

void WavData::leerTodo(char *fname){
    double array[1000];
    FILE* fp = fopen(fname,"rb");
    fseek(fp, 44, SEEK_SET);
    if (fp) {
        fread(array,sizeof(double), 100, fp);
        for (int i = 0; i<100; i++) {
            cout<<"datos del .wav son es "<<array[i]<<"\n";
        }
    }
}

当我将结果与我从matlab获得的数据进行比较时,它与功率或300左右完全不同。我正在使用xcode。

1 个答案:

答案 0 :(得分:2)

24位.wav文件有整数样本,而不是浮点(浮点数/双精度);浮点IEEE波形中的样本通常为32或64位。只需将数据读入32位int;请注意,对齐,签名和字节顺序也必须匹配(Wave数据通常以两种补码格式签名)。或者,正如评论中所指出的,将其导出为16位,以便在数据上轻松打包和对齐匹配。

例如,Sound Foundry 6.0允许8,16,24和32位整数样本和32&amp; 64位浮动IEEE样本;大多数专业音频应用都遵循相同的路线,主要是因为硬件仅支持那些位分辨率。

进一步阅读: http://en.wikipedia.org/wiki/Audio_bit_depth