为什么此代码会产生非常嘈杂的正弦波?

aba*_*bab 4 java sound-synthesis sine-wave

我试图用Java编写一个非常简单的声音合成器。我正在使用javax.sound.sampled包裹。下面的代码可以工作,但是正弦波非常嘈杂,听起来像是在波浪旁边播放了一些安静的暖噪声。

try {
    double sampleRate = 44100;
    //8 bits per sample, so a byte.
    AudioFormat audioFormat = new AudioFormat((float) sampleRate, 8, 1, true, false);
    SourceDataLine line = AudioSystem.getSourceDataLine(audioFormat);

    line.open(audioFormat);
    line.start();

    //A4
    double freq = 440.0;

    byte[] buf = new byte[1];

    //the formula for a sample is amplitude * sin(2.0 * PI * freq * time)
    for (int i = 0; i < sampleRate; i++) {
        double t = (i / (sampleRate - 1));
        double sample = 0.1 * Math.sin(2.0 * Math.PI * freq * t);

        //scaling the sound from -1, 1 to -127, 127
        buf[0] = (byte) (sample * (double) Byte.MAX_VALUE);

        line.write(buf, 0, 1);
    }

    line.drain();
    line.stop();
    line.close();
} catch (Exception e) {
    throw new RuntimeException(e);
}
Run Code Online (Sandbox Code Playgroud)

我将生成的声音放入EQ中,以验证声音是否确实嘈杂,并且足够确定:

这就是我得到的

主频率为440 Hz,但是不应该存在其他一些频率。为什么会这样呢?我如何解决它?

tha*_*guy 5

这是您的正弦波:

锯齿状正弦波

由于您使用的是低位深度和低幅度,所以它参差不齐。您只有25种不同的样本值可供选择。

如果您使用8bit采样的整个范围将幅度设置为1.0,则这是您的正弦波:

平滑正弦波

这里将幅度保持在0.1,但改用16bit采样:

同样平滑的正弦波

这两种选择显然都不会那么吵杂。