код сигнала .. .. мне нужна помощь ... пожалуйста - PullRequest
0 голосов
/ 08 июля 2010

Подскажите, пожалуйста (на словах), что делает этот код?спасибо

Мои проблемы на самом деле состоят из двух частей: 1)

double y_new = (double) (h * (128 - my_byte) / 256);
lines.add(new Line2D.Double(x, y_last, x, y_new));
y_last = y_new;

2) цикл for, я не понимаю ... что такое 32768?my_byte?

        int numChannels = format.getChannels();
        for (double x = 0; x < w && audioData != null; x++) {

        int idx = (int) (frames_per_pixel * numChannels * x);
        // se a 8 bit è immediato
        if (format.getSampleSizeInBits() == 8) {
            my_byte = (byte) audioData[idx];
        } else {
            my_byte = (byte) (128 * audioData[idx] / 32768);

Вот код.Это было взято отсюда: http://www.koders.com/java/fid3508156A13C80A263E7CE65C4C9D6F5D8651AF5D.aspx?s=%22David+Anderson%22 (класс Sampling Graph)

        int frames_per_pixel = audioBytes.size() / format.getFrameSize() / w;
        byte my_byte = 0;
        double y_last = 0;
        int numChannels = format.getChannels();
        for (double x = 0; x < w && audioData != null; x++) {
        // scegli quale byte visualizzare
        int idx = (int) (frames_per_pixel * numChannels * x);
        // se a 8 bit è immediato
        if (format.getSampleSizeInBits() == 8) {
            my_byte = (byte) audioData[idx];
        } else {

            my_byte = (byte) (128 * audioData[idx] / 32768);
        }

        double y_new = (double) (h * (128 - my_byte) / 256);
        lines.add(new Line2D.Double(x, y_last, x, y_new));
        y_last = y_new;
        }

        repaint();

Ответы [ 3 ]

0 голосов
/ 08 июля 2010

Вы должны в первую очередь узнать, как организован звуковой файл. Но все равно ..

double y_new = (double) (h * (128 - my_byte) / 256);
        lines.add(new Line2D.Double(x, y_last, x, y_new));
        y_last = y_new;

Положения Y линий, которые рисует этот пример, представляют значения семплов звукового файла. Как вы знаете, один образец может быть 8/16/32 ... бит. В этом примере они масштабируют все битовые значения до 8 (1 байт). Центр ne Y будет находиться в центре экрана по центру (это звуковой файл со знаком). h - высота экрана, мы хотим масштабировать его так, как если бы 127 - верхняя часть экрана, а -127 - нижний пиксель экрана.

2) 32768 - максимальное значение для 16-разрядного целого числа со знаком. Таким образом, максимальное значение семпла для 16-битного звукового файла. myByte: звуковой файл сохраняется как поток байтов. Так что даже если вы используете 16-битные сэмплы, вам нужно будет создать целое число (16-битное, 32-битное в Java) из 2-х байтов с экрана. В этом примере они работают только с 8-битными выборочными данными, поэтому, если этот пример читает 16-битный звуковой файл, он преобразует значения выборки в 8-битные в этой строке:

 my_byte = (byte) (128 * audioData[idx] / 32768);

Итак, мой байт содержит примерное значение кадра "idx".

0 голосов
/ 08 июля 2010
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-битная запись, вы ничего не увидите на волновой панели.

0 голосов
/ 08 июля 2010

Не знаю, поможет ли это, но

128 * someInt / 32768

совпадает с

someInt << 7 >> 15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...