我正在制作一个播放正弦波变化的程序,我正在处理我以前从未见过的东西:程序应该发出220赫兹到0赫兹的正弦波,我可以看到频率从220变为0,但我听到的是一个从220到0然后又回到220的正弦波。 我不知道这段代码是如何做到的那样
http://pastebin.com/HS36k7XJ(由于布局错误,不得不在此发布)
(其中t是以秒为单位的时间,f是当前频率(通过简单的线性插值计算,表现正常))
答案 0 :(得分:1)
您将f
线性缩小为零。这意味着表达式t * Math.PI * 2
也将缩减为零。传递给sin()
的值从最初的0(因为t = 0)变为某个正值(因为t> 0和f> 0),返回0(因为f = 0)。
让我们看一下t * Math.PI * 2 * f
随时间变化的值和频率:
它正在逆转它的方向,因为t * Math.PI * 2
乘以f,f越来越小。这意味着当t接近1时,整个表达式将变小。
请尝试使用此代码:
double ct = 0;
for (;;) {
if(t>=1) break;
//System.out.println(t+" "+e.getValueAt(t));
for (int i = 0; i < buff.length; i++) {
double f=lerp(fa,fb,t);
buff[i] = (short) (Short.MAX_VALUE * 0.5 * Math.sin(Math.PI * 2 * ct));
toSoundCard[2 * i] = (byte) buff[i];
toSoundCard[2 * i + 1] = (byte) (buff[i] >> 8); //(i know i could avoid doing this)
t += 1.0 / 44100.0;
ct += f / 44100.0;
}
speaker.write(toSoundCard, 0, toSoundCard.length);
}