Grote microcontroller IC-leveranciers zoals ST, NXP, TI, ADI, Atmel/Microchip, Cypress, Maxim hebben afgelopen jaren hun moderne 32-bit microcontrollers gebaseerd op Cortex-M processor cores van Arm. Deze positieve trend betekent dat algoritmen die traditioneel in dure DSP’s (digitale signaalprocessoren) worden gebruikt, nu kunnen worden geïntegreerd in een krachtige, goedkope en energiezuinige microcontroller. Deze zit vol met connectiviteits- en randapparatuuropties.

De koppeling van DSP-functionaliteit met de flexibiliteit van een laagvermogenmicrocontroller heeft veel IC-leveranciers in staat gesteld hun klanten verbeterde 32-bits microcontrollers aan te bieden. Deze zijn geschikt zijn voor veel praktische toepassingen. Nog belangrijker is dat deze combinatie van technologieën ontwerpers die werken aan prijskritische IoT toepassingen in staat heeft gesteld om complexe algoritmische concepten te implementeren. Dit terwijl ze tegelijkertijd de totale kosten van het product laag houden en en toch uitstekende prestaties met een laag vermogen bereiken.

Het upgraden van legacy analoge filters met ASN Filter Designer

Analoge filters bestaan al sinds het begin van de elektronica, variërend van eenvoudige inductor-capacitor netwerken tot meer geavanceerde actieve filters met op-amps. Als zodanig is er een grote verzameling van beproefde en geteste filterontwerpen voor meettoepassingen voor sensoren ontstaan.

Met ASN’s FilterScript symbolische wiskunde scripttaal kunnen ontwerpers bestaande analoge filtertransferfunctie met een paar regels code uitvoeren naar digitaal. De automatische codegenerator van de ASN Filter Designer’s Arm analyseert het ontworpen digitale filter. Vervolgens genereert hij automatisch C code die compliant is met Arm CMSIS-DSP, geschikt is voor directe implementatie op een Cortex-M gebaseerde microcontroller.

Arm CMSIS-DSP software framework

Het Arm CMSIS-DSP (Cortex Microcontroller Software Interface Standard) software framework bestaat uit meer dan 60 DSP functies (inclusief diverse wiskundige functies, zoals sinus en cosinus; IIR/FIR filtering functies, complexe wiskundige functies, en datatypes) ontwikkeld door Arm, die zijn geoptimaliseerd voor hun reeks van Cortex-M processorkernen. Het framework maakt veel gebruik van sterk geoptimaliseerde SIMD (single instruction, multiple data) instructies. Deze voeren meerdere identieke bewerkingen uitvoeren in een single cycle instructie. De SIMD instructies (indien ondersteund door de core) in combinatie met andere optimalisaties stellen engineers in staat om snel en eenvoudig zeer geoptimaliseerde signaalverwerkingsapplicaties voor Cortex-M gebaseerde microcontrollers te produceren.

Wiskundig modelleren van een analoog circuit

Hieronder staat een actief preëmphasefilter weergegeven. Het preëmphasefilter heeft een bijzondere toepassing gevonden in audiowerkzaamheden, omdat het noodzakelijk is de hogere frequenties van het spraakspectrum te versterken, terwijl de lagere frequenties onaangetast blijven. De getoonde R- en C-waarden zijn alleen ingesprongen voor het voorbeeld, meer praktische waarden zullen afhangen van de toepassing. Een krachtige methode om de grootte en de fasekenmerken van het analoge filter in een digitale uitvoering weer te geven, is het mathematisch modelleren van de schakeling. Deze schakeling kan worden geanalyseerd met behulp van de wet van Kirchhoff, aangezien de som van de stromen in de inverterende ingang van de op-amp gelijk moet zijn aan nul om negatieve feedback correct te laten werken – dit resulteert in een overdrachtsfunctie met een negatieve versterking.

Daarom, met behulp van de wet van Ohm, d.w.z. \(I=\frac{V}{R}\),

\(
\displaystyle\frac{X(s)}{R_3}=-\frac{U(s)}{C_1||R_2 + R_1}
\)

Na enige algebraïsche manipulatie kan men zien dat een uitdrukking voor de closed loop gain van het circuit kan worden uitgedrukt als:

\(
\displaystyle\frac{X(s)}{U(s)}=-\frac{R_3}{R_1}\frac{\left(s+\frac{1}{R_2C_1}\right)}{\left(s+\frac{R_1+R_2}{R_1R_2C_1}\right)}
\)

