2013-02-14 2 views
-1

Как интерпретировать 32-битные данные wat-float? Я читаю данные wav как I32, а затем разделяю его на 2^31, но не получаю правильный результат.Как интерпретировать 32-битные данные wat-float

+4

Являются ли данные в файлах фактически 32-битными поплавками? Если это так, чтение его как int32 явно не сработает. –

+0

Данные wav могут быть закодированы как большие эндианты или малоконечные. Возможно, вам придется сначала поменять байты. – 2013-02-14 22:46:06

+0

Сначала определите правильный результат. –

ответ

2

Значения плавают. Вы должны назначить их значениям float и использовать их как таковые. Если вы читаете значения float в значениях int32, вы делаете эквивалент reinterpret_cast.

float f1 = 1.0e5; 
int i1 = *reinterpret_cast<int*>(&f1); 
// i1 = 1203982336, not 100000 

, если вы не можете избежать неправильного значения, то, чтобы получить «правильное» значение обратно, вам нужно обратить Реинтерпретация

float f2 = *reinterpret_cast<float*>(&i1); 
// f2 = 1.0e5 

порядок байт данных может все еще должны быть скорректированы.

2

Посмотрите на ваш RIFF header. Это скажет вам утверждение файла Wav.

Используйте этот конец, чтобы правильно читать ваши 32-битные поплавки. Например: если ваша система немногочисленна (скажем, на основе процессора x86), а ваш wav-файл является большим endian (скажем, созданным на старом PPC mac), вам нужно будет сделать 32-bit endian swap после того, как вы прочитаете данные. что ваша переменная float фактически содержит данные, которые имеют смысл (обычно это значение между -1.0f и 1.0f)

+0

Спасибо всем! Чтение данных как поплавок решило проблему. Данные были сохранены как 32-битное float, поэтому чтение его как int действительно не имело смысла. –

Смежные вопросы