Hey,
Is het mogelijk om met FFT de frequentie van een sinus te meten?
Of wordt FFT enkel gebruikt om signalen te ontleden?
Heeft iemand een paper om met FFT frequenties te meten?
Een sinus bestaat slechts uit 1 frequentie dus als je die FFT't zie je slechts enkel de frequentie van de sinus.
FFT wordt inderdaad gebruikt om signalen te ontleden in individuele frequenties, maar zoals gezegd bestaat een sinus slechts uit 1 frequentie.
Je kan de frequentie van een sinus dus uitstekend met FFT meten.
[Bericht gewijzigd door Neen op (12%)]
rbeckers
Overleden
Mischien een van de volgende, wel niet erg specifiek.
http://cp.literature.agilent.com/litweb/pdf/5952-0292.pdf
http://cp.literature.agilent.com/litweb/pdf/5980-3081EN.pdf
De FFT zal normaal gesproken een array van getallen leveren.
Als je nu daaruit de grootste amplitude zoekt, dan moet dat haast degene zijn waarvan zijn rang overeenkomt met de frequentie die je zoekt.
Dus zoek naar de Y met de grootste ABS(Y), en dan is zijn X je frequentie.
rbeckers
Overleden
Voor een sinus is dat maar een piek.
Meestal wordt FFT voor complexere signalen dan een sinus gebruikt. 
De nauwkeurigheid van de frekwentiemeting is bij een losse frekwentiemeter in het algemeen wel veel beter.
Men signaal bestaat uit 4 frequenties. Allemaal sinusen. De frequenties komen uit de fourier transformatie.
Ik zou alle 4 de frequenties tegelijk moeten kunnen meten.
Gek genoeg maakt dat de zaak niet duidelijker voor me. 
Over welke situatie hebben we het. En wat voor spullen wil je gebruiken voor de verbinding, voor het meten, voor de berekening, voor de presentatie?
Ik wil de signalen meten met een antenne. Dit signaal gaat over een 4de orde butterworth zodat ik mooi men sinussen aan de AD kan toevoeren.
Hoogste signaal dat ik wil meten is 12,5 kHz. Dus een sample rate van 25 kHz lijkt me voldoende.
Het aantal samples in een tabel zetten en dan laten berekenen met sin(2*Pi*N/t).
Maar hoe nu de 4 frequenties tegelijk meten.
De clou van een FFT (Fast Fourier-transform) is dat je de éne tabel in de andere omzet.
Je stopt er een tabel tijdsamples in, en er komt een tabel frequentiesamples uit.
Die hoef je alleen maar te sorteren op amplitude, en van de vier grootste te kijken welke rangorde erbij stond.
Uiteraard geldt, hoe meer samples je hebt, hoe smaller de "bins" worden, dus hoe nauwkeuriger je de frequenties kunt bepalen. Als je tot op één Herz wilt meten, moet je minstens één seconde aan samples hebben.
Om dit te proberen kun je trouwens leuk Excel gebruiken (of een vergelijkbare spreadsheet). Daar zit een Fourier functie in als je het Analyse-pack, dat bij Excel zit, hebt geïnstalleerd. Je maakt dan een tabel met bijvoorbeeld 1024 samples aan, selecteert hem, laat er de Fourier op los en hop: daar heb je een nieuwe tabel met 1024 FFT componenten (in complexe vorm) erin. Handig! Het aantal samples moet hier wel een macht van twee zijn.
Wanneer je 4 frequenties wilt meten kan je ook gebruik maken van het Goerzel-algoritme.
Dit is veel sneller als FFT omdat je ook, alleen de gewenste frequentie kan zoeken in het het signaal.
En wanneer je PC SIMD instructies aan kan kan je 4 verschillende frequenties in 1 keer meten.
Dit kan super snel, zeker wanneer je de coëfficiënten van de te meten frequenties voor-berekent.
Nog een voordeel:
Het aantal te analyseren samples hoeft geen macht van twee te zijn.
voor meer info: http://www.embedded.com/story/OEG20020819S0057
Als je al wéét welke frequenties je wilt meten is het gemakkelijker, ja. Wij hebben hier een boel spul staan dat op die manier gemonitord wordt - in ons geval zijn alle interessante frequenties veelvouden van 30 Hz. Omdat we zeker zijn van die frequentie (de grondfrequentie wordt op een andere manier nauwkeurig gecontroleerd), wordt er niet op de Hz nauwkeurig gemeten. Zo kun je snel werken, theoretisch zouden we 30× per seconde een complete meting kunnen doen.
En hebben we die eenmaal gedaan, dan noemen we wat er overblijft "distortion". 
Hey bedankt,
Het Goerzel-algoritme lijkt me wel wat. Men frequenties zijn gekent en zijn berekent met DFT.
Siekmanski, heb je die SIMD instructies ook op een MCU? En wat zijn SIMD instructies?
Kan Goerzel ook frequenties meten, of is het enkel voor gekende frequenties te detecteren?
Want je moet al een sinus en cosinus hard coderen.
[Bericht gewijzigd door OBBO op (17%)]
Hallo OBBO
SIMD: Streaming "Single Instruction Multiple Data"
hier wat info:
http://softpixel.com/~cwright/programming/simd/
Ik weet niet of er MCU's zijn met SIMD instructies.
Zonder SIMD is het ook snel te doen hoor.
Hier is de formule voor de geoptimaliseerde Goertzel routine (geen fase informatie):
Voor-bereken coëfficiënten:
PI = 3.14159265358979323846
coëfficiënt = 2 * ( cosinus( ((2*PI / (aantal te onderzoeken samples)) * (0.5 + (aantal te onderzoeken samples) * (te onderzoeken frequentie) / samplerate)) ) )
herhaal dit voor elke frequentie die je wilt berekenen en plaats ze in een tabel.
Haal de magnitude van de voor-berekende coëfficiënt van de gewenste frequentie:
q1,q2,i == 0
lus: q0 = (coëfficiënt * q1) - q2 + sample(i)
q2 = q1
q1 = q0
i = i+1
naar lus (maal aantal te onderzoeken samples)
magnitude = (q1 * q1) + (q2 * q2) - (q1 * q2 * coëfficiënt)
De coëfficiënten kan je eventueel op de PC uitrekenen i.p.v. op de MCU
dan hoef je geen (co)sinus berekeningen te doen op je MCU
Tnx Siekmanski, dit is enkel om de tonen te detecteren en amplitude te berekenen.
Kan ik met het imaginaire en reële deel terug rekenen naar de hoekfrequentie?
Oh, ja dan meet ik gewoon terug men frequentie die ik heb gehard code...
Afwijkende frequenties van men 4 frequenties ga ik dus niet kunnen meten als ik ze niet hard code?
Is er een limiet van het aantal frequenties?
[Bericht gewijzigd door OBBO op (24%)]
Is er een limiet van het aantal frequenties?
van 0 tot hoogste frequentie (samplerate/2 (Nyquist))
alles wat daar tussen zit (oneindig eigenlijk)
[Bericht gewijzigd door Siekmanski op (33%)]
Dit is een interessant topic hoor, en ik wil niet klagen.
Maar het valt me wel op dat de opening was:
Is het mogelijk om met FFT de frequentie van een sinus te meten?
terwijl nu blijkt dat:
Men frequenties zijn gekent en zijn berekent met DFT
(FFT is een bepaalde vorm van DFT, waarbij door een handige keuze van aantal samples de berekening vereenvoudigd wordt.)
De vraag had dus beter kunnen luiden:
"Is het mogelijk met FFT de amplitude van een sinus van bekende frequentie te meten?"
En de beste opening was misschien geweest:
"Door een draad lopen vier sinusvormige stromen van bekende frequentie.
Kan ik met FFT in één keer van alle vier de amplitude meten?"
Maar goed, we zijn er nu ook.
De routine van Siekmanski doet, lijkt me, alles wat je wilt. Je frequenties moeten wel bekend zijn.
De scherpte waarmee de routine onderscheid kan maken, hangt natuurlijk af van het aantal samples dat je per meting hebt.
Frederick, excuseer mijn onervarenheid....
Wist niet dat Goerzel bestond en voor gekende frequenties werd gebruikt.
Is een mooie aanvulling van men DSP kennis. Tnx!
Ik ga eerst met de 205 samples van de voorbeeldroutine proberen.
[Bericht gewijzigd door OBBO op (17%)]
Dat geeft ook niks, bovendien heb ik er weer een naam (Goerzel) bijgeleerd. Daarom vind ik dit ook zo'n leuk forum.
stecj366
Sonar is meer dan Ping...
Goertzel is inderdaad een efficient algoritme als je slechts een beperkt aantal frequenties (n_f) wil meten uit een tijdssignaal van n_s samples.
Goertzel is efficiënter als n_f << n_s. Er zit ergens een kantelpunt waar de twee even veel rekentijd vragen (dus rekentijd in functie van n_f). En dat is niet als n_f = n_s, het zit ergens in het midden dacht ik.
Maar voor jouw vier frequenties zou ik ook een Goertzel gebruiken, dat gaat het snelste zijn.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Je kunt bijvoorbeeld de DTMF code van Radu Constantinescu gebruiken (ook Goerzel algo)
http://dtmf.voipintouch.net/content/dtmf.htm
Je moet dan alleen de frequenties aanpassen...
RES
RES
van 0 tot hoogste frequentie (samplerate/2 (Nyquist))
alles wat daar tussen zit (oneindig eigenlijk)
Was Nyquist niet samplerate/2.2?