java DSP合成器奇怪的行为
问题描述:
我想播放保存在字节数组上的信号,使用javax.sound.sampled.SourceDataLine。 我想开始玩一个简单的正弦波。 对于某些频率(例如1000Hz,400Hz),它可以很好地工作,但对于其他频率(1001,440) 我只能听到几乎没有任何意义的嗡嗡声。 采样率明确足够高以防止混叠(16Khz)。 任何想法? 干杯。java DSP合成器奇怪的行为
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);
}
}
答
你是不是保存缓冲器调用之间的正弦波的相位。因此,任何相位不连续性都会导致游戏速度()被调用。没有嗡嗡声的频率恰好在您的默认开始阶段结束。
+0
嗨,感谢您的回复,但我不确定我是否明白。我正在缓冲一次。 – 2013-02-20 10:38:05
一个想法是你可以发布一些代码。 – 2013-02-14 15:21:03
一些代码,一些数据,澄清什么*没有争议的嗡嗡声*的意思,并改变*它的作品很好* *它运作良好*。 – thang 2013-02-14 18:01:08
添加了代码。我以为'好'是其中一个副词。幸运的是,你仍然可以了解我的英语不好...... – 2013-02-15 07:09:46