我正在制作一个播放音高变化的正弦波的程序,我正在处理我以前从未见过的东西:程序应该播放从 220 赫兹到 0 赫兹的正弦波,我可以看到频率从 220 到 0,但我听到的是一个从 220 到 0 再回到 220 的正弦波。我不知道这段代码是如何做到的
http://pastebin.com/HS36k7XJ(因为布局搞砸了,不得不在这里发布)
(其中 t 是以秒为单位的时间,f 是当前频率(通过简单的线性插值计算,其行为正常))
我正在制作一个播放音高变化的正弦波的程序,我正在处理我以前从未见过的东西:程序应该播放从 220 赫兹到 0 赫兹的正弦波,我可以看到频率从 220 到 0,但我听到的是一个从 220 到 0 再回到 220 的正弦波。我不知道这段代码是如何做到的
http://pastebin.com/HS36k7XJ(因为布局搞砸了,不得不在这里发布)
(其中 t 是以秒为单位的时间,f 是当前频率(通过简单的线性插值计算,其行为正常))
您可以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);
}