Obtengo una leve distorsión (suena como zumbido) en el fondo cuando ejecuto el siguiente código. Debido a su naturaleza sutil, hace creer que hay algún tipo de alias con el byte de fundición.Ruido en el fondo al generar onda sinusoidal en Java
AudioFormat = PCM_SIGNED 44100,0 Hz, 16 bits, estéreo, 4 bytes/marco, bigEndian
Nota: código se supone (por ahora) de que los datos están en big endian.
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! Vea el error ahora, después de corregir la parte de amplitud, el error se hizo evidente, pero su código también es más eficiente. ¡Gracias! – yxk
¡Análisis bien hecho! –