2013-05-14 1 views
0

Почему я получаю NAN значение при попытке прочитать .wav-файл и непосредственно сохранить его данные образца в double? Прежде чем подумать об использовании этого, я сохранил данные образца в smallint, а затем преобразует его в двойное, разделив его на 32768.0 (нет значения NAN), но позже у меня возникла проблема с округлением при обратном преобразовании wav-файл.Почему я получаю значение NAN при сохранении результата mmioRead в double?

SetLength(buf, ckiData.cksize); 
mmioRead(HMMIO, PAnsiChar(buf), ckiData.cksize); 

Где buf являются массивами двойных. Разве это не позволяло напрямую хранить его в виде массива двойных?

+0

Почему вы используете плавающие точки для обработки образцов аудио? –

ответ

1

Если исходные данные образцы действительно 64-битных двойники (то, что формат аудио вы используете, что делает это?), То да, вы можете сразу прочитать в массив удваивается, например:

var 
    buf: array of Double; 

SetLength(buf, ckiData.cksize div SizeOf(Double)); 
mmioRead(HMMIO, PAnsiChar(buf), Length(buf) * SizeOf(Double)); 

Тем не менее, большинство аудиоформатов не используют удвоения, поэтому сначала вы должны прочитать подходящий буфер с использованием правильного типа данных (например, Smallint для 16-битного PCM), а затем конвертировать образцы.

+0

Да, это wav-файл. Я вижу тогда, тогда это означает, что если я делаю процесс дважды в конце, когда записываю его обратно в wav, мне нужно снова его округлить. Значит, это может стать причиной потери точности? –

+0

Возможно. Зачем вы обрабатываете аудио как парные для начала? –

+0

Я делаю водяные знаки -> DWT (Haar), если я трансформируюсь в smallint, я теряю точность. Может быть, мне все равно не поможет, я должен сделать водяной знак без потерь, но из-за этого результат может пропустить 1 или 2 бит. но nvm, может быть, мне нужен метод для поддержки этой проблемы, так или иначе мне просто интересно. –