Ich bekomme eine leichte Verzerrung (klingt wie Summen) im Hintergrund, wenn ich den folgenden Code ausführen. Wegen seiner subtilen Natur glaubt es, dass beim Byte-Casting eine Art Aliasing stattfindet.Rauschen im Hintergrund beim Generieren von Sinuswelle in Java
Audioformat = PCM_SIGNED 44100,0 Hz, 16-Bit, Stereo, 4 Bytes/Rahmen, big-endian
Hinweis: Code annimmt (bis jetzt), dass die Daten im Big-Endian ist.
public static void playFreq(AudioFormat audioFormat, double frequency, SourceDataLine sourceDataLine)
{
System.out.println(audioFormat);
double sampleRate = audioFormat.getSampleRate();
int sampleSizeInBytes = audioFormat.getSampleSizeInBits()/8;
int channels = audioFormat.getChannels();
byte audioBuffer[] = new byte[(int)Math.pow(2.0, 19.0) * channels * sampleSizeInBytes];
for (int i = 0; i < audioBuffer.length; i+=sampleSizeInBytes*channels)
{
int wave = (int) (127.0 * Math.sin(2.0 * Math.PI * frequency * i/(sampleRate * sampleSizeInBytes * channels)) );
//wave = (wave > 0 ? 127 : -127);
if (channels == 1)
{
if (sampleSizeInBytes == 1)
{
audioBuffer[i] = (byte) (wave);
}
else if (sampleSizeInBytes == 2)
{
audioBuffer[i] = (byte) (wave);
audioBuffer[i+1] = (byte)(wave >>> 8);
}
}
else if (channels == 2)
{
if (sampleSizeInBytes == 1)
{
audioBuffer[i] = (byte) (wave);
audioBuffer[i+1] = (byte) (wave);
}
else if (sampleSizeInBytes == 2)
{
audioBuffer[i] = (byte) (wave);
audioBuffer[i+1] = (byte)(wave >>> 8);
audioBuffer[i+2] = (byte) (wave);
audioBuffer[i+3] = (byte)(wave >>> 8);
}
}
}
sourceDataLine.write(audioBuffer, 0, audioBuffer.length);
}
Ah! Sehen Sie den Fehler jetzt, nachdem Sie den Amplitudenteil behoben haben, wurde der Fehler sehr offensichtlich, aber Ihr Code ist auch effizienter. Vielen Dank! – yxk
Gut gemacht Analyse! –