Frederick, het Fourier mechanisme begrijp ik niet. En daar zal ik waarschijnlijk de mist ingaan.
Ik heb deze code gebruikt om te testen:
int N;
float A, B;
for(N = 0; N < 256; N++) Table[N] = 0;
for(N = 1; N < 256; N++){
A = N - 1;
A = A * ((veelvoud) * (PI));
A = A / 128;
B = sin(A);
B = B * 120;
B = B + 128;
Table[N] = (int)B;Maar ik heb gemerkt dat deze niet in het tijdsdomein staat. Daarom dat de FFT dit interpreteert als een gelijkspanning.
De periode is 2PI en zijn veelvouden. Hoe zet ik deze in het tijdsdomein?
Sorry, met code kan ik je niet helpen. Ik geef dus maar weer een voorbeeld. Let op, waar je op het moment mee bezig bent is géén FFT, maar een gewone DFT.
Je hebt een rij samples, 22000 stuks (0 t/m 21999), tezamen goed voor 1 seconde.
Je maakt van te voren een verzameling cosinussen voor verschillende frequenties:
COS(2π N t/22000) en SIN(2π N t/22000)
t loopt steeds van 0 t/m 21999; dat is het samplenummer
N loopt van 0 tot, zeg, 10000; dat is de frequentie waarop je test.
Iedere cosinus en iedere sinus bestaat dus zelf óók uit 22000 samples, samen goed voor 1 seconde.
(bij N=0 zijn de COS allemaal 1. En de SIN allemaal 0. Die hoef je dus eventueel niet uit te rekenen.
)
Nu reken je steeds, voor iedere N, een productensom uit. Voor alle samples t van 0 tot en met 21999 neem je
[sample(t)] MAAL [berekende N-de COSfunctie(t)].
Alles bij elkaar optellen. Dat is het reële gedeelte van het aandeel in het signaal van frequentie N.
Daarna idem, maar dan met de N-de SINfunctie(t). Dat levert het imaginaire gedeelte van het aandeel in het signaal van frequentie N.
Natuurlijk kun je kleinere hoeveelheden samples nemen, en je hoeft ook niet per se precies één seconde vol te sampelen.
---
Nu moet je dit eerst eens proberen in Excel of een vergelijkbaar rekenblad, of in een analyseprogramma, of gewoon zoals vroeger, op papier:
Maak een functie, neem 32 samples.
Maak proefsinussen en cosinussen van ieder ook 32 samples. Neem frequenties N van 0 t/m 15.
Maak de berekeningen en kijk wat er uit komt.
Pas als je dit ECHT gedaan hebt, kunnen we verder met gebroken frequenties, windowing, aliasing etc.
Frederick, kan ik deze DFT die je me geeft dan gebruiken voor men uiteindelijke programma?
Ik ga proberen dit in een algortime te gieten, dan heb ik al een FT.
int DFT(int dir,int m,double *x1,double *y1)
{
long i,k;
double arg;
double cosarg,sinarg;
double *x2=NULL,*y2=NULL;
//x2 = malloc(m*sizeof(double));
//y2 = malloc(m*sizeof(double));
//if (x2 == NULL || y2 == NULL)
//return(FALSE);
for (i=0;i<m;i++) {
x2[i] = 0;
y2[i] = 0;
arg = - dir * 2.0 * 3.141592654 * (double)i / (double)m;
for (k=0;k<m;k++) {
cosarg = cos(k * arg);
sinarg = sin(k * arg);
x2[i] += (x1[k] * cosarg - y1[k] * sinarg);
y2[i] += (x1[k] * sinarg + y1[k] * cosarg);
}
}
/* Copy the data back */
if (dir == 1) {
for (i=0;i<m;i++) {
x1[i] = x2[i] / (double)m;
y1[i] = y2[i] / (double)m;
}
} else {
for (i=0;i<m;i++) {
x1[i] = x2[i];
y1[i] = y2[i];
}
}
//free(x2);
//free(y2);
return(TRUE);
}Dit is de gewone DFT. Ik haal men samples er een keer door.
Het resultaat van de tabel is helemaal anders dan bij de FFT?
Met code kan ik je niet helpen. Ik heb hier al een aantal uurtjes ingestoken, maar ik trek de grens bij C leren. 
De FFT is alleen een speciale toepassing van de DFT, met een paar handigheidjes die de hoeveelheid rekenwerk beperken. Verder niet.
Als je wilt begrijpen hoe de DFT (iedere DFT) werkt, zul je die oefening echt even moeten doen.
Frederick, excuseer voor al de c code. Dit algoritme doet de DFT die je hebt beschreven met het imaginaire en reële deel.
Het vermenigvuldigd elke sample met de cos en sin van het aantal frequenties die in het spectrum voorkomen.
Frederick, ik heb me een klein beetje verdiept in de DFT en begin het door te hebben.
Je vermenigvuldigd de samples met het aantal aan sinussen en cosinussen die je wil analyzeren.
Als het gemiddelde van één van die vermenigvuldigingen niet nul is(de amplitude), wil dit zeggen dat de frequenties gelijk zijn.
Alsook de faseverschuiving is dan nul en imaginair en reëel dus ook nul oplevert.
Op 7 oktober 2009 21:48:42 schreef OBBO:
Als het gemiddelde van één van die vermenigvuldigingen niet nul is(de amplitude), wil dit zeggen dat de frequenties gelijk zijn.
Ja, dat is ook al een paar keer gezegd, hier bijvoorbeeld:
Dat een bepaalde frequentie alleen een aandeel levert als de test-n ermee overeenkomt, is gemakkelijk in te zien: het product van twee sinussen met ongelijke frequenties is zelf weer de som van twee andere sinussen (met de som-en verschilfrequenties). Die som zal dus gemiddeld altijd nul opleveren.
Heb je een DFT nu al eens zelf geprobeerd, in Excel bijvoorbeeld (NIET met de bijgeleverde FFT functie, maar gewoon in het rekenblad)? Dan zou je het al eerder gesnapt hebben. Daarom wilde ik ook dat je dat zou doen.
Je laatste zin:
Alsook de faseverschuiving is dan nul en imaginair en reëel dus ook nul oplevert.
snap ik niet.
Op 7 oktober 2009 21:48:42 schreef OBBO:
Alsook de faseverschuiving is dan nul en imaginair en reëel dus ook nul oplevert.
De formulering is niet goed.
Als de faseverschuiving tussen gesampled signaal en het 'probe' signaal nul is dan is de amplitude het grootst.
Als er faseverschuiving aanwezig is, dan is de amplitude proportioneel met de cos van het faseverschil.
De amplitude zakt met de cos curve en gaat naar nul bij PI/2 rad. Want daar is de cos nul.
Ja, daarom moet je ook niet alleen met de cos vermenigvuldigen, maar daarna ook nog eens met de sinus.
Maar dat is allemaal al besproken.
Nu reken je steeds, voor iedere N, een productensom uit. Voor alle samples t van 0 tot en met 21999 neem je
[sample(t)] MAAL [berekende N-de COSfunctie(t)].
Alles bij elkaar optellen. Dat is het reële gedeelte van het aandeel in het signaal van frequentie N.Daarna idem, maar dan met de N-de SINfunctie(t). Dat levert het imaginaire gedeelte van het aandeel in het signaal van frequentie N.
Misschien een idee om deze hele thread nog eens vanaf het begin te lezen. Alles staat er al een paar keer in. 
En doe toch nog eens even die Excel oefeningetjes alsjeblieft. Toegegeven, het kost je een half uur, maar het bespaart mij een veelvoud.. 
jovak
meten is weten, weten is meten, maar hoe kan je weten wat je allemaal moet meten en weten.
Misschien ook handig om door te lezen
Hoofdstuk acht, afbeelding "EQUATIONS 8.4" (een eindje naar beneden scrollen, daar staat hij).
Wie kent dit dit boek nu niet uit zijn hoofd.
:):)
Op 8 oktober 2009 13:34:23 schreef Frederick E. Terman:
Hoofdstuk acht, afbeelding "EQUATIONS 8.4" (een eindje naar beneden scrollen, daar staat hij).Wie kent dit dit boek nu niet uit zijn hoofd.
:):)
hehe... ik!
Ik ga dit weekend de samples een kéér uitrekenen met een spreadsheet.
Ik begin het nu wel door te hebben.
jovak
meten is weten, weten is meten, maar hoe kan je weten wat je allemaal moet meten en weten.
Op 8 oktober 2009 13:34:23 schreef Frederick E. Terman:
Hoofdstuk acht, afbeelding "EQUATIONS 8.4" (een eindje naar beneden scrollen, daar staat hij).Wie kent dit dit boek nu niet uit zijn hoofd.
:):)
Ik ken het niet uit mijn hoofd, maar een collega heeft me ooit de link naar die site gegeven. 
Frederick, mijn resultaten van men berekeningen van de spreadsheet kloppen niet met de theorie.
Het resultaat van de somproduct van een frequentie 1 Hz met 32 samples met een 'probe' cosinus en sinus van 1 Hz 32 samples, geeft mij een reëel aandeel van 0 en een héél hoog imaginair aandeel?
Het reëele deel kan toch niet nul zijn?
De scaling van het signaal en 'probe signalen' zijn de zelfde.
Van een sinus is het reële gedeelte natuurlijk nul. Die is zuiver imaginair.
Een cosinus is zuiver reëel.
Mail me je spreadsheet maar even, dan kijk ik wel. Adres staat in mijn profiel.
Ik heb je spreadsheet bekeken. Er mankeert niet zoveel aan, alleen je testsinus (en cosinus) hebben een amplitude van 120. Dan wordt je uitkomst natuurlijk 120 maal zo hoog.
Nu heb je 230400. Normaal zou dat dus 1920 zijn. En 1920 gedeeld door het halve aantal samples levert netjes 1920/16= 120; en dat is ook de amplitude van de gezochte sinus.
Uit de mail:
Ik deel daarna terug door 120, maar is inderdaad niet nodig.
De amplitude van het signaal is dus ook gelijk aan het imaginair deel, aangezien het reëel deel 0 is?
Heb ik evenveel bins nodig dan het aantal frequenties die ik zoek? Kan ik met 256 bins bv maar 256 frequenties meten?
Als van een component het reële gedeelte nul is, en het imaginaire niet, dan is de amplitude natuurlijk gelijk aan het imaginaire gedeelte (afgezien van het teken).
Als je een frequentie "zoekt", moet je kijken welke van de bins de hoogste amplituden bevatten.
Het lijkt me dan ook logisch dat het aantal verschillende frequenties dat je kunt vinden, niet hoger kan zijn dan het aantal bins waarin je ze moet vinden. Hoe wil je in 256 bins 257 grootste waarden vinden??
Dit zijn trouwens wel allemaal dingen die je zelf had kunnen ontdekken door met de spreadsheet te spelen. Verander eens wat, kijk wat er gebeurt. Zo leer je.
Frederick, ik heb een superpositie toegevoegd van 3 sinussen 1Hz, 5Hz, 20Hz aan men spreadsheet.
**Je zou hem nu in je mailbox moeten vinden**
Ik heb een productsom gemaakt met 27Hz en 12Hz en heb hier een imaginair aandeel met de amplitude van men frequenties?
27Hz en 12Hz zitten niet in het signaal en toch hebben ze een aandeel in de amplitude van de DFT?
Je spreadsheet heb ik hier neergezet, dan kunnen de meelezers ook zien wat je gemaakt hebt. De amplitudebepaling werkt nu correct; leuk hè?
Als je samplet met 32, mag je met frequenties tot 16 (tot en met 15 dus!) werken.
Boven de helft van de samplefrequentie kom je in de "spiegelfrequenties" ofwel de aliasing. Daar is al vaker over gesproken, zèlf noemde je het ook al.
Op 10 september 2009 19:18:33 schreef OBBO:
Hoogste signaal dat ik wil meten is 12,5 kHz. Dus een sample rate van 25 kHz lijkt me voldoende.
Op 11 september 2009 22:16:04 schreef Siekmanski:
[...]
van 0 tot hoogste frequentie (samplerate/2 (Nyquist))
Op 29 september 2009 21:20:47 schreef Frederick E. Terman:
Aangezien je tot 10kHz wilt kunnen kijken, kun je met 22kHz sampelen.
Op 29 september 2009 22:21:59 schreef Frederick E. Terman:
Je C-code deelt door het aantal samples, maar geeft ook de "spiegelfrequenties" bovenin het array door. In mijn voorbeeld zijn die weggelaten.
Op 4 oktober 2009 12:32:51 schreef Frederick E. Terman:
Maak een functie, neem 32 samples.
Maak proefsinussen en cosinussen van ieder ook 32 samples. Neem frequenties N van 0 t/m 15.
Voor de analyse maakt het niet uit of je naar 12 of 20 (=32-12) zit te kijken. Ook 27 of 5 (=32-27) maakt niet uit. Hetzelfde geldt voor de proeffrequenties.
--
Ik heb eens een tijdje met die Goertzel zitten spelen. Dat is een leuke algoritme zeg! Als je het in een spreadsheet stopt, zie je het vermogen in het 'filter' gewoon aangroeien, als de gezochte frequentie er in zit tenminste. Op Wiki vond ik nog dit:
s_prev = 0
s_prev2 = 0
coeff = 2*cos(2*PI*normalized_frequency);
for each sample, x[n],
s = x[n] + coeff*s_prev - s_prev2;
s_prev2 = s_prev;
s_prev = s;
end
power = s_prev2*s_prev2 + s_prev*s_prev - coeff*s_prev2*s_prev;
Dat is exact hetzelfde als wat @Siemanski al heeft gegeven (gelukkig maar
), alleen ietsje anders genoteerd.
[Bericht gewijzigd door Frederick E. Terman op (16%)]
Oh, ik kan hem waarschijnlijk wel omzetten. Effe wachtuh.. klaar. Probeer nog eens? (wel even refreshen of zelfs opnieuw je browser starten misschien, anders blijft hij de vorige uit zijn cache halen).
Hé, ik heb hier trouwens ook geen 2007. Kennelijk heb ik al een converter om deze toch te openen. Die moet dan dus gratix bij MS te vinden zijn.
[Bericht gewijzigd door Frederick E. Terman op (24%)]
Nee, dus heb toch maar de "FileFormatConverters.exe" gedownload ik was te nieuwsgierig.
Nu kan ik het lezen.
Frederick bedankt.
Hier is mijn Goertzel-sheet.
Wat gebeurt er: links is het signaal; 48Hz met stevige ruis. Zie ook grafiek.
De rest is een verzameling Goertzels, ieder met een andere frequentie.
De resultaten staan in een tweede grafiek. Mooi is de piek bij 48Hz te zien.
Normaal zou je natuurlijk alleen met de 'juiste' frequentie testen. Maar nu zie je als het ware de frequentiedoorlaat van het 'filter'.
Met de F9 toets krijg je steeds andere ruis.
Je kunt ook andere waarden invullen natuurlijk.
Frederick, dit is het resultaat van 'dit algoritme'.
void FFT_2(int n,long m,int *x,int *y)
{
int i,j,k,n1,n2;
double c,s,e,a,t1,t2;
j = 0; /* bit-reverse */
n2 = n/2;
for (i=1; i < n - 1; i++)
{
n1 = n2;
while ( j >= n1 )
{
j = j - n1;
n1 = n1/2;
}
j = j + n1;
if (i < j)
{
t1 = x[i];
x[i] = x[j];
x[j] = t1;
t1 = y[i];
y[i] = y[j];
y[j] = t1;
}
}
n1 = 0; /* FFT */
n2 = 1;
for (i=0; i < m; i++)
{
n1 = n2;
n2 = n2 + n2;
e = -6.283185307179586/n2;
a = 0.0;
for (j=0; j < n1; j++)
{
c = cos(a);
s = sin(a);
a = a + e;
for (k=j; k < n; k=k+n2)
{
t1 = c*x[k+n1] - s*y[k+n1];
t2 = s*x[k+n1] + c*y[k+n1];
x[k+n1] = x[k] - t1;
y[k+n1] = y[k] - t2;
x[k] = x[k] + t1;
y[k] = y[k] + t2;
}
}
}
} Frequentie 500Hz.
Reëel deel 734 en Imaginair deel 1775.
Amplitude uitgerekend is 120. Dit klopt.
Faseverschuiving 67°. Wat klopt hier niet?