Springen naar inhoud

Periodieke golven met fft klasse berekenen


  • Log in om te kunnen reageren

#1

JSS

    JSS


  • 0 - 25 berichten
  • 6 berichten
  • Gebruiker

Geplaatst op 03 januari 2012 - 17:14

Ik maak een simpel programma dat een .WAV file kan aanmaken met een instelbare frequentie (bv 440 Hz), bitdepth(8/16 bit) en sample rate(8000-44100). Ook de vorm van de golf is instelbaar (sinus, square, triangular, sawtooth).

Voor de eerste 2 heb ik de y-waarden kunnen berekenen met de standaard formules voor sinus of blokgolf.
De triangular en sawtooth wave heb ik laten berekenen door de amplitude geleidelijk te laten stijgen, en weer te laten dalen wanneer de maxamplitude bereikt werd.

Het programma werkt, en de .wav files klinken zoals een sinus, sawtooth, square, ... golf hoort te klinken :)

Nu wou ik die 2 laatste ook eens met Fast Fourier Transformaties laten berekenen. Ik vind verschillende bruikbare code library's op internet. Je kan dan de FFT laten berekenen door een double[] met reele getallen en een double[] met complexe getalwaarden in de parameter in te vullen van de fft methode. En daar loop ik vast. Na uren zoeken heb ik nog steeds niets bruikbaars gevonden.

Kan je deze reele en complexe waarden van bijvoorbeeld een blokgolf/sawtooth/triangular wave vinden? Ik vermoed met een for-lus? Welke vergelijkingen zou je dan gebruiken? Het is al jaren geleden dat ik fourier analyse (beperkt) gezien heb, en mijn kennis schiet te kort vrees ik. Alvast bedankt als iemand mij verder kan helpen

Veranderd door JSS, 03 januari 2012 - 17:15


Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 03 januari 2012 - 21:07

Ik zie niet zo goed wat je wil doen.

FFT berekent het frequentie-spectrum van een tijdssignaal.

Wat je wel kan doen is als je het spectrum (fase en amplitude) ként een inverse FFT doen om er weer een tijdssignaal uit te halen.

Maar wat wil je juist bereiken?

#3

JSS

    JSS


  • 0 - 25 berichten
  • 6 berichten
  • Gebruiker

Geplaatst op 04 januari 2012 - 00:54

Maar wat wil je juist bereiken?

Ik ben niet vertrouwd met Fourier analyse, dus het kan wel zijn dat ik het niet zo verstaanbaar maakte :)

Ik heb deze methode gebruikt om een zaagtand en driehoekige golf te genereren. Met wat eenvoudige wiskundige formules in een for-loop. Ik heb mijn programma gecompileerd en enkele .wav files aangemaakt en deze ingezoomd bekeken in een audio programma en ze vertoonden een mooie zaagtand of driehoekige vorm :)

Er werd echter bij vermeld dat het genereren van een sawtooth wave het best gedaan wordt door een Fast Fourier Transformatie. Ik ben FFT beginnen opzoeken vanmiddag. Ook enkele codefragmenten gedownload die FFT kant en klaar zouden uitvoeren, zodat ik enkel mijn waarden moet ingeven.

Ze vereisen echter allemaal dat je volgende parameters invoert: een double[] reele getallen, double[] imaginaire getallen, en een boolean of het normale of inverse FFT betreft. Ik zou graag kijken of het mogelijk is met Fourier een golf te genereren. Alleen weet ik na veel google'n nog geen raad hoe ik mijn reele en imaginaire getallen opstel. Elk laten genereren met een for-lus over de tijd misschien, maar wat de vergelijking is, is me nog een raadsel

Veranderd door JSS, 04 januari 2012 - 00:55


#4

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 04 januari 2012 - 10:06

Ah ok, nu zie ik het :)

Het idee is dat je het spectrum van de zaagtand gaat designen.

De imaginaire componenten mogen volgens mij allemaal 0 zijn.
De reëele getallen zijn ook allemaal 0 behalve op een paar punten.

Elk signaal kan geschreven worden als een oneindige som van sinussen met verschillende frequenties. Een sinus heeft een heel eenvoudig spectrum, het is namelijk overal 0 en er staat een 1 bij de frequentie van de sinus.

Je kan de zaagtand die je wil maken dus benaderen door een aantal sinussen (25 ofzo). Omdat de Fourier transformatie lineair is kan je gewoon de spectra van die 25 sinussen bij elkaar optellen. Dus je krijgt overal nullen, behalve in de 25 frequenties waar je een sinus hebt*.

* Hoe het precies in die matrix moet hangt van de FFT klasse af, ik weet niet of ze daar de negatieve kant van het spectrum ook in verwachten.

Als je dan het spectrum hebt, dan kan je de inverse FFT nemen om het tijdssignaal eruit te halen.

(Zie ook "A sawtooth can be constructed using additive synthesis. The infinite Fourier series" op wikipedia.)

#5

JSS

    JSS


  • 0 - 25 berichten
  • 6 berichten
  • Gebruiker

Geplaatst op 04 januari 2012 - 15:10

Bedankt! Ik probeer het binnenkort eens uit.

Voorlopig heb ik mijn golven gegenereerd met een simpele vergelijking en geplot in Maple.

Voorbeeld van een triangular wave:
Geplaatste afbeelding

Met a = 1/2f en amplitude A = 32760 (max. amplitude voor 16bits audio)

Plot:
Geplaatste afbeelding

Dit krijg ik ook als resultaat als ik heel sterk inzoom op mijn gegenereerd audiofragment. De periode valt op 0.0025 s, wat overeenkomt met mijn vooraf ingestelde frequentie van 400 Hz ;)

Ik hou het voorlopig zo, ipv het moeilijker te maken met FFT

Veranderd door JSS, 04 januari 2012 - 15:11






0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures