奇怪的Math.sin行为

时间:2013-01-30 17:06:05

标签: java audio sine

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

http://pastebin.com/HS36k7XJ(由于布局错误,不得不在此发布)

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

1 个答案:

答案 0 :(得分: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);
        }