Tôi đang bị biến dạng nhẹ (nghe có vẻ như ù) trong nền khi tôi chạy mã sau đây. Bởi vì bản chất tinh tế của nó, nó làm cho tin rằng có một số loại răng cưa xảy ra với việc đúc byte.Tiếng ồn ở chế độ nền khi tạo sóng sin trong Java
AudioFormat = PCM_SIGNED 44100,0 Hz, 16 bit, âm thanh stereo, 4 byte/khung, lớn-endian
Note: Mã giả (bây giờ) mà dữ liệu được trong cuối lớn.
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! Xem lỗi ngay bây giờ, sau khi sửa phần biên độ, lỗi trở nên rất rõ ràng, nhưng mã của bạn cũng hiệu quả hơn. Cảm ơn! – yxk
Phân tích tốt! –