Een Peaking of Bell filter is een type geluidsequalisatiefilter dat de grootte van een bepaalde set frequenties rond een centrumfrequentie versterkt of verzwakt om zo de magnitude van het geluid te egaliseren. Zoals te zien is in de grafiek hieronder, ontleent het filter zijn naam aan de vorm van het magnitudenspectrum (blauwe lijn) dat lijkt op een Bell-curve.

Peaking filter or Bell filter, a type of audio equalisation filter that boosts or attenuates the magnitude of a specified set of frequencies around a centre frequency in order to perform magnitude equalisation. As seen in the plot in the below, the filter gets its name from the shape of the its magnitude spectrum (blue line) which resembles a Bell curve.

Frequentierespons (magnitude weergegeven in blauw, fase weergegeven in paars) van een 2e orde Bell-filter met een piek bij 125 Hz

All-pass filters

Centraal in het Bell-filter staat het zogenaamde All-pass filter. All-pass filters bieden een eenvoudige manier om de faserespons van een IIR te wijzigen/verbeteren zonder de grootte van de IIR te beïnvloeden. Als zodanig worden ze meestal aangeduid als fase-equalizers en hebben ze een bijzondere toepassing gevonden in digitale audiotoepassingen.

Een tweede orde all-pass filter is gedefinieerd als:

\( A(z)=\Large\frac{r^2-2rcos \left( \frac{2\pi f_c}{fs}\right) z^{-1}+z^{-2}}{1-2rcos \left( \frac{2\pi f_c}{fs}\right)z^{-1}+r^2 z^{-2}} \)

Merk op hoe de teller- en noemercoëfficiënten in spiegelbeeldig van elkaar zijn gerangschikt. De eigenschap van dit spiegelbeeld is wat de all-pass filter zijn gewenste eigenschap geeft, namelijk de ontwerper in staat stellen om de faserespons te veranderen terwijl de magnituderespons constant of vlak blijft over het volledige frequentiespectrum.

Een Bell filter kan worden geconstrueerd uit de \(A(z)\) filter door de volgende transferfunctie:

\(H(z)=\Large\frac{(1+K)+A(z)(1-K)}{2}\)

Na enige algebraïsche vereenvoudiging krijgen we de transferfunctie voor de Peaking of Bell filter als:

\(H(z)=\Large{\frac{1}{2}}\left[\normalsize{(1+K)} + \underbrace{\Large\frac{k_2 + k_1(1+k_2)z^{-1}+z^{-2}}{1+k_1(1+k_2)z^{-1}+k_2 z^{-2}}}_{all-pass filter}\normalsize{(1-K)} \right] \)

  • \(K\) wordt gebruikt om de gain en het teken van de piek in te stellen
  • \(k_1\) stelt de piek middenfrequentie in
  • \(k_2\) stelt de bandbreedte van de piek in

Implementatie

Een Bell filter kan gemakkelijk ASN FilterScript worden geimplementeerd:

ClearH1;  // clear primary filter from cascade
interface BW = {0,2,0.1,0.5}; // filter bandwidth
interface fc = {0, fs/2,fs/100,fs/4}; // peak/notch centre frequency
interface K = {0,3,0.1,0.5}; // gain/sign

Main()

k1=-cos(2*pi*fc/fs);
k2=(1-tan(BW/2))/(1+tan(BW/2));

Pz = {1,k1*(1+k2),k2}; // define denominator coefficients
Qz = {k2,k1*(1+k2),1}; // define numerator coefficients
Num = (Pz*(1+K) + Qz*(1-K))/2;
Den = Pz;
Gain = 1;

Deze code kan nu gebruikt worden om een geschikt Bell filter te ontwerpen, waarbij de exacte waardes van \(K, f_c\) en \(BW\) gemakkelijk kunnen worden gevonden door de interface variabelen te tweaken waarbij het resultaat in real-time te zien is, zoals hieronder weergegeven.

Directe aanpassingen in filter ontwerp

Bij de interactiviteit van de FilterScript IDE (geïntegreerde ontwikkelomgeving) staan de zogenaamde interfacevariabelen centraal. Een interface variabele wordt eenvoudigweg genoemd: een scalaire invoervariabele die gebruikt kan worden om een symbolische expressie te wijzigen zonder dat de code opnieuw gecompileerd hoeft te worden – dit stelt ontwerpers in staat om ‘on the fly’ te ontwerpen en snel tot een optimale oplossing te komen.

