java - 为什么这段代码会产生非常嘈杂的正弦波?

标签 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);
}

我将生成的声音放入 EQ 中,以验证声音是否确实嘈杂,果然如此:

this is what I got

主要频率是 440 赫兹,但还有一些其他频率不应该出现。为什么会这样?我该如何解决?

最佳答案

这是您的正弦波:

Jagged sine wave

它非常参差不齐,因为您使用的是低位深度和低振幅。您只有 25 个不同的样本值可供选择。

如果您将振幅设置为 1.0,则使用 8 位样本的整个范围,这里是您的正弦波:

Smooth sine wave

此处将振幅保持在 0.1,但改为使用 16 位样本:

Equally smooth sine wave

这两个选项显然都会减少噪音。

关于java - 为什么这段代码会产生非常嘈杂的正弦波?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55031723/

相关文章:

fft - 自定义振荡器的任意波表

java - 减少在 Java 中生成纯音的谐波

java - 在android中有效地绘制正弦波

matlab - 如何将正弦波转换为音频?

python - 在python中绘制正弦波时出现问题

java - 使用 ant 根据 jar 属性编辑文件

java - 如何从文本文件读取/加载此 HashMap?

java - 使用 jaxb 为 java 类的所有实例映射单个元素名称

java.util.Locale 第一项为空

python - 如何将 midi 文件转换为按键(在 Python 中)?