使用以下代码,我可以将wave文件读取到float数组中。但是,波的负端最终位于正端,因此:-MAX-> 0和“ -0”-> MAX。我不太了解如何正确执行此操作。我确实意识到wave的标头部分可能超过44个字节长,但是对于此应用程序将不会发生。我希望你们中的一个好人可以帮助我:-)

string filename;
getline(cin, filename);

ifstream wavFile(filename, ios::binary | ios::ate);

if (!wavFile)
    cout << "error reading file\n";

int size = wavFile.tellg();
wavArray = new unsigned char[size];
wavFile.seekg(0, ios::beg);
wavFile.read((char *)wavArray, size);
wavFile.close();


int j = 1;
for (int i = 0; i < 262; i++)
{
    unsigned int tmp = (wavArray[i + 44] | (wavArray[i + 45] << 8));
    printf("%d : %f \n", k, (tmp / 32768.0));
    j++;
    i++;
}

最佳答案

问题是您对tmp变量使用了无符号。因此,即使样本为负,您在tmp中也永远不会有负值。尝试这个

int16_t tmp = (wavArray[i + 44] | (wavArray[i + 45] << 8));


您应该#include <cstdint>以获取int16_t类型。

关于c++ - 将WAV文件读入签名的float数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54429892/

10-11 17:58