Zaokrąglij ilość próbek do najbliższej potęgi dwójki wypełniając lukę zerami (jeżeli ich ilość wzrosła). Zrób FFT i znajdź indeks najwyższej magnitudy. Częstotliwość o najwyższej energii obliczysz mnożąc znaleziony indeks przez połowę częstotliwości próbkowania podzieloną przez ilość magnitud zwróconych z FFT.
Co do algorytmu, to może zacznij od How to FFT
EDIT: ... podzieloną nie przez ilość próbek, tylko przez ilość danych zwróconych z transformaty minus jeden. Dla typowej transformaty real(czyli float)->complex(czyli 2float) ich ilość to (ilość_próbek /2 +1).
Gdy zaokrąglisz 1000 do 1024, to otrzymasz 513 liczb kompleksowych z transformaty (513 par po dwa floaty), więc dzielisz połowę częstotliwości próbkowania przez 512.
Magnitudę każdej takiej pary obliczysz pierwiastkując sumę kwadratów sqr(aa + b*b), zaczynając od indeksu 1, który jako pierwszy niesie informację o niezerowej częstotliwości.
I tak jak kolega poniżej napisał - zmień double na float. Double jako nośnik danych w PC wprowadza mniejsze od floata straty podczas przenoszenia danych między pamięcią a procesorem, dlatego tak chętnie jest używany.
Tablicę próbek zmień we floaty w miejscu, albo zmodyfikuj FFT tak, żeby przyjmowało integery zamiast float. Jedna z tych metod na pewno będzie wydajniejsza.
struct complex{float a,b;};
int próbki[1024];
// int2float(próbki,1024);
// hanningwindow(próbki,1024)
complex out[513]; // 513 = 1024/2+1
fft(próbki, out, 1024);
float fmax=cabs(&out[1]); // pierwiastek sumy kwadratów
int imax = 1;
for (i=2; i<=512; i++)
{
float moc = cabs(&out[i]);
// fmax przechowuje aktualne maksimum
if (moc>fmax) {fmax=moc; imax=i;}
}
// tutaj imax jest indeksem częstotliwości o najwyższej energii. Oblicz dominującą częstotliwość
float freqmax = imax * ((samplerate/2)/512);
Gdyby program zbytnio lagował, to może sięgnij po algorytm goertzel'a gdzie obliczasz poziom mocy tylko wybranych częstotliwości, zamiast - jak powyżej - aż 513.