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

    10-05 21:30