Amplitude berekenen met Discrete Fourier (Goertzel)

In volgend topic staat veel informatie hieromtrent
http://www.circuitsonline.net/forum/view/76952

Mijn vraag is echter hoe bereken je de amplitude met de
bekomen real and Imaginery waarden?

Er bestaat ook de optimized DFT die dan zonder Real and Imag werkt
. Kan ik deze gebruiken on een spectrum analyzer te maken met 8 freqs?

Het complex getal heet een fasor. Je kan een fasor zien als een soort vector. De lengte van de fasor stelt de amplitude voor. Je berekend de lengte als volgt:

sqrt(sqr(real)+sqr(imag))

Dus dat wordt:

Amplitude=WORTEL(REAL² + IMAG²)

En dit moet ik dan delen door het aantal samples om
de amplitude van de berekende freq te krijgen?

Inderdaad, als je de definitie van http://en.wikipedia.org/wiki/Discrete_Fourier_transform gebruikt moet je inderdaad nog delen door het aantal samples.

Is het noodzakelijk dat mijn samples een volledige periode omvat van elke te onderzoeken frequentie of is een klein deel van de periode al voldoende?

Ik gebruik voor mijn spectrum analyzer hetvolgende:

 Amplitude = sqrt((re*re)+(im*im));

Decibels = ((re == 0 && im == 0) ? (0) : 20.0 * log10(double((re*re+im*im))))

Hey Tubos

Hoe groter het venster hoe groter de spectrale resolutie. Dat wil zeggen: Hoe meer samples je gebruikt hoe makkelijker het is frequentiepieken van elkaar te onderscheiden.

Je moet heel voorzichtig zijn met de interpretatie van het resultaat van een DFT. Het is niet omdat je een amplitude krijgt voor een bepaalde frequentie in de DFT dat die exacte frequentie ook echt aanwezig is in het spectrum. Hoe meer samples je neemt hoe beter de DFT op het eigenlijke spectrum gaat lijken.

Meer info:
http://en.wikipedia.org/wiki/Short-time_Fourier_transform
http://en.wikipedia.org/wiki/Window_function

Groeten
Calvin

Bedankt voor de links maar die gaan boven mijn petje :)
Ik probeer DFT te begrijpen en het lukt me aardig voor
praktische toepassing , maar ik heb nog wat studie werk :)

Ik vond volgende interessante site over GOERTZEL:

http://www.embedded.com/story/OEG20020819S0057

Onder andere staat daar :
K=(0,5 + ( N * Targetfrequency / Samplerate) )
coeff = 2 * cos( 2PI / N * K )

Wat bedoelen ze eigenlijk met targetfrequency?

Is dat de frequentie waarvoor je de DFT van een sample berekend?

Zoja dan moet je dus voor elke nieuwe frequentie die K en coeff
opnieuw berekenen?

De targetfrequency is volgens mij de frequentie waarvan je de aanwezigheid wil detecteren.

Als je maar een klein aantal frequenties wil detecteren zal dit algoritme efficiënter zijn omdat niet alle waarden van de DFT berekend moeten worden.

Je zal dus voor elke frequentie de coef en de K moeten berekenen, maar ik ben geen specialist. Zoals de meeste ingenieurs heb ik nog nooit gehoord van dit algoritme ;-)

Ha @tubos, ik heb je mail gezien (voor de anderen: waarin mijn aandacht op deze thread werd gevestigd).

Wat wil je precies doen?
De Goertzel-berekening is handig als er een paar bekende frequenties zijn, waarvan je wilt weten hoe sterk ze in je signaal voorkomen.

Als jij bijvoorbeeld een telefooncentrale bent, en je wilt weten of er nummers worden ingetoetst, dan moet je van 8 tonen in de gaten houden of die in het signaal op de telefoonlijn zitten.
Voor iedere frequentie wordt de Goertzel-routine uitgevoerd. Dat gaat vrij snel, omdat er maar ongeveer 100 samples nodig zijn (de centrale werkt met een samplerate van 8000, dus 100 samples duren 1/80 seconde). Je pakt dus een blok samples, en voert daarop 8 keer de Goertzel uit; dan weet je of er van de 8 mogelijke DTMF toontjes soms twee bij zitten die samen een cijfer vormen.

