繁体   English   中英

读取Wav文件,输出错误

[英]Reading Wav Files, wrong output

我之前曾发布过一个类似的问题(以为最好重新开始,希望能对此有更多的意见)。 基本上,问题是我正在尝试从.wav文件中读取数据,但是输出与MatLab中的输出不同。

在C ++中,输出为:

-128

而在Matlab中:

0

输出是完全不同的,不仅是很小的差异,而且整个数据集是错误的,我似乎也不知道为什么。 我认为这可能与字节序有关,但我不确定。 这是有关.wav文件的头信息:

**** WAV FILE *****
Chunk IDRIFFN?
Chunk Size: 57934
Format: WAVEfmt 
Format: IDfmt 
FormatSize: 18
Format2: 1
Channel Num: 1
Sample Rate: 22050
Byte Rate: 22050
Align: 1
Bits Per Sample: 8

和代码:

file.read(this->chunkId,                                 4);
file.read(reinterpret_cast<char*>(&this->chunkSize),     4);
file.read(this->format,                                  4);

file.read(this->formatId,                                4);
file.read(reinterpret_cast<char*>(&this->formatSize),    4);
file.read(reinterpret_cast<char*>(&this->format2),       2);
file.read(reinterpret_cast<char*>(&this->numChannels),   2);
file.read(reinterpret_cast<char*>(&this->sampleRate),    4);
file.read(reinterpret_cast<char*>(&this->byteRate),      4);
file.read(reinterpret_cast<char*>(&this->align),         2);
file.read(reinterpret_cast<char*>(&this->bitsPerSample), 4);

char testing[4] = {0};
int testingSize = 0;

while(file.read(testing, 4) && (testing[0] != 'd' ||
                                testing[1] != 'a' ||
                                testing[2] != 't' ||
                                testing[3] != 'a'))
{

    file.read(reinterpret_cast<char*>(&testingSize), 4);
    file.seekg(testingSize, std::ios_base::cur);

}

this->dataId[0] = testing[0];
this->dataId[1] = testing[1];
this->dataId[2] = testing[2];
this->dataId[3] = testing[3];



file.read(reinterpret_cast<char*>(&this->dataSize),     4);

this->data = new char[this->dataSize];

file.read(data,this->dataSize);

cout << "**** WAV FILE *****" << endl;
cout << "Chunk ID" << this->chunkId << endl;
cout << "Chunk Size" << this->chunkSize << endl;
cout << "Format: " << this->format << endl;
cout << "Format ID" << this->formatId << endl;
cout << "FormatSize" << this->formatSize << endl;
cout << "Format2 " << this->format2 << endl;
cout << "Channel Num" << this->numChannels << endl;
cout << "Sample Rate" << this->sampleRate << endl;
cout << "Byte Rate" << this->byteRate << endl;
cout << "Align" << this->align << endl;
cout << "Bits Per Sample" << this->bitsPerSample << endl;
cout << "Size" << testingSize << endl;



for(unsigned i=0; (i < 20); i++){
    cout << (float) data[i] << endl;
}

return true;

谁能看到我要去哪里错了? 我已经尝试调试它,但是没有喜悦(我正在使用g ++进行编译)。 任何帮助将不胜感激:)对不起,我一直在问这个,现在真的很烦我!

谢谢

我相信WAV文件中的块必须与最近的WORD边界对齐。 如果在您解析的格式部分之后不在下一个单词边界,则您将不会进入while循环,并且您的代码将假定您在数据部分。

同样,如果您的任何块的字节数都是奇数个,您可能会遇到麻烦。

好,看一下看起来像转换错误的代码。 显然,您正在尝试输出二十个浮点数(每个浮点数由四个字节组成),但是实际输出的只是二十个字节,每个单字节转换为一个浮点数。 我想你可能想要这个

for(unsigned i=0; (i < 20); i++){
    cout << ((float*) data)[i] << endl;
}

换句话说,您将数据转换为浮点指针,然后应用索引。 不首先应用索引,然后再转换为浮点数。

我认为matlab中的值在-1到1之间进行了归一化,因此为了在c ++中获得相似的输出,您需要对其进行缩放。 以-32768至32767为范围的16位样本的示例,您希望将它们缩放到-1.0至1.0。 这样做的方法是除以32768.0(-32768 / 32768.0 == -1,32767 / 32768.0略小于1)。

for(unsigned i=0; (i < 20); i++){
    cout << ((float) data[i])/32768.0 << endl;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM