Ik probeer een FFT te implementeren om te begrijpen hoe het werkt. Ik gebruik een willekeurig geluidsbestand (dus ik kan “de grootte van het signaal niet regelen), met een bemonsteringsfrequentie van 44,1 Khz. Ik gebruik deze bibliotheek
https://www.nayuki.io/res/free-small-fft-in-multiple-languages/Fft.java
Het doel is om deze formule toe te passen op haal de frequentie op: F = n * Fs / N
Met n aantal bakken. Fs bemonsteringsfrequentie, en N grootte van de FFT
1) Een Fft wordt verondersteld een lengte te hebben, de meeste gebruiken een macht van 2 radix. Maar hoe kan ik de lengte van de FFT weten als ik deze toepas op een hele reeks gegevens? is het de grootte van die array?
2) Ik begrijp de opslaglocaties niet, hoe wordt het verwerkt? Ik weet dat FFT werkt met stukjes gegevens, maar als ik een volledige reeks gegevens geef, hoe worden de opslaglocaties dan “gemaakt”.
Opmerkingen
- Deze vragen kunnen worden beantwoord met een klein beetje zoeken en lezen op internet. Ik raad je ook aan je codering te beginnen met wiskundig geconstrueerde signalen van vrij korte duur en pas uw FFT-software daarop toe en bekijk de resultaten.
- Ik heb eigenlijk veel gezocht, maar ik kon ' niet begrijpen, maar misschien i ' m gewoon te traag. bedankt voor je bezorgdheid.
- Probeer te zoeken op " Discrete Fourier-transformatie " of " hoe werkt een DFT " in plaats van " hoe werkt een FFT ". Een Fast Fourier Transform is een computationele snelkoppeling van een Discrete Fourier Trans het formulier. Met de laatste zoekopdracht vindt u eerder informatie over de rekenefficiëntie dan over het onderliggende proces. Ik begrijp niet ' hoe je kunt verwachten dat iemand de basisprincipes beter uitlegt in een snel forumantwoord dan een aantal websites die precies dat doen. De eerste vier artikelen in mijn blog zouden ook voor jou nuttig moeten zijn. Begin met dsprelated.com/showarticle/754.php .
Antwoord
Vraag 1
Als je het over de gehele lengte van de array toepast, is de lengte van de FFT de lengte van de array. Maar de FFT is efficiënter als de lengte een macht van twee is, dus het is gebruikelijk om 0 “s op het einde van het signaal te plaatsen totdat de lengte een macht van 2 is.
Al te eenvoudig voorbeeld …
x = [3.4, 2.56, 1.3]
x
heeft een lengte van 3, de volgende macht van 2 na 3 is 4, dus veranderen we x
in
x = [3.4, 2.56, 1.3, 0]
en pas een FFT toe met lengte 4.
Nog een grote MAAR! Als je signaal lang is, wordt buitengewoon inefficiënt om alles in één keer te doen. U zou niet willen proberen om een FFT uit te voeren op een audiobestand met de lengte van zelfs maar een kort nummer. In dat geval splitsen we het signaal op in stukjes van een redelijke grootte, voeren we een FFT op elk, en het gemiddelde van de resultaten.
De kans is groot dat wat u werkelijk met uw gegevens wilt doen niet alleen een standaard FFT is, maar eerder het middelingsproces dat ik hierboven heb beschreven. Google Bartlett en Welch methoden voor meer d etails.
Vraag 2
Ik “weet niet 100% zeker wat u hier vraagt. Ik ga het interpreteren zoals je wilt weten hoe de breedte van de frequentiebakken wordt bepaald en daarmee werken.
De breedte van elke frequentiebak wordt uitsluitend bepaald door de snelheid waarmee het signaal werd bemonsterd en de lengte van de FFT. De breedte van elke bak is de bemonsteringsfrequentie gedeeld door het aantal monsters in uw FFT.
df = fs / N
Frequentiebins beginnen bij -fs/2
en gaan omhoog naar fs/2
. Dat betekent dat als u 100 samples bemonstert bij 100 Hz, uw frequentiebins breed zijn 1Hz. Als je 200 samples neemt, heb je nu 2x zoveel frequentiebakken en is hun breedte elk 1 / 2Hz.
Reacties
- Heel erg bedankt, het was alles wat ik niet ' begreep.