Próbuję zrozumieć FFT, oto co mam do tej pory:
Aby znaleźć wielkość częstotliwości w kształcie fali, należy je zbadać, mnożąc falę przez częstotliwość, której szukają, w dwóch różnych fazach (sin i cos) i uśredniając każdą z nich. Faza znajduje się w relacji do dwóch, a kod tego jest mniej więcej taki:
//simple pseudocode
var wave = [...]; //an array of floats representing amplitude of wave
var numSamples = wave.length;
var spectrum = [1,2,3,4,5,6...] //all frequencies being tested for.
function getMagnitudesOfSpectrum() {
var magnitudesOut = [];
var phasesOut = [];
for(freq in spectrum) {
var magnitudeSin = 0;
var magnitudeCos = 0;
for(sample in numSamples) {
magnitudeSin += amplitudeSinAt(sample, freq) * wave[sample];
magnitudeCos += amplitudeCosAt(sample, freq) * wave[sample];
}
magnitudesOut[freq] = (magnitudeSin + magnitudeCos)/numSamples;
phasesOut[freq] = //based off magnitudeSin and magnitudeCos
}
return magnitudesOut and phasesOut;
}
Aby to zrobić bardzo szybko dla bardzo wielu częstotliwości, FFT używają wielu sztuczek.
Jakie są sztuczki, dzięki którym FFT są znacznie szybsze niż DFT?
PS Próbowałem spojrzeć na kompletne algorytmy FFT w Internecie, ale wszystkie sztuczki są zwykle skondensowane w jeden piękny fragment kodu bez większego wyjaśnienia. Najpierw potrzebuję, zanim zrozumiem całą rzecz, jakieś wprowadzenie do każdej z tych skutecznych zmian jako koncepcji.
Dziękuję Ci.
sudo
w twoim przykładzie kodu może być mylące, ponieważ jest to dobrze znane polecenie w świecie komputerów. Prawdopodobnie miałeś na myśli psuedocode.