Een klein stukje theorie, zonder rekenwerk.
Als je een signaal f door een filter leidt, komt hier een ander signaal uit. Het uitgangssignaal het signaal is nogal ingewikkeld te berekenen, daarvoor moet je het signaal en het filter convolueren. Het convolutieteken is een sterretje, soms met een cirkeltje eromheen. Het uitgangssignaal ziet er als volgt uit:

Om je daar een beter beeld van te vormen kun je hier zien wat er gebeurt als je een blauw en een rood signaal convolueert, het resultaat is het groene signaal. Twee voorbeelden:

Aan de hand van de plaatjes kun je wel zien dat convolutie een ingewikkeld proces is dat erg veel rekenkracht kost. Daarom is er een prachtige oplossing gevonden, die gebruikt maakt van Fouriertransformaties. Als je de signalen f en g transformeert, kun je de ingewikkelde convolutie-bewerking vervangen door een eenvoudige vermenigvuldiging. Het resultaat transformeer je terug met de omgekeerde Fouriertransformatie en ziedaar: het uitgangssignaal.
Stel dat je
h =
wilt uitrekenen. De Fouriergetransformeerde van f is F, de Fouriergetransformeerde van g is G. H is de fouriergetransformeerde van H. Nu geldt:
H = F ×G
In de praktijk blijkt dat het minder (computer)rekenwerk kost om f en g te transformeren naar F en G, dan F en G te vermenigvuldigen (dit resulteert in H) en H terug te transformeren naar h.
Als je een tijdafhankelijk signaal hebt, is de Fouriergetransformeerde de representatie van datzelfde signaal in het frequentiespectrum. Daarom maken digitale signaalbewerkers (DSP's, digitale equalizers) ook vaak gebruik van Fouriertransformaties.
Tot zover de theorie. Bij AMD kun je gratis een bibliotheek met functies t.b.v. Fouriertransformaties downloaden. Voorbeelden in C zijn bijgevoegd in de download. Het is de AMD Core Math Library, kortweg ACML.
Ik heb de fourierfuncties laatst in Delphi getest en het resultaat is veelbelovend, de functies werken erg eenvoudig. Helaas loop ik tegen een vaag probleem aan dat de applicatie die de ACML aanroept altijd crasht bij afsluiten. Blijkbaar doe ik nog iets verkeerd, alleen weet ik niet wat.
Nog een aanvulling. De Fast Fourier Transform is een vorm van de Fouriertransformatie die veel efficiënter rekent. Voorwaarde in de meeste implementaties is dat het aantal samples een macht van twee is (16, 32, 64, 128...). Vaak ligt het maximale aantal samples bij 1024, 2048 of 4096. Jij wilt een kleine 65000 samples transformeren, dat is veel te veel. Ten eerste is dat waarschijnlijk onnodig voor het doel dat je wilt bereiken, ten tweede is het geen macht van 2 (hoewel je de array zou kunnen aanvullen met nullen), ten derde vinden veel algoritmes zoveel samples te veel en ten vierde is het onnodig (onwerkbaar?) rekenintensief.
Als je een signaal f door een filter leidt, komt hier een ander signaal uit. Het uitgangssignaal het signaal is nogal ingewikkeld te berekenen, daarvoor moet je het signaal en het filter convolueren. Het convolutieteken is een sterretje, soms met een cirkeltje eromheen. Het uitgangssignaal ziet er als volgt uit:

Om je daar een beter beeld van te vormen kun je hier zien wat er gebeurt als je een blauw en een rood signaal convolueert, het resultaat is het groene signaal. Twee voorbeelden:

Aan de hand van de plaatjes kun je wel zien dat convolutie een ingewikkeld proces is dat erg veel rekenkracht kost. Daarom is er een prachtige oplossing gevonden, die gebruikt maakt van Fouriertransformaties. Als je de signalen f en g transformeert, kun je de ingewikkelde convolutie-bewerking vervangen door een eenvoudige vermenigvuldiging. Het resultaat transformeer je terug met de omgekeerde Fouriertransformatie en ziedaar: het uitgangssignaal.
Stel dat je
h =

wilt uitrekenen. De Fouriergetransformeerde van f is F, de Fouriergetransformeerde van g is G. H is de fouriergetransformeerde van H. Nu geldt:
H = F ×G
In de praktijk blijkt dat het minder (computer)rekenwerk kost om f en g te transformeren naar F en G, dan F en G te vermenigvuldigen (dit resulteert in H) en H terug te transformeren naar h.
Als je een tijdafhankelijk signaal hebt, is de Fouriergetransformeerde de representatie van datzelfde signaal in het frequentiespectrum. Daarom maken digitale signaalbewerkers (DSP's, digitale equalizers) ook vaak gebruik van Fouriertransformaties.
Tot zover de theorie. Bij AMD kun je gratis een bibliotheek met functies t.b.v. Fouriertransformaties downloaden. Voorbeelden in C zijn bijgevoegd in de download. Het is de AMD Core Math Library, kortweg ACML.
Ik heb de fourierfuncties laatst in Delphi getest en het resultaat is veelbelovend, de functies werken erg eenvoudig. Helaas loop ik tegen een vaag probleem aan dat de applicatie die de ACML aanroept altijd crasht bij afsluiten. Blijkbaar doe ik nog iets verkeerd, alleen weet ik niet wat.
Nog een aanvulling. De Fast Fourier Transform is een vorm van de Fouriertransformatie die veel efficiënter rekent. Voorwaarde in de meeste implementaties is dat het aantal samples een macht van twee is (16, 32, 64, 128...). Vaak ligt het maximale aantal samples bij 1024, 2048 of 4096. Jij wilt een kleine 65000 samples transformeren, dat is veel te veel. Ten eerste is dat waarschijnlijk onnodig voor het doel dat je wilt bereiken, ten tweede is het geen macht van 2 (hoewel je de array zou kunnen aanvullen met nullen), ten derde vinden veel algoritmes zoveel samples te veel en ten vierde is het onnodig (onwerkbaar?) rekenintensief.
[ Voor 17% gewijzigd door Tomatoman op 15-04-2004 02:30 ]
Een goede grap mag vrienden kosten.