Ik zou een voornbeeld kunnen geven, maar jij hebt exact dezelfde site al gevonden zie ik. "Target" is inderdaad de frequentie waarvan je de aanwezigheid wilt onderzoeken.

Een Fourieranalyse onderzoekt "alle" frequenties in het ingangssignaal. Het resultaat is dus niet "De gezochte frequentie is er wel/ is er niet", maar "in het ingangssignaal zitten alle frequenties met de volgende sterkten: " gevolgd door een lijst.

De originele Fourieranalyse doet eigenlijk net zo als de Goertzel, alleen dan voor iédere frequentie. Frequentie voor frequentie wordt het ingangssignaal gefilterd. Dat zou dus heel langzaam gaan!

Máár er is een belangrijke optimalisatie mogelijk, of eigenlijk twee.

Bij de DFT, de Discrete Fourier Transform, wordt alleen een rijtje frequenties afgewerkt: alleen de harmonischen van het omgekeerde van de gesamplede periode. Heb je dus een sample van 0,125 seconde lang, dan levert de DFT de amplitude van 8Hz, 16Hz, 24Hz enzovoorts, tot aan de halve bemonsteringsfrequentie toe.

Bij de FFT, de Fast Fourier Transform, wordt nòg een slimmigheid toegepast. Door alleen aantallen samples toe te staan die een macht van 2 zijn, dus bijvoorbeeld 256, 1024, of wie weet 1048576 samples. Daardoor wordt een belangijke besparing in de berekening mogelijk.

Rekenvoorbeelden voor de Goerzel en voor de DFT (niet FFT) staan in een andere thread al vermeld; daar heb ik toen ook Excel sheets geupload. Daar wordt ook de windowing functie en zijn nut (het beter weergeven van frequenties die niet precies een veelvoud van de grondfrequentie zijn) uitgelegd

Je zult even flink moeten doorlezen, maar daar staat heel veel.

Om op je eerste vraag te antwoorden, mijn bedoeling is om
in een audiospectrum een 8tal frequentie(banden) weer te geven
op een led display en dacht dat daarom DFT misschien wel in aanmerking kwam.
Dit moet in een PIC dus weinig ram voor buffers en weinig CPUtime
voor complexe berekeningen maakt ook voor dit DFT aangewezen niet?

Die andere thread heb ik echt meermaals bestudeerd alsook de xls bestanden.
Het lukt me eindelijk om de DFT te implementeren mits nog een paar
probleempjes.

Ik heb voor de constante K zowel als float of int getest:
-als float mis ik dynamiek en zijn er bergjes links en rechts
van de centfreq op te merken. ( bij gebruik van zuivere sin als
input)
-als integer zie ik dikwijls dezelfde waarden maar grotere dynamiek.
wat is aan te raden?

Ik vraag me af als ik complexere inputsample gebruik bv muziek
of ik wel genoeg range ga hebben.

Dan kan je dus zelf de sample periode en aantal samples kiezen. Dus kies een macht van twee voor het aantal samples, en werk met een FFT.

Is het noodzakelijk dat mijn samples een volledige periode omvat van elke te onderzoeken frequentie of is een klein deel van de periode al voldoende?

Stel even dat je met 1000 Hz bemonstert. Stel dat we een signaal hebben van 0.1Hz, dus 10 seconde per periode. Als je dan 100 samples neemt rond de tijd dat het signaal ongeveer nul is, gaat je FFT of DFT (of DCT) nooit een piek op 0.1Hz kunnen laten zien. Hij heeft nooit een hele periode gezien, en kan dus een kleine zaagtand van 5Hz niet van een stuk van een sinus van 0.1Hz onderscheiden. Dat doet ie dan ook niet.

Dat zou net zo gek zijn als dat je zegt:
"Eergisteren kwamen hier 40 autos per uur langs, gisteren 46, en vandaag 32. Daaruit voorspel ik een golfbeweging aan auto's met een maximum van 124 autos per dag, een minimum van 17, en een periodiciteit van 223 dagen."

Dat je hobbels links en rechts van de piek ziet, is normaal voor zo'n simpel filter. Dit is de basis:
http://www.uploadarchief.net/files/download/sinc%28x%29_20100414.png
De nulpunten liggen op afstanden gelijk aan de omgekeerde van de gesamplede periode.
Een DFT lijdt aan precies hetzelfde, en wel om dezelfde reden.
Wil je mooier, kijk dan in ieder geval eerst naar de windowing functies.