door de waarden in het schakelschema te vervangen door de ontwikkelde overdrachtsfunctie, levert het volgende op

\(
\displaystyle H(s)=-10\left(\frac{s+1000}{s+11000}\right)
\)

Welke sampling rate hebben we nodig?

De afsnijfrequentie bekijkend \(H(s)\), zien we dat de bovenste frequntie \(11000 rad/sec\) of \(1.75kHz\) is. Daarom moet de sampling rate op \(16kHz\) voldoende zijn voor het modelleren van het filter in het digitale domein.

De opties voor de sampling rate staan weergegeven in het hoofd filter design UI  (weergegeven op de afbeelding links).

ASN FilterScript

\(H(s)\) kan eenvoudig worden gespecificeerd in FilterScript met de analogtffunctie:

Nb={1,1000};
Na={1,11000};

Ha=analogtf(Nb,Na,-10,"symbolic");

Merk op hoe de negatieve gain ook direct in het argument van de functie kan worden ingevoerd. Het symbolische sleutelwoord genereert een symbolische transferfunctie weergave in het commandovenster.

De Bilineaire z-transformatie toepassing via het bilineaire commando zonder pre-warping, d.w.z.

Hd=bilinear(Ha,0,"symbolic");

Merk op hoe het bilinear commando automatisch de tellercoëfficiënten met -1 schaalt, om zo het effect van de negatieve gain mee te nemen. De volledige code wordt hieronder weergegeven:

Main()

Nb={1,1000};
Na={1,11000};

Ha=analogtf(Nb,Na,-10,"symbolic");
Hd=bilinear(Ha,0,"symbolic");

Num=getnum(Hd);
Den=getden(Hd);
Gain=getgain(Hd);

Een vergelijking van de analoge en discrete magnitude en de fasespectra is hieronder weergegeven. Bij het analyseren van de spectra is te zien dat bij een sampling rate van 16kHz de analoge en digitale filters vrijwel identiek zijn! Dit toont het relatieve gemak aan waarmee een ontwerper zijn bestaande analoge ontwerpen kan overdragen naar digitaal.

Automatische code generatie naar Arm Cortex-M processors

Zoals aan het begin van dit artikel vermeld, vergemakkelijkt de automatische codegeneratie-engine van de ASN-filterontwerper de export van een ontworpen filter naar Cortex-M Arm-gebaseerde processor cores via het CMSIS-DSP software raamwerk. De ingebouwde analyse- en helpfuncties van de tool helpen de ontwerper bij het succesvol configureren van het ontwerp voor implementatie.

Voordat de code wordt gegenereerd, moet het H2-filter (d.w.z. het filter dat in FilterScript is ontworpen) eerst opnieuw worden geoptimaliseerd (getransformeerd) naar een H1-filter (hoofdfilter) structuur voor gebruik. Het optiemenu is te vinden onder de P-Z tab in de hoofd UI.

Alle ontwerpen van floating point IIR-filters moeten gebaseerd zijn op Single Precision en ofwel een Direct Form I of Direct Form II getransponeerde filterstructuur zijn. Voor floating point implementatie wordt de Direct Form II getransponeerde structuur geadviseerd vanwege de hogere numerieke nauwkeurigheid.

Kwantisatie en filter structuur settings staan weergegeven onder de Q tab (zie afbeelding links). Door Arithmetic naar Single Precision en Structure naar Direct Form II Transposed te zetten en door vervolgens op de Apply button te klikken, wordt het hier beschouwde IIR geconfigureerd voor het CMSIS-DSP software framework.

Arm CMSIS-DSP application C code

Selecteer het Arm CMSIS-DSP framework in het selectie venster in het filter summary scherm:

De automatisch gegenereerde C code gebaseerd op het CMSIS-DSP framework voor directe implementatie op een Arm based Cortex-M processor staat hieronder weergegeven:

Zoals weergegeven, genereert de automatische codegenerator alle initialisatiecode, schaling en datastructuren die nodig zijn om het IIR te implementeren via de CMSIS-DSP bibliotheek. Deze code kan direct worden gebruikt in elk Cortex-M gebaseerd ontwikkelingsproject – een compleet Keil MDK voorbeeld is beschikbaar op de website van Arm/Keil. Merk op dat de code generator van de tool standaard code produceert voor de Cortex-M4 core, zie onderstaande tabel voor de #definitie die nodig is voor alle ondersteunde cores.

