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.
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.
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
https://www.advsolned.com/wp-content/uploads/2018/02/ASN_logo.jpg00adminhttps://www.advsolned.com/wp-content/uploads/2018/02/ASN_logo.jpgadmin2020-09-30 11:59:192020-10-05 17:04:44Verschil tussen IIR en FIR filters: een praktische ontwerp gids
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:
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).
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:
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.
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.
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.
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:
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.