jeg har en buffer fyldt med samples fra en PCM fil. Jeg prøver at sætte halv styrke med følgende kode, men det laver bare en masse støj. Nogen der kan se hvad jeg gør forkert?
double volume = .5; for (int i=0; i<buffer.length; i+=2) { int s = (int)(buffer[i]<<8 | buffer[i+1]); s = (int) (s*volume);
Jeg tror de er unsigned, da jeg lavede en graf, som gjorde som du beskriver. Men i java kan man ikke bruge unsigned. Hvordan bit-flipper jeg så det går rigtig til?
Fandt ud af en række ting. i JAVAs AudioFormat kan man angive om det er signed og unsigned. Nu har jeg fået det til at virked med 8 bits PCM. Jeg lægger 128 til byten, og initialisere AudioFormat til PCM_SIGNED. Ergo må Intel PCM (LSB,MSB) være unsigned bytes.
void factorSample( byte[] samples, // array med sample i bytes int indexOfLSB, // index for første byte i en unsigned 2-byte værdi double faktor // skaleringsfaktor ) { int leastByte = ((int)samples[indexOfLSB]) & 0xFF; int mostByte = ((int)samples[indexOfLSB+1]) & 0xFF; int unsignedWord = mostByte<<8 | leastbyte; int signedWord = unsignedWord - 0x8000;
int scaledSignedWord = (int)( (double)signedWord * faktor );
int scaledUnsignedWord = scaledSignedWord +0x8000; int newLeastByte = (byte)(scaledUnsignedWord & 0xFF); int newMostByte = (byte)(scaledUnsignedWord>>8 & 0xFF); samples[indexOfLSB] = newLeastByte; samples[indexOfLSB+1] = newMostByte;
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.