0

我正在制作一个播放音高变化的正弦波的程序,我正在处理我以前从未见过的东西:程序应该播放从 220 赫兹到 0 赫兹的正弦波,我可以看到频率从 220 到 0,但我听到的是一个从 220 到 0 再回到 220 的正弦波。我不知道这段代码是如何做到的

http://pastebin.com/HS36k7XJ(因为布局搞砸了,不得不在这里发布)

(其中 t 是以秒为单位的时间,f 是当前频率(通过简单的线性插值计算,其行为正常))

4

1 回答 1

1

您可以f线性缩小到零。这意味着表达式t * Math.PI * 2也将缩小为零。您传递的值sin()从最初的 0(因为 t=0)变为某个正值(因为 t>0 和 f>0),然后回到 0(因为 f=0)。

让我们看看t * Math.PI * 2 * f随着时间的推移和频率的值:

  • 在 t=0 时,该值为 0,并且会随着速度 220 的增加而增加
  • 在 t=0.5 时,值为 345,将停止增加
  • 在 t=1 时,该值再次为 0,并将随着速度 -220 减小

它正在反转它的方向,因为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);
        }
于 2013-01-30T17:32:07.870 回答