Ich versuche FFTs zu verstehen, hier ist was ich bisher habe:
Um die Größe von Frequenzen in einer Wellenform zu finden, muss man nach ihnen suchen, indem man die Welle mit der Frequenz, nach der sie suchen, in zwei verschiedenen Phasen (sin und cos) multipliziert und jeweils einen Durchschnitt bildet. Die Phase wird durch ihre Beziehung zu den beiden gefunden, und der Code dafür ist ungefähr so:
//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;
}
Um dies für sehr viele Frequenzen sehr schnell zu tun, verwenden FFTs viele Tricks.
Mit welchen Tricks sind FFTs so viel schneller als DFT?
PS Ich habe versucht, fertige FFT-Algorithmen im Web zu betrachten, aber alle Tricks lassen sich ohne viel Erklärung zu einem schönen Stück Code zusammenfassen. Was ich zuerst brauche, um das Ganze zu verstehen, ist eine Einführung in jede dieser effizienten Änderungen als Konzepte.
Vielen Dank.
sudo
in Ihrem Codebeispiel verwirrend sein kann, da dies ein in der Computerwelt bekannter Befehl ist. Du hast wahrscheinlich Pseudocode gemeint.