_
toggle menu eXmatrikulationsamt.de
online: simpson und 402 gäste

> Java byte array manipulation 2 bytes --> short * irgendwas --> 2 bytes

Themen Layout: Standard · Linear · [Outline] Thema abonnieren | Thema versenden | Thema drucken
post 03 Sep 2009, 15:58
avatar
busy office
********

Punkte: 1655
seit: 30.06.2006

hi,

ich kriege irgendwie seit Tagen keinen klaren Kopf bei dem ganzen Audiozeuch - folgendes:

Ich habe eine WAV Datei, erzeuge einen audiostream und trenne die beiden Kanäle (Stereo file) in jeweils ein byte array. Soweit so gut funktioniert auch super. Nun will ich die einzelnen Bytes manipulieren, was ja auch kein Problem darstellt. Nur bekomme ich dabei ein Rauschen.

Ein Sample besteht ja nun aus 4 Byte - 2 Byte für Links und 2 Byte für rechts.

L L R R

und ich will auf die 2 Byte des Linken kanals ein Gain (Lautstärke) multiplizieren und auf den rechten - was aber unterschiedliche Verstärkungsfaktoren sind. Mir wurde nun gesagt ich müsse die 2 Bytes aus dem Kanal in ein Short überführen, es manipulieren und wieder in die 2 Bytes packen. Nur funktioniert das nicht so richtig.

Details auf der StackOverflow Seite




--------------------
Grüße sn3ek
ProfilPM
AntwortenZitierenTOP
 
Antworten
post 03 Sep 2009, 18:30
avatar
der vierkonsonantige
*********

Punkte: 3812
seit: 12.12.2003

mit c wäre das nicht passiert smile.gif

ne mal im ernst...

CODE
byte arr[] = getTheDataSonstewoHer();
int i = 0;
while(i*4 < arr.length)
{
 // annahme little endian, für big muss +0 und +1 sowie +2 und +3 getauscht werden
 // L
 int gegaehnt = ((((int)arr[i * 4 + 1]) << 8) | arr[i*4] ) * gaehn;
 arr[i*4] = (byte)(gegaehnt & 0xff);
 arr[i*4 +1] = (byte)((gegaehnt & 0xff00) >> 8);
 
 // R
 gegaehnt = ((((int)arr[i * 4 + 3]) << 8) + arr[i*4 + 2] ) * gaehn;
 arr[i*4 +2] = (byte)(gegaehnt & 0xff);
 arr[i*4 +3] = (byte)((gegaehnt & 0xff00) >> 8);

 i++;
}


denk bitte dran, dass du nur ganzzahlige verstärkungen machen kannst. ansonsten hilft dir nur der weg über byte -> int -> float -> rechnen -> int -> byte

€ paar klammern geeckt und verschoben
€2: auf solaris gehört

Dieser Beitrag wurde von stth: 03 Sep 2009, 18:37 bearbeitet


--------------------
jeden tag einen dummen kommentar!
hab ich bei den fadfindern gelernt.
bild kann nicht angezeigt werden

bild kann nicht angezeigt werden bild kann nicht angezeigt werden bild kann nicht angezeigt werden bild kann nicht angezeigt werden
"if you have a hammer, every problem looks like a nail"
ProfilPM
AntwortenZitierenTOP
post 03 Sep 2009, 18:57
avatar
busy office
********

Punkte: 1655
seit: 30.06.2006

Zitat(stth @ 03 Sep 2009, 18:30)
mit c wäre das nicht passiert smile.gif

ne mal im ernst...

CODE
byte arr[] = getTheDataSonstewoHer();
int i = 0;
while(i*4 < arr.length)
{
 // annahme little endian, für big muss +0 und +1 sowie +2 und +3 getauscht werden
 // L
 int gegaehnt = ((((int)arr[i * 4 + 1]) << 8) | arr[i*4] ) * gaehn;
 arr[i*4] = (byte)(gegaehnt & 0xff);
 arr[i*4 +1] = (byte)((gegaehnt & 0xff00) >> 8);
 
 // R
 gegaehnt = ((((int)arr[i * 4 + 3]) << 8) + arr[i*4 + 2] ) * gaehn;
 arr[i*4 +2] = (byte)(gegaehnt & 0xff);
 arr[i*4 +3] = (byte)((gegaehnt & 0xff00) >> 8);

 i++;
}


denk bitte dran, dass du nur ganzzahlige verstärkungen machen kannst. ansonsten hilft dir nur der weg über byte -> int -> float -> rechnen -> int -> byte

€ paar klammern geeckt und verschoben
€2: auf solaris gehört
*



Mein Gain Control liegt zwischen 0 und irgendwas --> hängt vom Delay ab und das ist double demzufolge brauch ich die umwandlung byte--> int -> float --> rechnen --> int --> byte

hast du vllt noch nen herz für mich und kannst mir das an nem codesnippet zeigen? bin irgendwie nach 2 wochen durchweg coden nicht mehr wirklich allein dazu fähig.. aber am montag muss das programm stehen... bin also für jede hilfe dankbar!!! smile.gif
ProfilPM
AntwortenZitierenTOP
Beiträge
sn3ek   Java byte array manipulation   03 Sep 2009, 15:58
stth    byte arr[] = {    1, 1, ...   03 Sep 2009, 19:14
1 Nutzer liest/lesen dieses Thema (1 Gäste)
0 Mitglieder: