为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕容708150 2022-07-20 20:33:49
我正在尝试用 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个赞

这是你的正弦波:

//img1.sycdn.imooc.com//62d7f66c0001e76f07450404.jpg

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

如果您将幅度设置为 1.0,则使用 8 位样本的全部范围,这是您的正弦波:

//img1.sycdn.imooc.com//62d7f67a0001fb0407450364.jpg

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

//img1.sycdn.imooc.com//62d7f686000121c307460361.jpg

这两种选择显然都会减少噪音。



查看完整回答
反对 回复 2022-07-20
  • 1 回答
  • 0 关注
  • 155 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号