ARM_MATH_CM0Cortex-M0 core.ARM_MATH_CM4Cortex-M4 core.
ARM_MATH_CM0PLUSCortex-M0+ core.ARM_MATH_CM7Cortex-M7 core.
ARM_MATH_CM3Cortex-M3 core.  
ARM_MATH_ARMV8MBLARMv8M Baseline target (Cortex-M23 core).
ARM_MATH_ARMV8MMLARMv8M Mainline target (Cortex-M33 core).

De belangrijkste testluscode (niet afgebeeld) draait om dearm_biquad_cascade_df2T_f32()functie, die de filtering uitvoert op een blok invoergegevens.

Wat hebben we geleerd?

De ASN Filter Designer biedt ingenieurs alles wat ze nodig hebben om legacy analoge filterontwerpen over te zetten naar diverse Cortex-M-processor cores.

De FilterScript symbolische wiskunde scripttaal biedt ontwerpers de mogelijkheid om een bestaande analoge filtertransfer functie te transformeren naar digitaal (via de Bilinear z-transform of gematchte z-transformatie) met slechts een paar regels code.

De automatische codegenerator voor Arm analyseert het ontworpen digitale filter en genereert vervolgens automatisch de C-code voor Arm CMSIS-DSP. Deze is geschikt voor directe implementatie op een microcontroller op basis van Cortex-M.

Extra middelen

  1. Stap voor stap video tutorial voor het ontwerpen van een IIR en implementatie naar Keil MDK uVision.
  2. Implementatie van Biquad IIR filters met de ASN Filter Designer en het Arm CMSIS-DSP software framework (ASN-AN025)
  3. Voorbeeld van een Keil MDK uVision IIR filter project
  4. Stap voor stap instructie video van de tutorial Arm Webinar (registratie nodig)

Het moving average filter (voortschrijdend gemiddelde filter) is een van de meest gebruikte FIR filters vanwaar zijn conceptuele eenvoud en omdat deze gemakkelijk te implementeren is. Het onderstaande diagram laat zien dat er geen vermenigvuldigingen nodig zijn, alleen toevoegingen en een vertragingslijn. Hierdoor is het zeer geschikt voor extreem laag vermogen embedded devices met capaciteit voor basisberekeningen.

fir direct form

Ondanks zijn eenvoud is het moving average filter echter optimaal voor het reduceren van willekeurige ruis met behoud van een scherpe stapreactie. Hierdoor is het een veelzijdige bouwsteen is voor signaalverwerking voor slimme sensor toepassingen.

Een moving average filter met lengte \(L\) voor input signaal \(x(n)\) kan als volgt worden gedefinieerd:

\(y(n)=\large{\frac{1}{L}}\normalsize{\sum\limits_{k=0}^{L-1}x(n-k)}\) for \(\normalsize{n=0,1,2,3….}\)

Hierbij stelt een eenvoudige vuistregel dat de mate van ruisreductie gelijk is aan de vierkantswortel van het aantal punten in het gemiddelde. Een voortschrijdend gemiddelde van lengte 9 zal bijvoorbeeld resulteren in een factor 3 ruisreductie.

Het moving average filter (voortschrijdend gemiddelde filter)

Frequentierespons van een Moving Average-filter van lengte 9. Let op de slechte demping van de stopband bij ongeveer -20dB.

Voordelen

  • Meest gebruikte digitale laagdoorlaatfilter
  • Optimaal voor het verminderen van willekeurige ruis met behoud van een scherpe stapreactie
  • Goede smoother (tijdsdomein)
  • Eenheidsgewaardeerde filtercoëfficiënten, geen MAC-bewerkingen (vermenigvuldigen en accumuleren) nodig
  • Conceptueel simpel te implementeren

Nadelen

  • Inflexibele frequentierespons: het aanzetten van een geconjugeerd nulpaar resulteert in niet-communautaire coëfficiënten
  • Slecht laagdoorlaatfilter (frequentiedomein): langzame roll-off en slechte stopband-dempingseigenschappen

Implementatie

Het moving average filter kan in ASN FilterScript als volgt worden geimplementeerd:

ClearH1;  // clear primary filter from cascade
Main();
Hd=movaver(8,"symbolic");  // design an 8th order MA
Num = getnum(Hd);   // define numerator coefficients
Den = {1};          // define denominator coefficients
Gain = getgain(Hd); // define gain

Een meer computationeel efficiënte implementatie van het MA-filter wordt hier besproken.

Verder lezen

  • Understanding Digital Signal Processing, Chapter 5, R. G. Lyons
  • The Scientist and Engineer’s Guide to Digital Signal Processing, Chapter 15, Steven W. Smith
ASN Filter Designer box

Download demo now

Licencing information