Take the 2-minute tour ×

What is the fastest FFT library for iOS/Android ARM devices? And what library to people typically use on iOS/Android platforms? I'm guessing vDSP is the library most frequently used on iOS.

EDIT: my code is at http://anthonix.com/ffts and uses the BSD license. It runs on Android and iOS, and it is faster than libav, FFTW and vDSP.

EDIT2: if anyone can provide access to a POWER7 machine (or other machines) please email me. It would be much appreciated.


share|improve this question
Welcome to Stackoverflow! If you find a response is helpful, please up vote it. If the response successfully answers your question, please click the green check mark next to it to accept the answer. Also please look at stackoverflow.com/questions/how-to-ask for advice on how to write a good question –  Kurtis Nusbaum Nov 3 '11 at 22:37
I'm confused -- why are you benchmarking performance for interleaved formats? vDSP operates on split complex data, because it is the preferred layout for many other signal processing operations on complex data. Is the cost of mapping between these layouts accounted for in your benchmark? –  Stephen Canon Nov 4 '11 at 1:27
Stephen: yes the cost is accounted for; I'm performing the FFT as per 'Usage Case 2: Fast Fourier Transforms' in the Apple developer library article 'Using the Accelerate Framework for Data Processing' (developer.apple.com/library/mac/#featuredarticles/…). I'm fairly new to signal processing.. why is split format the preferred layout? What other libraries use it? I've only used a few other libraries, such as FFTW, and vDSP has been the only library that uses split format. –  Anthony Blake Nov 4 '11 at 1:37
Suppose you want to multiply the signal by a complex value (or perform any other operation beyond addition, really); if you use an interleaved format, a large number of permutes may be required to carry it out. With a split format, those permutes are avoided. –  Stephen Canon Nov 4 '11 at 1:49
@Jake Take a look at benchfft for info on benchmarking FFTs (fftw.org/speed/method.html) –  Anthony Blake Nov 15 '11 at 22:12

4 Answers 4

Here is a page benchmarking different fft algorithms on ARM:


From that page the fastest FFT implementation is LibAv, which have a Neon optimized fft http://libav.org/

share|improve this answer
Interesting.. do you know if the libav FFT can be compiled by itself? And what range of sizes and types of transform it computes? –  Anthony Blake Nov 25 '11 at 13:39
Disregard the last comment; I had a look at the source code. I'll try and benchmark it versus my code next week. –  Anthony Blake Nov 25 '11 at 13:46
Antony, any results of sfft vs libav? I wasn't able to find anything faster than libav, the only part that I'd like to improve is that they don't have armv6 optimized version (neon only). Surprisingly, even the C-only version performs very well, but probably it could be doubled in speed with proper asm. –  Pavel Apr 7 '12 at 5:32
@Pavel I just benchmarked FFTS against libav, and FFTS was faster, in most cases by a factor of at least 2 –  Anthony Blake Nov 18 '12 at 23:00
@AnthonyBlake that's surprising. I'm reading my own question here more than a year later by the way :) For my own need I wasn't able to see anything close to libav/ffmpeg's fft implementation. I use it for 16bit ints in sound processing. Are your tests using floats/doubles or ints? I'm mostly interested in arm-neon optimized version, and it's extremely well optimized. –  Pavel Dec 3 '13 at 5:53

@Anthony : While NEON might handle packed format very well with the VLD instruction, it is slower than VLDMIA. Therefore, the split format is still preferable IMO. Besides, where did you take the screenshot from? Is it your own app or some public benchmarking tool?

@Brad : I don't think that the accelerate framework is very well optimized. It's fairly simple to write working NEON codes that is already many times faster than on ARM. Most NEON coders stop there since further optimizations require much more effort - regardless of how "knowledgeable" they are.

share|improve this answer
Interesting, I hadn't considered that VLDMIA was faster. I'll experiment with a first pass that reads interleaved data and stores split data, and then does most of the computation with VLDMIA/VSTMIA, before storing interleaved data in the last pass. And I'll also try doing the whole computation with split format. The benchmarking app is my own. I'll release it all as open source in a few weeks when I get a chance to clean up the source code a bit (I'm busy with a few other deadlines at the moment). –  Anthony Blake Nov 4 '11 at 4:14
I'm also working on an optimized DSP library starting with FFT. I'll post the results in eventual performance increase over vDSP. It might take some time though... –  Jake 'Alquimista' LEE Nov 4 '11 at 5:22
Sounds great.. what platform are you using? iOS? If so, I'll put the source code for the benchmarking app online ASAP -- it was the first time I've used iOS / Objective-C, so it needs an hour or so of work to clean it up.. unfortunately I have school work to attend to so I don't have a lot of spare time atm. Thanks for the VLDMIA pro-tip! –  Anthony Blake Nov 4 '11 at 5:38
You are welcome. I'm currently working on the DB for an iOS app regarding ARM and NEON instructions' cycle timings. –  Jake 'Alquimista' LEE Nov 4 '11 at 6:05
@StephenCanon Sorry, I should have made this clear: I'm not a developer who uses FFTs in products, I'm a student who has an interest in improving the state of the art -- so getting someone else to do the work gives me no satisfaction. –  Anthony Blake Nov 4 '11 at 12:25

Try also Cricket FFT. It also have Neon optimizations, and has very permissive license - zlib.

share|improve this answer

I've compared many NEON optimized FFT libraries on ARM Cortex-A9, and "libav" is certainly the fastest FFT code, but it is: - single-threaded, - only supports 1D FFTs, - only supports power-of-2 dimensions, - and doesn't have various optimizations for real input/output (it is only a complex-to-complex FFT).

On the other hand, "FFTW" (either the official version or the Vesperix version) is multi-threaded, supports 2D FFTs, supports non-power-of-2 dimensions with very little penalty, and has full optimizations for real input/output instead of just complex input/output.

So depending on your FFT requirements, FFTW might be faster for your project due to the extra features, but if you only need the FFT that libav provides (or you write the extra features yourself using NEON and multi-threading), then libav is actually the fastest 1D Complex-to-Complex FFT code.

To give you an indication, it seems that the FFTW NEON optimizations were performed by a student of the guy who performed the libav NEON optimizations. So would you rather the code from the student or the mentor ;-)

Another issue is that libav uses an LGPL license whereas FFTW uses a GPL license so is more restrictive, unless if you are willing to pay a large sum of money to purchase a proper license for FFTW.

(Personally, I ended up writing my own 2D & real-data features using NEON & multi-threading on top of libav's 1D FFT, but it was a lot of effort since I wasn't an FFT expert!)

share|improve this answer
I just benchmarked libav's NEON enabled FFT against FFTS, and FFTS was the fastest, by at least a factor of 2 in most cases. But libav was a bit faster than FFTW. –  Anthony Blake Nov 18 '12 at 22:59

Your Answer


