Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这个代码会产生非常嘈杂的正弦波?_Java_Sound Synthesis_Sine Wave - Fatal编程技术网

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

Java 为什么这个代码会产生非常嘈杂的正弦波?,java,sound-synthesis,sine-wave,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, fals

我正试图用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);
}
试试看{
双采样器=44100;
//每个样本8位,因此是一个字节。
AudioFormat AudioFormat=新的AudioFormat((浮点)采样器,8,1,真,假);
SourceDataLine=AudioSystem.getSourceDataLine(audioFormat);
行。打开(音频格式);
line.start();
//A4
双频=440.0;
字节[]buf=新字节[1];
//样本的公式是振幅*sin(2.0*PI*freq*time)
对于(int i=0;i
我将生成的声音放入一个EQ中,以验证声音是否真的有噪音,并且非常确定:

主频为440Hz,但还有一些其他频率不应出现。为什么会这样?如何修复它?

这是您的正弦波:

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

如果使用8位采样的全范围将振幅设置为1.0,则以下是正弦波:

这里将振幅保持在0.1,但使用16位采样:


显然,这两种选择都会降低噪音

有趣。我在Java中使用过一些声音输出。您能否打印到样本变量中以控制计算结果?我愿意猜测这是一个浮点精度问题,因为您的结果将是一个近似值。看看您的代码,样本大小可能是问题所在吗?将该样本放入8位会丢失精度。是否有理由将其乘以
0.1
?如果你去掉乘以0.1的乘法,然后把信号输入到你的EQ中,会发生什么?这里是我乘以0.1的前100个样本,这样振幅就不会太高了。如果我不乘同样的事情发生,信号就会变得更响亮。回答得好。你用的是什么绘图工具?我没有可用的gnuplot,所以这是一个很好的解释。从字节改为短样本解决了这个问题。谢谢:D