En hoe zit dat met die K constante ? Zijn dat integer waarden of floating point?

Op de website die je zelf al gevonden had, wordt k berekend als een integer.
Maar dat maakt weinig uit, want het eerste dat ze er daarna mee doen, is w berekenen; en vervolgens moet je daar weer de cosinus van hebben. Dat zijn allemaal géén gehele getallen.

Op een andere plaats zag ik hoe w rechtstreeks berekend werd, dus zonder tussenstap met k. Maar ook daar uiteraard als niet-geheel getal.

Wat er met een PIC allemaal kan, en hoe dat moet, weet ik niet; daar zijn anderen gelukkig heel handig mee.

Ik heb nu zo'n een excel blad met een sample bestaande uit 256 waarden die een samenstelling van 2 cosinussen bevat:

Nl een op 200hz en een op 1000hz als ik nu een DFT toepas op beide
signalen zie ik een hele hoop troep.

Als ik beide frequenties verschuif krijg ik hele andere resultaten
in het spectrum vreemd, soms zijn beide frequenties in het spectrum
niet te onderscheiden.

Het is hiervandaan moeilijk te zien waar je de fout maakt.
Upload het maar, dan kijken we.

http://www.2shared.com/file/12582161/e0e47c1c/Goertzel.html

Klik beneden rechts SAVE TO PC

Alternatief:
http://www.uploadarchief.net/files/download/goertzel.zip

[Bericht gewijzigd door tubos op (29%)]

Sorry, daar gaan we dus niet aan beginnen.

Gebruk maar het uploadarchief.

Hoe bedoel je?
Er is niks te installeren of registreren of invullen hoor.

gewoon op "click here" duwen en je hebt rechtstreeks mijn bestand

Save file to your PC: click here

[Bericht gewijzigd door tubos op (43%)]

Nee. Ik zit nú al met tig popups (geblokkeerd, weliswaar) en een hinderlijk reclamevenster voor een goksite. Ik zou me daar gek zijn daar nog een beetje te gaan klikken.

Wat een klote-site. Het is dat je zegt waar ik moet klikken, anders had ik het niet gevonden...

Met Excell werkt dit echt voor geen meter. Ben je van plan vaker dit soort dingen te doen? Gebruik dan Mathematica, mathcad o.i.d.?

Je hebt 256 samples. In dat geval moet je ook 256=2*128 (complex en imaginair) meetpunten hebben. Anders mis je een hele hoop data.

Nee De bedoeling is optimized Goertzel te gebruiken
daar heb je geen imag en reele waarden.

Enige nadeel is dat je niet de fase kan berekenen maar
die heb ik voor mijn toepassing niet nodig.

Zie link in begin van deze topic

@FET ik heb ook de file op archief geplaatst zie boven.

[Bericht gewijzigd door tubos op (11%)]

Ik zit nog met je vraag naar "integer".

Je weet hoop ik dat in Excel de integer-functie INTEGER heet?
Klinkt stom, maar de laatste keer dat iemand daarmee in de knoop zat, wisten ze niet wat het was en hadden ze domweg maar AFRONDEN gebruikt, en nog niet eens op nul cijfers achter de komma. :+

Niet alleen lag toen de waarde gemiddeld een half te hoog, maar echt een geheel getal leverde dat ook niet op..

e: Eh, oeps, daar gaan we dus al. Even corrigeren dus.

Iets anders: heb je eigenlijk in de gaten dat, met een samplefrequentie van 8000 en een samplegrootte van 256 samples, de rasterfrequentie (om het zo maar eens te zeggen) 31,25 Hz is?
Als je dus maar om de honderd Hz de amplitude berekent, mis je de meeste frequenties. In de bin van 980 zul je 935 dus niet vangen.

e2: Je kunt, als je wilt, AFRONDEN wel gebruiken, maar op nul cijfers. En je moet dan natuurlijk géén 0,5 optellen.

Nog een correctie op de algoritme van de website:
Op het eind, waar je het totaal uitrekent, staat er op de site:

Sorry, niet goed gekeken, alles klopt wel degelijk daar.

[Bericht gewijzigd door Frederick E. Terman op (12%)]