Jag fixar en liten lathund.
1: Hitta samplingsfrekvensen för din wav-fil (i Hz). Jag kallar den fs och visar med 5 kHz.
2: Bestäm antal sampel som du ska ha med. Om du vill ha 5sekunders ljud så blir sampellängden N = 5*5000 = 25000 sampel.
2: Bestäm dina gränsfrekvenser. Jag visar för ett exempel med ett bandpassfilter mellan 20 (fl) och 100 Hz(fh). I princip går det ut på att hitta det sampel som svarar mot rätt frekvens, men varje frekvens svarar mot 2 frekvenser! (rätt mycket matte till orsakerna, men i princip är frekvensplanet speglat i mitten).
De första är ganska lätta att förstå sig på, helt enkelt:
f = sampelnr *fs/N, dvs sampelnr = f/fs*N
Den andra, spegelvända är
f = (N - sampelnr)*fs/N dvs sampelnr = N - f/fs*N
För mitt exempel kommer du ha följande sampel att hålla reda på:
för 20 Hz:
20/5000*25000 = 100
25000-20/5000*25000 = 24900
för 100 Hz:
100/5000*25000 = 500
25000-100/5000*25000 = 24500.
Första sampelnr är alltså 0.
Om du vill ha med frekvenser på 1000 Hz måste du ha en samplingsfrekvens på minst 2000Hz (alltid det dubbla).
3: Fouriertransformera.
4: Om du vill ha ett bandpassfilter så sätt alla sampel utanför ditt område till 0 och behåll de innanför.
I exemplet, nolla alla sampel i intervallen
0-99, 500-24500, 24900-24999 (högsta sampelnr är ju 24999...)
5: Om du vill kan du nu visa upp vad du har, men spara undan de data du har skapat i punkt 4.
Du kan visa en vettig kurva (på något sätt, du får komma på själv ).
Om du vill slippa knöligheterna med att förklara matematiken bakom så räcker det med att visa hälften av samplena då den andra halvan är spegelvänd.
De sampel det gäller i mitt exempel är 0-12499.
Dessa sampel tar du absolutbeloppen av. De har alla ett utseende som ser ut så här z = a+ib.
absolutbeloppet av det är sqrt (a^2 + b^2). Jag tror att du kan hitta en bra abs(z) i de bibliotek som finns i fftw, så går det snabbt.
Absolutbeloppet är alltid reellt och därför fin att plotta.
6: Gå tillbaka till de data du sparade. Om du vill skapa en ny fil med enbart de frekvenser inom bandpasset så kan du inverstransformera dessa data. Jag har tyvärr inte riktigt hittat hur man gör det i fftw, men det borde rimligtvis gå att göra. sök på inverse transform på siten. När du har inverstransformerat så har du ljudet tillbaka, men bara de frekvenser du ville ha med.
Observera FAQ:en! 3.11 säger att man måste ha float som taltyp.
Hoppas att det räcker!