java DSP synth异常行为

java DSP synth异常行为,java,audio,signal-processing,sound-synthesis,Java,Audio,Signal Processing,Sound Synthesis,我正在尝试使用javax.sound.sampled.SourceDataLine播放保存在字节数组中的信号。 我正在尝试开始播放一个简单的正弦波。 对于某些频率(例如1000Hz、400Hz),它工作良好,但对于其他频率(1001440) 我只听到几乎没有投手的嗡嗡声。 采样率绝对高到足以防止混叠(16Khz)。 有什么想法吗? 干杯 import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioSystem;

我正在尝试使用javax.sound.sampled.SourceDataLine播放保存在字节数组中的信号。 我正在尝试开始播放一个简单的正弦波。 对于某些频率(例如1000Hz、400Hz),它工作良好,但对于其他频率(1001440) 我只听到几乎没有投手的嗡嗡声。 采样率绝对高到足以防止混叠(16Khz)。 有什么想法吗? 干杯

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.SourceDataLine;

public class Player
{

    private static float SAMPLE_RATE = 16000;

    public static void main(String[] args)
    {
        playSound();
    }


    private static void playSound()
    {
        try
        {
            final AudioFormat audioFormat = new AudioFormat( SAMPLE_RATE, 8, 1, true,  true );
            SourceDataLine line = AudioSystem.getSourceDataLine( audioFormat );
            line.open( audioFormat );
            line.start();
        /* the last argument here is the frequency in Hz. works well with 1000, but with 1001 I get week and pitchless clicking sound sound*/
            byte[] signal = smpSin( 1, 1, 1000 );
            play( line, signal );
            line.drain();
            line.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }


    private static byte[] smpSin(double lenInSec, double amp, double signalFreq)
    {
        int len = (int)(SAMPLE_RATE * lenInSec);
        byte[] out = new byte[len];
        for (int i = 0; i < out.length; i++)
        {
            out[i] = (byte)(amp * Math.sin( ((2.0 * Math.PI * signalFreq) *  ((double)i)) / SAMPLE_RATE ));
        }
        return out;
    }

    private static void play(SourceDataLine line, byte[] array)
    {
        line.write( array, 0, array.length );
    }
导入javax.sound.sampled.AudioFormat;
导入javax.sound.sampled.AudioSystem;
导入javax.sound.sampled.SourceDataLine;
公开课选手
{
私人静态浮动采样率=16000;
公共静态void main(字符串[]args)
{
播放声音();
}
私有静态void playSound()
{
尝试
{
最终AudioFormat AudioFormat=新的AudioFormat(采样率,8,1,真,真);
SourceDataLine=AudioSystem.getSourceDataLine(audioFormat);
行。打开(音频格式);
line.start();
/*这里的最后一个参数是频率,单位为Hz。在1000的情况下效果很好,但在1001的情况下,我得到的是一周和无音高的咔哒声*/
字节[]信号=smpSin(1,1,1000);
播放(线路、信号);
line.drain();
line.close();
}
捕获(例外e)
{
e、 printStackTrace();
}
}
专用静态字节[]smpSin(双秒、双安培、双信号频率)
{
int len=(int)(采样率*秒);
字节[]输出=新字节[len];
for(int i=0;i

}

您没有在缓冲区调用之间保存正弦波的相位。因此,任何相位中断都会以调用play()的速率引起嗡嗡声。没有嗡嗡声的频率恰好在您默认的开始阶段结束。

一个想法是您可以发布一些代码。一些代码、一些数据、关于无音高嗡嗡声的含义的澄清,并将其更改为“很好”。添加了代码。不知怎的,我认为“好”是一个副词。幸运的是,你仍然可以理解我糟糕的英语…嗨,谢谢你的回复,但我不确定我是否明白。我只过了一次缓冲区。