Avatar billede stigc Nybegynder
20. april 2004 - 21:08 Der er 12 kommentarer

Volume på raw data

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);
       
  buffer[i] = (byte)((s & 0x0000ff00) >> 8);         
  buffer[i+1] = (byte)(s & 0x000000ff);
}
Avatar billede stigc Nybegynder
20. april 2004 - 21:10 #1
16 bits stereo.
Avatar billede stigc Nybegynder
20. april 2004 - 21:14 #2
Jeg har også prøvet at bytte om på bufferværiderne med hensyn til little/big indian.
Avatar billede jakoba Nybegynder
20. april 2004 - 22:39 #3
little/big endian.  (om største eller mindste byte er i bagENDen. Ikke nogen indianer)

prøv at udskrive en sekvens af de værdier du laver.

Har du checket med PCM formatet at der ikke står et antal styrebogstaver forrest i filen som IKKE er samples. de skal så springes over.
Avatar billede jakoba Nybegynder
20. april 2004 - 22:56 #4
Der er mange forskellige implementeringer af PCM. Hvis det du har er unsigned PCM vil sådan en 'halvering' trække hele lydbølgen om på samme side af 0

Har du checket om du evt kan bruge dette modul direkte:
http://java.sun.com/j2se/1.4.2/docs/api/javax/sound/sampled/AudioFormat.Encoding.html

mvh JakobA
Avatar billede stigc Nybegynder
21. april 2004 - 19:02 #5
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?
Avatar billede stigc Nybegynder
21. april 2004 - 19:12 #6
PCM formatet er Intel PCM,(LSB,MSB) 16 bits stereo.
Avatar billede stigc Nybegynder
21. april 2004 - 20:07 #7
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.
Avatar billede jakoba Nybegynder
22. april 2004 - 12:03 #8
måske noget i retning af:

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;

}; //endmethod faktorSample
Avatar billede jakoba Nybegynder
22. april 2004 - 12:06 #9
Ups. jeg roder i castingen i de 4 sidste linier, der skal først castes til byte når de stoppes tilbage i arrayet.
Avatar billede stigc Nybegynder
02. juni 2004 - 22:50 #10
Hej jakoba. Lægger du et svar?
Avatar billede stigc Nybegynder
15. juni 2004 - 19:45 #11
jakoba?
Avatar billede stigc Nybegynder
08. januar 2005 - 11:58 #12
?
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester