SourceDataLine; Knacken bei Frequenzänderung

Bug Fisher

Bekanntes Mitglied
Hallo,

ich möchte Sinustöne erklingen lassen und nutze dazu SourceDataLine (line) wie folgt:

Java:
line.start();
final byte[] toneBuffer = new byte[SAMPLE_CHUNK];
	    	
while(run) {
     createSineWaveBuffer(frequency, toneBuffer);
     line.write(toneBuffer, 0, toneBuffer.length);
}

mit:

Java:
private double alpha = 0.0;
private static final double step_alpha = (2.0*Math.PI)/SAMPLE_RATE;
	
private void createSineWaveBuffer(final double freq, final byte[] buffer) {
     for(int i = 0; i < buffer.length; ++i) {
          buffer[i] = (byte)(Math.sin(freq*alpha)*127.0);
          alpha += step_alpha;
			
          if(alpha >= 2.0*Math.PI) {
               alpha = 0.0;
          }
     }
}

Doch es ist nach jeder Frequenzänderung ein störendes Knacken zu hören.

Woran liegt das und wie vermeidet man es ?
 

arilou

Bekanntes Mitglied
Hab' deinen Code jetzt nicht genauer geprüft, aber stellst du sicher, dass bei dem Frequenzwechsel kein Phasensprung drin ist? D.h. dass
buffer_alteFreq == buffer[i+1]_neueFreq (gleicher "Sample-Wert")
UND
beide Signale waren/sind gerade am fallen/beide sind gerade am ansteigen.
 

Ähnliche Java Themen

Neue Themen


Oben