Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

EasyFFT – Betrouwbare FFT-bibliotheek voor Arduino-projecten

Onderdelen en benodigdheden

OnderdeelAantal
Arduino Nano R31

Apps en online diensten

  • Arduino IDE

Over dit project

Frequentiemeting uit een opgenomen signaal is lastig, zeker op een Arduino met beperkte rekenkracht. Nuldoorgangsmethoden werken niet goed bij samengestelde signalen. Deze bibliotheek maakt FFT (Fast Fourier Transform) eenvoudig toepasbaar zonder diepe wiskundige kennis. Ideaal voor muziekanalyses, signaalverwerking, etc.

De werking van FFT wordt niet uitgelegd, wel de toepassing. Zie de bijbehorende video voor meer uitleg.

Voor snellere FFT (3x) met ~5% nauwkeurigheidsverlies, zie mijn ApproxFFT-artikel.

Stap 1: Fast Fourier Transform

Het FFT-algoritme (Cooley-Tukey) versnelt de DFT berekening aanzienlijk: van N² naar N·logN complexe vermenigvuldigingen. Belangrijk voor grotere steekproefsets.

Referenties voor de wiskunde achter FFT:

  1. Flylib
  2. Jake VanderPlas
  3. CNX
  4. Wikipedia

Stap 2: Code-uitleg – Snel sinus/cosinus

De ingebouwde sin()/cos() zijn traag. De oplossing: een lookup-tabel sine_data[91] met waarden voor 0–90° (als veelvouden van 255, opgeslagen als byte – 1/4 geheugen). Plaats sine_data[] bovenaan je sketch als globale variabele.

Ook f_peaks[5] (globale array) wordt bij elke FFT-run bijgewerkt: f_peaks[0] = dominante frequentie, daarna dalend.

byte sine_data[91] = { 0, 4, 9, 13, 18, 22, 27, 31, 35, 40, 44, 49, 53, 57, 62, 66, 70, 75, 79, 83, 87, 91, 96, 100, 104, 108, 112, 116, 120, 124, 127, 131, 135, 139, 143, 146, 150, 153, 157, 160, 164, 167, 171, 174, 177, 180, 183, 186, 189, 192, 195, 198, 201, 204, 206, 209, 211, 214, 216, 219, 221, 223, 225, 227, 229, 231, 233, 235, 236, 238, 240, 241, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 253, 254, 254, 254, 255, 255, 255, 255 };
float f_peaks[5];

De functies sine() en cosine() ronden af en halen de waarde uit de tabel. Dit scheelt 8 ms (64 punten) tot 20 ms (128 punten).

Stap 3: FFT-functie

FFT werkt alleen voor steekproefgroottes van 2ⁿ (2, 4, 8, 16, 32, 64, 128…). Andere waarden worden afgekapt naar de nearest lagere 2ⁿ.

Op Arduino Nano: max 128 samples (64 aanbevolen) vanwege geheugen. Arrays out_r en out_im (float) zijn groot.

Stappen in de functie:

  1. Bit-reversed ordering genereren.
  2. Input data ordenen volgens die volgorde.
  3. FFT uitvoeren.
  4. Amplitude van complexe getallen berekenen.
  5. Pieken detecteren en sorteren op grootte.
  6. Resultaten in f_peaks[] beschikbaar.

Andere data (frequentie-bins, amplitudes) vereist aanpassing van de code (globale variabelen).

Stap 4: Testen

Een driehoakgolven (samplefreq 10 Hz, signaalfreq 1,25 Hz) als testinput. Resultaten komen overeen met Scilab FFT (kleine afwijking door snelle sinusbenadering). Uitgang: frequentie-bins 1,25 Hz en 3,75 Hz.

Snelheid op Arduino Nano:

  • 16 punten: 4 ms
  • 32 punten: 10 ms
  • 64 punten: 26 ms
  • 128 punten: 53 ms

Stap 5: Conclusie

Deze FFT-code is geschikt voor realtime toepassingen (~30 ms). Resolutie wordt beperkt door steekproefgrootte (geheugen). Op Arduino Mega of krachtigere boards kan de nauwkeurigheid verbeterd worden.

Vragen, suggesties of correcties? Laat een reactie achter.

Code

De volledige EasyFFT-code (Arduino/C++) staat in het originele artikel. De functie FFT(int in[], int N, float Frequency) vult de globale f_peaks[5] met de top-5 frequenties. Voorbeeldgebruik in loop() is uitgecommentarieerd.

Schema's

EasyFFT – Betrouwbare FFT-bibliotheek voor Arduino-projecten

Productieproces

  1. Een DTMF-decoder bouwen met alleen een Arduino – Geen extra IC's nodig
  2. SERENA: Een Aangepast Arduino Mega 2560 Alarmsysteem Met TFT LCD Touchscreen
  3. Python 3 naar Arduino UNO: Eenvoudige Commando Besturing en LED Demo
  4. Slim Temperatuurmonitoring Systeem voor Scholen: Nauwkeurig, Real-time en Beveiligd
  5. Efficiënte 8-bit IO-poort bibliotheek voor Arduino – Uitbreiding digitale controle
  6. Arduino 64-toets Prototoetsenbord Matrix – Bouw een Aangepast Toetsenbord met Shift Registers
  7. Hoogwaardige 2,8″ TFT Shield voor Arduino Nano – 320×240 SPI Display
  8. Geïsoleerde analoge ingangsschakeling voor Arduino bouwen
  9. Slim Indoor Navigatie Robot Kit voor Arduino Projecten
  10. HS-code voor hydraulische pompen: classificatie en toepassing
  11. De Fourier-transformatie begrijpen: fundamentele principes, toepassingen en signaaldecompositie