I’m working on creating an app that allows very low bandwidth communication via high frequency sound waves. I’ve gotten to the point where I can create a frequency and do the fourier transform (with the help of Moonblink’s open source code for Audalyzer).
But here’s my problem: I’m unable to get the code to run with the correct timing. Let’s say I want a piece of code to execute every 10ms, how would I go about doing this?
I’ve tried using a TimerTask, but there is a huge delay before the code actually executes, like up to 100ms.
I also tried this method simply by pinging the current time and executing only when that time has elapsed. But there is still a delay problem. Do you guys have any ideas?
Thread analysis = new Thread(new Runnable()
{
@Override
public void run()
{
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_DISPLAY);
long executeTime = System.currentTimeMillis();
manualAnalyzer.measureStart();
while (FFTransforming)
{
if(System.currentTimeMillis() >= executeTime)
{
//Reset the timer to execute again in 10ms
executeTime+=10;
//Perform Fourier Transform
manualAnalyzer.doUpdate(0);
//TODO: Analyze the results of the transform here...
}
}
manualAnalyzer.measureStop();
}
});
analysis.start();
Your thread/loop strategy is probably roughly as close as you’re going to get. However, 10ms is not a lot of time, most Android devices are not super-powerful, and a Fourier transform is a lot of work to do. I find it unlikely that you’ll be able to fit that much work in 10ms. I suspect you’re going to have to increase that period.