birdwes - 2013-11-28

Hi and welcome,

Some early code should follow soon. It's a fixed point Q15 (16/32 bit int) implementation of FFT from the time domain to the frequency domain.

It's only a little project, for ARMv6 and better, on Raspberry Pi and B4A. There are faster implementations for Neon chipsets, but that's not the point of this project. The Raspberry Pi does not do Neon. Nor do some older phones: http://forum.xda-developers.com/showthread.php?t=1596800 .

The intention is that this should be totally platform agnostic, and I would welcome collaborators for Android MIPS and Intel ports.

Inspired by the algorithm on page 32.. of http://documentation.renesas.com/doc/DocumentServer/U17285EE2V0AN00.pdf .

Additional enhancements come from "Improving FFT Frequency Measurement Resolution by Parabolic and Gaussian Interpolation" by M. Gasior, J.L. Gonzalez. http://cds.cern.ch/record/738182/files/ab-2004-023 .

A credit to http://pulsar.webshaker.net/ccc/ must be mentioned. This project would not have been easily possible without that tool.

I don't mind end user developers taking this and reusing it, but I would rather that you also learn a little from the the research side (even if it is just of optimising C) of some of what I intend to document in the next few weeks.

The code is not yet tidy enough for public view, but the core assembler parts are just about complete.

I'm getting about 10000 256 point time->freq transforms to real and imaginary components in about a second (on a 700MHz Raspberry Pi).

On a 4096 point transform from 48000Hz, it's accurate to better than 10ppm, or 0.01Hz. Resolution is obviously governed by the FFT bin width (i.e. Frequency/Sample buffer size).

 

Last edit: birdwes 2013-11-29