08. december 2003 - 19:41Der er
4 kommentarer og 1 løsning
invers discreet fourier transform
Jeg står og skal have flyttet nogle data fra frekvens domænet og til tidsdomænet ved hjælp af fourier transform. Jeg ønsker at benytte invers discreet fourier transform og altså IKKE fft. at komme fra tidsdomænet til frekvens domænet har ikke været så svært, men den anden vej - løsningen skal være i c++ - kan nogen hjælpe
Hvordan formlerne/algoritmerne ser ud for Fast Fourier Transform (FFT) er jeg ikke ekspert i (FFT er en hurtig måde for vise tal N at beregne DFT på en computer).
Skal man finde den inverse til FFT mener jeg stadig det nemmeste er at sige IFFT = "FFT anvendt 3 gange".
Jeg beklager at jeg ikke har reageret på jeres kommentarer tidligere - jeg har haft meget travlt, og i mellemtiden har jeg selv fundet svaret, hvorfor jeg helt har glemt at jeg havde oprettet et spørgsmål her. I skal have tak for jeres hjælp, omend svaret ligger et stykke fra det jeg skulle bruge. Såfremt nogen skulle have interesse i at vide hvordan idft fungerer kan jeg lige kort vise det her: idet dft (fft) anvendes til at finde frekvensspektret i et samplet signal (eks. lyd) går man fra en række samples der beskriver signalets amplituder til en række complekse tal der beskriver frekvensindholdet af signalet. Idet en dft bruger samples værdier og spytter complekse tal ud kan jeg ikke lige se hvorvidt det skulle være muligt at sætte complekse tal ind og få samplesværdier ud (jævnfør Torbens kommentar) - selvom den inverse dft ligner dft'en. Men koden for idft er her, hvis andre nu skulle stå og få brug for den
void iDFT::invDFT () { for (long f = 0; f < buffersize; f++) { sigreal[f]=0; for (long k = 0; k < buffersize; k++) { double arg = (2.0 * pi * k * f )/ buffersize; if (f == 0 || k == 0) { sigreal[f] +=realarray[k]*cos(arg); } else { sigreal[f] +=realarray[k]*cos(arg) - imagarray[k]*sin(arg); } } }
}
buffersize er lig med antallet af data i dine arrays (det skal måske her nævnes at det føromtalte komplekse tal ligger i to arrays - et indholdene de reelle værdier, og et indholdende de imaginære værdier)
selvom dine samples er reele (ikke komplekse) eller komplekse tal kan en DFT hhv. en IDFT begge godt ende op i reele værdier. Det er der ikke noget specielt i.
Ovenstående C++ metode invDFT er faktisk en implementation af den formel jeg tidligere angav for IDFT under forudsætning af at dine tids-samples oprindeligt var reele og at realarray[k],imagarray[k] er de tilsvarende komplekse koefficienter for de Fourier transformerede tids-samples. sigreal er så de oprindelige reele tids-samples.
Men jeg har to kommentarer til iDFT::invDFT, 1) Den algortime du anvender er ikke FFT (invers) men DFT (invers), som du også navngiver metoden. FFT og invers FFT er algoritmer, som giver samme result, men er optimalt hurtige at beregne for visse værdier af buffersize. 2) Din if-statement med f==0 || k==0 er unødvendig da sin(0)=0, og ønsker du en hastighedsoptimering bør du gemme cos(arg) og sin(arg) i nogle arrays.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.