2016-08-01 9 views
0

Ich lese einen Sound mit dem API-JAVA-Sound und ich möchte den Signalpegel wiederherstellen. Ich habe kein Problem, die Datei zu lesen und hier ist der Code, den ich zu versuchen, verwenden Sie den Signalpegel zu erhalten:Holen Sie sich den Signalpegel in der API Java-Sound

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); 
     } 

Nachdem ich die audioInputStream bekommen, das Format, die Linie, eröffnete die Linie (..), hier ist der Code, den ich den Sound zu lesen und das Verfahren gerade oben gesehen zu füttern:

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; 
} 

die Signalpegel zu testen, erzeugen ich ein quadratisches Signal nur auf dem linken Kanal mit Kühnheit und ich las es mit meinem Code (Vorsicht, wenn Sie es tun, ist dieser Sound wirklich hässlich). Hier sind die Ergebnisse: Auf dem rechten Kanal es perfekt ist, ist das Signal 0 überall:

Recht: 2-0

Recht: 3-0

Recht: 2 - 2

Rechts: 3-0 (...)

auf dem linken Kanal, ich habe dieses seltsame Ergebnis:

links: 0 - 0

Links: 1 - -128

Links: 0 - 1

Links: 1 - -128 (...)

Links: 0 - -1

Links: 1-127

links: 0 - -1

links: 1 - 127

Warum habe ich diese 0 auf dem linken Kanal? Als ich ein quadratisches Signal habe, dachte ich, ich würde diese Art von Ergebnis vave:

Links: 0 - -128

Links: 1 - -128

Links: 0 - -128

links: 1 - -128 (...)

links: 0 - 127

links: 1 - 127

Links: 0 - 127

Links: 1 - 127

Natürlich habe ich die gleiche Art von seltsamen Ergebnis mit einem rechten nur Signal und sogar mit einem Stereo-Signal: Es scheint, dass nur 1 Informationen über 2 trage das Signal. Ich habe auch mit einem maximalen Zoom auf Audacity überprüft und es ist wirklich ein quadriertes Signal mit allen 0 ...

Vielen Dank für Ihre Antworten und einen schönen Tag.

+0

Haben Sie die Bytes in PCM zusammenstellen, bevor quadriert? Wie ist das Format der Toncodierung? –

+0

Wenn ich die Audiodatei in Audacity erstelle, gehe ich einfach in das Menü Generate, dann Sound und dann wähle ich eine "Squarred Wave" bei 440 Hz Frequenz mit einem maximalen Bereich von 1 (0 bis 1). Wenn es fertig ist, speichere ich den Sound als WAV-Datei PCM signiert 16 Bit. –

+0

Das bedeutet, es dauert zwei Bytes pro PCM-Wert. Sie können die Ergebnisse möglicherweise besser verstehen, wenn Sie die Bytes in die PCM-Werte zusammenstellen, die sie repräsentieren. –

Antwort

0

Ok, ich gehe endlich die Antwort (mit dem Tipp von Phil, danke ...). Sie haben recht, es gibt 2 Bytes, im Little-Endian-Modus pro PCM-Wert. Also musste ich die zwei ersten Bytes fangen, den zweiten auf 8 Bits auf der linken Seite mit dieser Art von Zeichen verschieben: ">>" und dann das zweite Byte hinzufügen. Das Ergebnis dieser Addition (sollte ich sagen Verkettung?) Der 2 Bytes ist der PCM-Wert.

Ich habe es mit sinusförmigen und quadrierten Signalen getestet und die Ergebnisse sind ok: Ich habe den Wert erwartet. Hier

ist der Code, den ich verwendet:

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; 
     } 
} 

einen schönen Tag zu allen ...

Verwandte Themen