Странный пост :) Т.е. нет, все вроде правильно! За исключением того, что канонически правильный подход такой - encode = int(f * 255 + 0.5), decode = b / 255.
encode делает разные интервалы, ужимая в два раза краевые точки - это как раз никому нахрен не нужно.
А вот и более другой тест: http://www.everfall.com/paste/id.php?z14ea7ntlmj4 Важные качества: - f2b(b2f(i)) == i - ошибка от b2f(f2b(i)) минимизируется - это собственно и важно при квантизации! - влияние шума минимизируется - endpoints сохраняются (кстати, бывает важно чтобы сохранялись не только endpoints - например, чтобы 0.5 без погрешности кодировалось в 128 - тогда надо брать умножение на 256).
Для пары *255+0.5 и /255 значения такие: encode/decode error: 1.268933 noise threshold: 0.001961
Для пары *255.999f и /255 значения такие: encode/decode error: 2.530851 noise threshold: 0.000016
Итого, как по мне - *256 (НЕ *255.9999) если надо сохранить 0.5, и *255+0.5 во ВСЕХ остальных случаях.
Т.е. нет, все вроде правильно!
За исключением того, что канонически правильный подход такой - encode = int(f * 255 + 0.5), decode = b / 255.
encode делает разные интервалы, ужимая в два раза краевые точки - это как раз никому нахрен не нужно.
А вот и более другой тест: http://www.everfall.com/paste/id.php?z14ea7ntlmj4
Важные качества:
- f2b(b2f(i)) == i
- ошибка от b2f(f2b(i)) минимизируется - это собственно и важно при квантизации!
- влияние шума минимизируется
- endpoints сохраняются (кстати, бывает важно чтобы сохранялись не только endpoints - например, чтобы 0.5 без погрешности кодировалось в 128 - тогда надо брать умножение на 256).
Для пары *255+0.5 и /255 значения такие:
encode/decode error: 1.268933
noise threshold: 0.001961
Для пары *255.999f и /255 значения такие:
encode/decode error: 2.530851
noise threshold: 0.000016
Итого, как по мне - *256 (НЕ *255.9999) если надо сохранить 0.5, и *255+0.5 во ВСЕХ остальных случаях.
YMMV? :)
Reply
Reply
Leave a comment