将波形文件读入带符号的浮点数组
Reading a wavefile into a signed float array
使用以下代码,我可以将 wave-file 读入浮点数组。然而,波的负端最终成为正端,因此:-MAX -> 0 和“-0”-> MAX。我不太清楚如何正确地做到这一点。我确实意识到 wave 的 header 部分可能超过 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
变量使用了 unsigned。所以你永远不会在 tmp
中有一个负值,即使样本是负数。试试这个
int16_t tmp = (wavArray[i + 44] | (wavArray[i + 45] << 8));
您应该 #include <cstdint>
获得 int16_t
类型。
使用以下代码,我可以将 wave-file 读入浮点数组。然而,波的负端最终成为正端,因此:-MAX -> 0 和“-0”-> MAX。我不太清楚如何正确地做到这一点。我确实意识到 wave 的 header 部分可能超过 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
变量使用了 unsigned。所以你永远不会在 tmp
中有一个负值,即使样本是负数。试试这个
int16_t tmp = (wavArray[i + 44] | (wavArray[i + 45] << 8));
您应该 #include <cstdint>
获得 int16_t
类型。