double y_new = (double) (h * (128 - my_byte) / 256);
Эта строка кода является частью метода для построения последовательности байтов в «окнах» (прямоугольник, система координат, как вам нравится)
h := the height of the drawable area in pixel
my_byte := a byte [-128,127] (a 8 bit sample from an audio file?)
(128 - my_byte)
преобразует входные данные [-128,127]
в [256, 1]
. При делении на 256 этот диапазон преобразуется в [1, 1/256]
, а умножение на высоту h
приводит к ожидаемому отображению из [-128,127]
-> [~0,h]
Следующие строки предназначены для рисования линии от точки, представляющей предыдущий байт, до фактической точки. Фактическая точка станет предыдущей точкой для следующей итерации.
my_byte = (byte) (128 * audioData[idx] / 32768);
Эта строка кода выполняется, если размер выборки составляет 16 бит. Но нам нужно 8-битное значение только для построения графика. int
в Java 32-битный, у нас есть 16-битная выборка, поэтому верхний 16-битный равен 0, а нижний 16-битный хранит значение звуковой выборки. Алгоритм теперь сдвигает значение на 7 позиций влево, затем на 15 вправо:
00000000 00000000 11111111 11111111
-> 00000000 01111111 11111111 10000000 // * 128, << 7
-> 00000000 00000000 00000000 11111111 // : 32768, >> 15
Честно говоря, я не знаю, почему автор не просто разделил на 256 один раз, что должно дать тот же результат.
Но в любом случае - результат представляет собой байт, который представляет восемь старших разрядов выборки. Кстати, довольно неточно, потому что если у вас очень тихая 16-битная запись, вы ничего не увидите на волновой панели.