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).
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:
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.
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.
Wanneer we de vervuilde ECG-dataset door onze aangepaste Savitzky-Golay-filter laten gaan, en met de aanpassing voor de groepsvertraging krijgen we:
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.