Java frequency analysis efficiency

I am working on an application that samples audio and requires real-time processing (FFT and harmonic product spectrum) of this data.

I need to use a sample rate of 44100Hz and require a frequency resolution of 0.5Hz, i.e. I need 88200 pre-FFT samples. It takes about 2 seconds to capture because it is twice the sample rate; however, after the first sample, I significantly improve the situation by using a circular fetch buffer and only read half the number of samples from now on.

Unfortunately, performance is still pretty slow and there is a fairly small latency. This is a big problem as the application has to respond in a timely manner to input as it happens.

Does anyone have any suggestions for improving performance? I think the main problem is the requirement for large samples and it would be nice if I could reduce the amount of audio read while keeping the same precision. Is it possible to use streams?

EDIT

If it helps to find out, I'm trying to make a realtime F0 estimate from the electric guitar input, as well as a few F0 estimates for chord matching. I have methods to do this, work and is pretty accurate, but this is for a uni project and I really don't have enough time to look too much into other methods besides FFT. In fact, I'm just hoping for some way to speed up the sampling process.

+3


source to share


2 answers


Since you need to record 2s of audio first, this will set the lower latency limit. Even with 50% overlap, you will still have a minimum delay of 1 second. FFT and other processing will only complement this, but hopefully not by a significant amount (otherwise use the faster FFT library). The only way to reduce this latency is to sacrifice frequency resolution.



+1


source


Using the FFT method gives you a time-frequency tradeoff. If you want lower latency, you will have to use less data, which with FFTs (shorter or zero) gives you a less accurate estimate of frequency.



Zero-padding will just give you high quality interpolation. But this can provide a better estimate of the peak frequency than simply using the center of the peak buffer of the shorter FFT.

+1


source







All Articles