Чтение волнового файла в подписанный массив float - PullRequest
0 голосов
/ 30 января 2019

С помощью следующего кода я могу прочитать волновой файл в массив с плавающей точкой.Однако отрицательная сторона волны заканчивается положительной стороной, поэтому: -MAX -> 0 и "-0" -> MAX.Я не могу понять, как это сделать правильно.Я понимаю, что длина заголовка волны может превышать 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++;
}

1 Ответ

0 голосов
/ 30 января 2019

Проблема в том, что вы используете unsigned для переменной tmp.Таким образом, у вас никогда не будет отрицательного значения в tmp, даже если образец отрицательный.Попробуйте это

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

Вам нужно #include <cstdint>, чтобы получить тип int16_t.

...