Zoals in het codevoorbeeld hierboven te zien is, moeten de interfacevariabelen worden gedefinieerd in de initialisatiesectie van de code, en kunnen ze constanten (zoals fs and pi) en eenvoudige wiskundige operatoren, zoals vermenigvuldigen * en /delen, bevatten. Dit wanneer het toevoegen van functies aan een interfacevariabele niet wordt ondersteund.

Een interfacevariabele wordt gedefinieerd als een vectorexpressie:

interface name = {minimum, maximum, step_size, default_value};

Waarbij alle vermeldingen echte scalaire waarden moeten zijn. Vectoren en complexe waarden worden niet gecompileerd.
[arve mp4=”https://www.advsolned.com/wp-content/uploads/2018/07/peakingfilter.mp4″ align=”right” loop=”true” autoplay=”true” nodownload nofullscreen noremoteplayback… /]

Real-time updates

Alle interfacevariabelen worden gewijzigd via de interfacevariabele regelaar GUI. Na het compileren van de code gebruikt u de interface variabele controller om de waarden van de interface variabelen te tweaken en de effecten op de overdrachtsfunctie te zien. Als u test op live audio, kunt u een geladen audiobestand streamen en de interfacevariabelen in real-time aanpassen om de effecten van de nieuwe instellingen te horen.

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

Praktische tips voor ruis onderdrukking ECG data

Bij ECG-signaalverwerking is het verwijderen van 50/60Hz powerline interferentie is een grote uitdaging! De informatie voorkomend uit de ECG biomedische golfvormen is erg gevoelig voor verstoringen. De uitdaging wordt verder gecompliceerd door het aanpassen aan de effecten van EMG, zoals een beweging van de patiënt in de ledematen of de romp of zelfs de ademhaling. Hiervoor wordt vaak een 2e orde IIR notch filter gebruikt:

\(\displaystyle H(z)=\frac{1-2cosw_oz^{-1}+z^{-2}}{1-2rcosw_oz^{-1}+r^2z^{-2}}\)

waarbij \(w_o=\frac{2\pi f_o}{fs}\) de centrumfrequentie regelt, \(f_o\) van de notch, en \(r=1-\frac{\pi BW}{fs}\) de bandbreedte (-3dB point) van de notch controleert.

Wat is de uitdaging?

Zoals hierboven beschreven, is \(H(z) \) makkelijk te implementeren. De moeilijkheid ligt echter in het vinden van een optimale waarde van r, aangezien een gewenste scherpe notch betekent dat de polen dicht bij de eenheidscirkel ligt (zie rechts).

ECG biomedical 2nd order IIR notch filter H(z) is simple to implement, but the difficulty lies in finding an optimal value of r, as a desirable sharp notch means that the poles are close to unit circle.

Bij stationaire interferentie, bijvoorbeeld wanneer de patiënt absoluut stil ligt en de effecten van de ademhaling op de sensorgegevens minimaal zijn, hoeft dit geen probleem te zijn.

Echter, wanneer men de effecten van EMG op de golfvorm (een veel realistischer situatie) bekijkt, veroorzaakt de terugkoppeling van het IIR-filter (polen) ringen op de gefilterde golfvorm, zoals hieronder wordt weergegeven:

biomedical ex iir td Contaminated ECG with non-stationary 50Hz powerline interference (FIR filtering), ECG sigal processing, ECG DSP, ECG
Vervuilde ECG met niet-stationaire 50Hz stroomlijninterferentie (IIR-filtering)

Zoals hierboven te zien is, is het grootste deel van de 50Hz-storing verwijderd. Er is echter nog steeds sprake van aanzienlijke ringen rond de belangrijkste pieken (gefilterde output in het rood weergegeven). Deze ringing is ongewenst voor veel biomedische toepassingen, omdat vitale cardiale informatie zoals het ST-segment daardoor niet duidelijk kan worden geanalyseerd.

De frequentierespons van het IIR dat wordt gebruikt om de bovenstaande ECG-gegevens te filteren, staat hieronder weergegeven.

biomedical ex iir fr IIR notch filter frequency response, ECG signal processing, ECG DSP, ECG  measurement
IIR notch filter frequentierespons

Bij het analyseren van de grafiek is te zien dat de groepsvertraging (of gemiddelde vertraging) van het filter niet-lineair is, maar bijna nul in de passbands. Dit betekent dat er geen vervorming is. De groepsvertraging bij 50Hz loopt op tot 15 samples, wat de bron is van de ringing – waar hoe dichter bij de polen de eenheidscirkel is, hoe groter de groepsvertraging.

ASN FilterScript biedt ontwerpers de notch() functie, die een directe uitvoering is van H(z), zoals hieronder getoond:

ClearH1;  // clear primary filter from cascade
ShowH2DM;   // show DM on chart

interface BW={0.1,10,.1,1};

Main()

F=50;
Hd=notch(F,BW,"symbolic");
Num = getnum(Hd); // define numerator coefficients
Den = getden(Hd); // define denominator coefficients
Gain = getgain(Hd); // define gain

Savitzky-Golay FIR-filters

Een oplossing voor het bovengenoemde ringing en geluidsreductie kan worden bereikt door middel van een Savitzky-Golay lowpass smoothing filter. Deze filters zijn FIR-filters en hebben dus geen terugmeldingscoëfficiënten en geen ringing!

Savitzky-Golay (polynomiaal) smoothing filters of least-squares smoothing filters zijn generalisaties van het FIR gemiddelde filter die het hoogfrequent gehalte van het gewenste signaal beter kunnen behouden, ten koste van het niet verwijderen van zoveel ruis als een FIR gemiddelde. De specifieke formulering van de Savitzky-Golay filters behoudt verschillende moment orders beter dan andere afvlakmethodes, die de neiging hebben om piekbreedten en -hoogten beter te behouden dan Savitzky-Golay. Als zodanig zijn Savitzky-Golay filters zeer geschikt voor biomedische gegevens, zoals ECG-datasets.

Het elimineren van de 50Hz powerline component

Door het ontwerpen van een 18e orde Savitzky-Golay filter met een 4e orde polynomiale pasvorm (zie de voorbeeldcode hieronder), verkrijgen we een FIR filter met een nul-verdeling zoals hiernaast getoond. Echter, omdat we de 50Hz component volledig willen elimineren, kan de P-Z editor van de tool gebruikt worden om een nulpaar (in het groen weergegeven) tot precies 50Hz te brengen.

biomedical ex fir pole zero. Designing an 18th order Savitzky-Golay filter with a 4th order polynomial fit, , we obtain an FIR filter with a zero  distribution

De resulterende frequentierespons is hieronder weergegeven, waar te zien is dat er een notch is op precies 50Hz, en de groepsvertraging van 9 samples (in paars weergegeven) is constant over de hele frequentieband.

biomedical ex fir fr FIR  Savitzky-Golay filter frequency response, ECG signal processing, ECG DSP, ECG measurement
FIR Savitzky-Golay-filter-frequentierespons

Wanneer we de vervuilde ECG-dataset door onze aangepaste Savitzky-Golay-filter laten gaan, en met de aanpassing voor de groepsvertraging krijgen we:

biomedical ex fir td Passing the tainted ECG dataset through our tweaked Savitzky-Golay filter, and adjusting for the group delay
Verontreinigde ECG met niet-stationaire 50Hz stroomlijninterferentie (FIR-filtering)

Zoals te zien, is er geen sprake van ringing en zijn de ST-segmenten nu duidelijk zichtbaar voor analyse. Merk ook op hoe het filter (weergegeven in rood) de meetruis heeft gereduceerd. Dit toont de bruikbaarheid van de Savitzky-Golay filters voor biomedische signaalverwerking aan.

Een Savitzky-Golay kan als volgt worden ontworpen en geoptimaliseerd in ASN FilterScript via de savgolay() functie:

ClearH1;  // clear primary filter from cascade

interface L = {2, 50,2,24};
interface P = {2, 10,1,4};

Main()

Hd=savgolay(L,P,"numeric");  // Design Savitzky-Golay lowpass
Num=getnum(Hd);
Den={1};
Gain=getgain(Hd);

Implementatie

Dit filter kan nu worden geimplementeerd via de automatische codegenerator van de tool, waardoor het snel kan worden geimplementeerd in Matlab, Python en ingebedde Arm Cortex-M apparaten.

ASN Filter Designer Powerful DSP Platform
ASN Filter Designer Powerful DSP Platform