Я хочу преобразовать двойной массив с диапазоном от -1 до 1 в байтовый вывод, который будет сохранен в формате WAVE.Ради аргумента я сконцентрируюсь на простой 8-битной волне.
Насколько я вижу, есть два конкурирующих способа сделать это, оба, которые предлагают очень немного отличающиеся результаты, и тонкостьдовольно сложный.
Метод 1: вывод = (байт) (ввод * 128.0 + 128) .В этом случае значение 1 не может быть входным, в противном случае недопустимое значение 256 будет выходным.Результаты усекаются до размера байта.Результаты демонстрации:
- -1 --------> 0
- -0,5 ------> 64
- 0 ---------> 128
- 0,5 -------> 192
- 1- (1/128) -> 255
- 0,9999999 ->255 (равно 255,999872 усеченным, допустимым)
- 1 ---------> 256 (недопустимым)
Метод 2: вывод = (байт) Вокруг(ввод * 127,5 + 127,5) .В этом случае значение 1 IS может быть входным с выходным значением 255.В отличие от ранее, результаты округлены.Результаты демонстрации:
- -1 --------> 0
- -0,5 ------> 64 (равно 63,75 округлено)
- 0 ---------> 128 (округляется до 127,5)
- 0,5 -------> 191 (округляется до 191,25)
- 1- (1 /128) -> 254 (равно 254,00390625 округлено)
- 0,999999 -> 255 (равно 254,9998725 округлено)
- 1 ---------> 255 (законно)
Кажется, что оба они имеют свои недостатки и преимущества.
При первом методе не требуется округления, выходные данные чистые, а результаты согласованы вплоть до конечной позиции.К сожалению, 1 - недопустимый вход, и поэтому (например) синусоидальные входы могут быть проблемой.Либо пользователь должен убедиться, что ввод никогда не равен единице, либо, что желательно, функция просто убедится, что все, что выше позиции 255, обрезано до 255.
При втором методе +1 - разрешенный вход, поэтому не стоит беспокоиться о выдаче недопустимых выходных данных 256. К сожалению, результаты кажутся немного безобразными при простых входных данных.Они должны быть округлены, и скачок, скажем, с 64 до 128 не является таким же скачком, как с 128 до 191 (что составляет разницу 63 вместо 64).И это несмотря на то, что входные данные имеют равные различия (от -0,5 до 0 и от 0 до 0,5 соответственно).
Я также заметил, что при первом методе диапазон для первой и конечной позиции удваивается, поскольку с 255 до255,999 обрезают до 255, а от 0 до 0,999 обрезают до нуля.Во втором методе только от 0 до 0,499 усекаются до нуля, и только от 254,5 до 255 усекаются до 255. Все остальные числа допускают выбор размера 1,0 (например, от 42,5 до 43,499 с округлением до 43), поэтомуСорта имеет смысл, что первая и последняя позиция байта также должна позволять «полный» диапазон размера 1.0 для себя.С другой стороны, если 255 - это фактическое число 255 в числовой строке, то можно также привести аргумент, что для этого байта выделена только половина диапазона.
Так что я просто ищу ещепонимание и свойства обеих систем.Какой правильный способ сделать это?