다음 코드를 실행하면 백그라운드에서 약간의 왜곡 (윙윙 거리는 소리)이 발생합니다. 그것의 미묘한 성질 때문에 바이트 캐스팅 (byte casting)과 함께 일종의 앨리어스가 있다고 믿는다.Java에서 사인파를 생성 할 때 백그라운드에서 노이즈가 발생했습니다.
AudioFormat을 PCM_SIGNED = 44100.0 ㎐, 16 비트, 스테레오, 4 바이트/프레임, 빅 엔디안
주 : 데이터가 빅 엔디안되어 코드 (지금) 가정한다.
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);
}
아! 이제 오류를 확인하십시오. 진폭 부분을 수정 한 후에 오류가 명확 해졌지만 코드가 더 효율적입니다. 감사! – yxk
분석을 완료했습니다! –