我正在尝试用 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 中,以验证声音是否真的很嘈杂,果然:主要频率是 440 赫兹,但还有一些其他频率不应该出现。为什么会这样?我如何解决它?
1 回答
呼啦一阵风
TA贡献1802条经验 获得超6个赞
这是你的正弦波:

它非常参差不齐,因为您使用的是低位深度和低幅度。您只有 25 个不同的样本值可供选择。
如果您将幅度设置为 1.0,则使用 8 位样本的全部范围,这是您的正弦波:

这里将幅度保持在 0.1,但使用 16 位样本代替:

这两种选择显然都会减少噪音。
添加回答
举报
0/150
提交
取消
