我正在制作一个播放音高变化的正弦波的程序,并且正在处理我从未见过的东西:该程序应该播放从220 Hz到0 Hz的正弦波,并且我可以看到频率从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);
}