Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在c+;中读取.wav数据时出现意外输出+;_C++_File_Audio_Wav - Fatal编程技术网

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

C++ 在c+;中读取.wav数据时出现意外输出+;,c++,file,audio,wav,C++,File,Audio,Wav,我正在做一个非常简单的方法,但遇到了一些麻烦 我想读取.wav文件的数据。我只对前80个样品感兴趣,所以我要做的是下一个。 我使用fseek根据 然后我读入24位的块(我绝对确定.wav文件有24位的样本,因为我创建了它并检查了它) 这是我的密码: void WavData::leerTodo(char *fname){ double array[1000]; FILE* fp = fopen(fname,"rb"); fseek(fp, 44, SEEK_SET);

我正在做一个非常简单的方法,但遇到了一些麻烦

我想读取.wav文件的数据。我只对前80个样品感兴趣,所以我要做的是下一个。 我使用fseek根据

然后我读入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";
        }
    }
}
void WavData::leerTodo(char*fname){
双阵列[1000];
文件*fp=fopen(fname,“rb”);
fseek(fp,44,SEEK_SET);
if(fp){
fread(数组,sizeof(double),100,fp);
对于(int i=0;i24位)。wav文件有整数样本,而不是浮点(float/double)样本;Wave中的浮点IEEE样本通常有32或64位。只需将数据读入32位int;注意对齐、签名和endianess也必须匹配(Wave数据通常以2的补码格式签名)。或者,如注释中所述,将其导出到16位,以便在数据上轻松打包和对齐匹配

例如,Sound Foundry 6.0允许8位、16位、24位和32位整数采样以及32位和64位浮动IEEE采样;大多数专业音频应用程序在这里采用相同的方式,主要是因为硬件仅支持这些位分辨率

进一步阅读:

(未阅读格式):完全不同或精度不同?在您的平台上,
双精度
可能不是24位的…让我看看我是否理解。我将解释整个过程:我使用matlab生成了这个.wav文件(明确说明我希望每个样本24位)。如果我转到字节34(它是头的一部分,其中指定了每个样本的位数)读取它,我得到24(正如我所期望的)。我尝试了你所说的(读取32位int,有符号或无符号),但它不起作用(我得到的值非常高)。如果需要,我可以发布控制台屏幕截图,显示我得到的值,即使它们没有意义(至少对我来说)。Thanks@mPerezDsp我不喜欢MATLAB(我总是支持Mathematica和反对MATLAB的家伙),但您应该将MATLAB中的值导出为32位浮点或24位整数;我一生中都没有听说过在实践中使用24位浮点表示法。不过,为了便于处理,我还是坚持使用16位整数,因为它们在内存中更容易打包和对齐。另外,简单地比较一下t他使用十六进制查看器/计算器显式显示值,并检查您想要的内容和收到的内容;XVI32有一个漂亮的十六进制计算器,可立即显示不同基数(字节、字、整数、长整数、IEEE单精度、IEEE双精度)中的值“已解决”它会生成每个样本16位的.wav,并读取短类型的数据。无法使其在24位模式下工作。谢谢大家。@mPerezDsp如果信息对您有用并允许您解决问题,接受答案将非常受欢迎,因为它用于表示问题已解决,并奖励帮助别人。