2016-08-01 8 views
0

Я читаю звук с помощью звука JAVA API, и я бы хотел восстановить уровень сигнала. У меня нет никаких проблем, чтобы прочитать файл и вот код я использую, чтобы попытаться получить уровень сигнала:Получить уровень сигнала в звуке API Java

for (byte bit:bytes) { 
     if (i<2) { 
      signalLevelLeft=signalLevelLeft+Math.abs(bit); 
      System.out.println("Left : "+i+" - "+bit); 
      i++; 
     } else if (2<=i && i<3) { 
      signalLevelRight=signalLevelRight+Math.abs(bit); 
      //System.out.println("Right : "+i+" - "+bit); 
      i++; 
     } else if (i==3) { 
      signalLevelRight=signalLevelRight+Math.abs(bit); 
      //System.out.println("Right : "+i+" - "+bit); 
      i=0; 
     } 


     if (signalLevelLeft>maxLeft) { 
      maxLeft= signalLevelLeft; 
      System.out.println("Max left : " + maxLeft); 
     } 

После того как я получаю audioInputStream, формат, линия, открыта линия (..), вот код, я использую, чтобы прочитать звук и кормить метод видели чуть выше:

try { 
    byte bytes[] = new byte[1024]; 
    int bytesRead=0; 
    while (((bytesRead = audioInputStream.read(bytes, 0, bytes.length)) != -1) && !stop) { 
     line.write(bytes, 0, bytesRead); 
    } 
} catch (IOException io) { 
    io.printStackTrace(); 
    return; 
} 

чтобы проверить уровень сигнала, я сгенерировал квадратичный сигнал только на левый канал с дерзостью, и я прочитал его с моим кодом (будьте осторожны, если вы это сделаете, этот звук действительно уродлив). Вот результаты: На правом канале он идеально подходит, сигнал 0 везде:

Справа: 2 - 0

Справа: 3 - 0

Справа: 2 - 2

справа: 3 - 0 (...)

на левом канале, у меня есть этот странный результат:

слева: 0 - 0

Слева: 1 - -128

Слева: 0 - 1

Слева: 1 - -128 (...)

Слева: 0 - -1

Слева: 1 - 127

слева: 0 - -1

слева: 1 - 127

Почему у меня есть эти 0 на левом канале? Поскольку у меня есть квадратичный сигнал, я думал, что ВАВЭ такой результат:

Слева: 0 - -128

Слева: 1 - -128

Слева: 0 - -128

слева: 1 - -128 (...)

слева: 0 - 127

слева: 1 - 127

Слева: 0 - 127

Слева: 1 - 127

Конечно, у меня есть такой же странный результат с правым только сигналом и даже с стереосигнала: Кажется, что только одна информация по 2 нести сигнал. Я также проверил с максимальным увеличением на Audacity, и это действительно квадрат с любыми 0 ...

Благодарим вас за ответы и прекрасный день.

+0

ли вы собрать байты в PCM, прежде чем квадратуры? Каков формат звуковой кодировки? –

+0

Когда я создаю звуковой файл в Audacity, я просто перехожу в меню Generate, затем Sound, затем выбираю «squarred wave» с частотой 440 Гц с максимальным диапазоном 1 (от 0 до 1). Когда это будет сделано, я сохраню звук в виде WAV-файла PCM, подписанного 16 бит. –

+0

Это означает, что для каждого значения PCM требуется два байта. Возможно, вы сможете лучше понять результаты, если собрать байты в значения PCM, которые они представляют. –

ответ

0

Хорошо, я, наконец, отвечу (с кончиком Фила, спасибо ...). Вы правы, есть 2 байта, в маленьком концевом режиме на значение PCM. Поэтому мне пришлось поймать два первых байта, сдвинуть второй на 8 бит слева с помощью такого знака: «>>», а затем добавить второй байт. Результат этого добавления (должен ли я сказать конкатенацию?) Из 2 байтов - это значение PCM.

Я проверил его с синусоидальными и квадратичными сигналами, и результаты в порядке: я получил ожидаемое значение.

Вот код, который я использовал:

byte b1, b2, b3, b4; 
for (byte octet : bytes) { 
     if (i==1) { 
      //Gauche 
      b1=octet; 
      //System.out.println(i+" *** "+bit); 
      i++; 
     } else if (i==2) { 
      b2=octet; 
      //Gauche 
      if (Math.abs((b2<<8)+b1)> signalLevelLeft) { 
       signalLevelLeft=Math.abs((b2<<8)+b1); 
       //c2=Math.abs((b2<<8)+b1); 
       //System.out.println("Gauche : "+c2); 
      }    
      i++; 
     } else if (i==3) { 
      //Droite 
      b3=octet; 
      //System.out.println(i+" *** "+bit); 
      i++; 
     } else if (i==4) { 
      //Droite 
      b4=octet; 
      if (Math.abs((b4<<8)+b3)>signalLevelRight) { 
       signalLevelRight=Math.abs((b4<<8)+b3); 
       //c4=Math.abs((b4<<8)+b3); 
       //System.out.println("Droite : "+c4); 
      }    
      i=1; 
     } 
} 

Удачного дня всем ...