dos*_*214 0 java audio optimization trigonometry
我有这个方法:
public double sineWave(double t)
{
return amplitude==0?0:Math.sin(t * frequency * Math.PI*2 + phase) * amplitude;
}
Run Code Online (Sandbox Code Playgroud)
它由另一个类中的另一个方法调用,以生成简单正弦波的样本,然后将其添加到缓冲区中以发送到声卡.t是时候了.由于某种原因,应用程序调用此方法越多,它获得的速度就越慢.它没有任何意义,在15秒之后,它足够慢以使用我的CPU的完整核心并使音频断断续续.
我100%肯定这是一段代码,因为如果我用返回0替换它,运行它(测量System.nanotime())所花费的时间是不变的.
为什么会这样?有什么我可以做的来解决这个问题吗?
根据这里的信息 - 虽然不清楚缓冲区有多大,但每次迭代都会增加t.假设您的频率非常高,那么每次迭代都会增加Sin()参数.检查以确定参数是否不断增加到非常高的值.快速而肮脏的测试显示Sin性能下降 -
public class SinTest {
public static void main(String args[]) {
long angle = Long.parseLong(args[0]);
long startTime = System.nanoTime();
for(long l=0L; l<=1000000L; l++) {
Math.sin(angle);
}
long estimatedTime = System.nanoTime() - startTime;
System.out.println(estimatedTime);
}
}
$ java SinTest 100000
29181000
$ java SinTest 10000000
138598000
Run Code Online (Sandbox Code Playgroud)