Объяснение кода кодирования звукового сигнала - PullRequest
0 голосов
/ 06 июля 2010

Я пытаюсь понять каждую строку следующего кода, но мои знания мешают мне быть успешным.

На самом деле это фрагмент кода, взятый из Java-учебника, касающегося построения аудиосигнала (сигнала)

В двух словах, код делает в основном: если размер выборки аудиоданных равен 16 и тип кодирования BigEndian, сделайте это ... Ну, проблема в том, что я хотел бы уметь понимать значение каждого отдельного оператора кода. Может кто-нибудь мне помочь ? Спасибо заранее... Оригинальный код здесь: http://www.koders.com/java/fid3508156A13C80A263E7CE65C4C9D6F5D8651AF5D.aspx?s=%22David+Anderson%22 (класс SamplingGraph)

Код, который я хотел бы понять, следующий:

if (format.getSampleSizeInBits() == 16) {
    int nlengthInSamples = audioBytes.size() / 2;
    audioData = new int[nlengthInSamples];

    if (format.isBigEndian()) {
        for (int i = 0; i < nlengthInSamples; i++) {
        /* First byte is MSB (high order) */
        int MSB = (int) audioBytes.get(2 * i);
        /* Second byte is LSB (low order) */
        int LSB = (int) audioBytes.get(2 * i + 1);
        audioData[i] = MSB << 8 | (255 & LSB);
        }

Особенно, как бы вы перевели словами следующий код:

audioData[i] = MSB << 8 | (255 & LSB);

... еще раз спасибо Мат

Ответы [ 3 ]

2 голосов
/ 06 июля 2010

MSB = старшие значащие биты (первая половина)
LSB = младшие значащие биты (вторая половина)

Этот фрагмент кода подтверждает, что размер выборки составляет 16 бит и в формате big-endian . Затем он рассчитывает MSB и LSB для образца. Наконец, он объединяет MSB и LSB, сдвигая MSB влево на 8 битов, а затем добавляя LSB с маской, которая гарантирует использование только младших 8 битов LSB.

2 голосов
/ 06 июля 2010

Это то, что называется побитовая операция ;он манипулирует числами на уровне битов.

Фрагмент объединяет 2 byte для16-битные сэмплы в формате int в с прямым порядком байтов .

255, который в двоичном виде равен 11111111 (то есть последовательность из 8 единиц), используется для «маскирования»«нижний byte, чтобы отменить любое расширение знака (byte в Java - числовой тип со знаком).В таких операциях обычно используется шестнадцатеричное представление 0xFF вместо десятичного 255.


Если вы не хотите разбираться с манипуляциями на уровне битов, должны быть библиотекикоторый может сделать это для вас надежным способом.

Смежные вопросы

0 голосов
/ 06 июля 2010
audioData[i] = MSB << 8 | (255 & LSB);

MSB - старший бит

LSB - младший значащий бит

MSB << 8     // shift the MSB to the left by 8 bitposition
Example: 00000000 00000010 -> 00000010 00000000

(255 & LSB)  // masking the LSB, so that we have LSB if it is less then 255 or 0
Example: 00000000 00000010 -> 00000000 00000010
         00000010 00000000 -> 00000000 00000000

// The OR operation '|' is putting both together
Example: 00000010 00000000 | 00000000 00000010 -> 00000010 00000010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...