讲解FIR filters、辅导Python编程、Python讲解、辅导Digital Signal

- 首页 >> Python编程

Assignment 2, Digital Signal processing: FIR

filters

Bernd Porr

2018

The task of this assignment is to filter an ECG with FIR filters. Before you

record from yourself please read the info-sheet and sign the consent form.

1 ECG filtering

Form groups of 2 students. Submit one report. There are different amplifiers

with different gains and converter boards available. When you record the ECG

make sure that you take a note of the gain, bits, etc. If you record with a one

channel amplifier record Einthoven II (google it what it means). Upload the files

onto the ECG forum on moodle or e-mail it to yourself. Give the file a name

which anonymises the ECG. Use only numbers, characters and the underscore

for your filename.

Every group of two has to work on a different ECG. If your initial recording

has been too noisy just record another one. You can minimise artefacts

by lying down and/or placing the electrodes on the shoulders / hips instead of

wrists/ankles. In Python load the file with the command numpy.loadtxt(’myecg.dat’.

You’ll get a numpy matrix with time-stamps in ms in the first column and 3

columns of ecg with raw unsigned integer numbers. Choose the channel with

the highest amplitude. Also note that the ECG devices will be around all Oct

/ Nov so there is plenty of time to record your ECG. You can use one of the

example ECGs from moodle to kick start your work.

The Python code must be object oriented (i.e classes). Decide which Python

classes to create to structure your code and make it readable.

Make sure you scale the ECG properly so that it’s displayed at the right

amplitude.

1. Create a Python FIR filter class which implements an FIR filter which

has a method of the form value dofilter(value) where both the value

argument and return value are scalars and not vectors so that it could

be used in a realtime system. The constructor of the class takes the

coefficients as its input:

class FIR_filter:

1

def __init__(self,_coefficients):

# your code here

def dofilter(self,v):

# your code here

return result

[30%]

2. Create a Python class which inherits or has an instance of the FIR class

above from 1 but is also able to calculate its own coefficients numerically

(=ifft) were the user can specicy the frequency response in a user friendly

way. Think of methods which can manipulate the frequency response so

that the user can specify a high/low/band/stopband filter. Then Filter

the ECG by removing the 50Hz interference and the DC. Let the Python

class automatically decide how many taps are needed. Also this filter class

needs to be able to perform realtime processing (i.e. scalar in and scalar

out for the filter operation). [30%].

2 ECG heartrate detection

The task is to detect the momentary heart rate r(t) over a longer period of

time. For example, after exercise you should see a slow decay of the heart rate

to the baseline of perhaps 60 beats per minute. It is not the average heart rate

but the frequency derived from the times between adjacent heartbeats.

Record a separate long ECG over a couple of minutes. Ask the person to

breathe in quite deeply which will change the heart rate or anything which

changes the heart rate for example sending the person up to level 8 and back.

1. Create a matched filter Python class which detects the individual heartbeats

in the ECG. Think of the optimum length of the filter and give a

reason. Optimise the detection by pre-filtering both the ECG and the

template. Remember the detection works best when both the signal and

the templates are completely DC free. Use your own FIR filter class for

it and square the output of the matched filter to increase the SNR.

Instead of taking your own ECG you can also use functions which look

like an ECG. Very popular are the so called Daubechies wavelets which

look like an ECG r-peak. Python can generate these for you.

Test your detector with an ECG which is clean and one where there are a

lot of artefacts. [20%]

2. Implement a Python class which uses the output of the matched filter

to calculate the momentary heart rate r(t) over time (not the average!)

by measuring the intervals between the detected hearbeats over the whole

period of the ECG. Detect the heartbeats by employing a threshold (adaptive,

if required). Generally use any heuristics to weed our wrong detection,

for example that a heartbeat is usually below 200bpm and above

30bpm. [20%]

Every report must be based on different ECG recordings. Please keep it short

but it should make clear what you have done and why you have done it. Include

the Python code (object oriented) as well as plots of the ECGs (timedomain)

and their frequency representation (with proper lables). If necessary enhance

the plots with InkScape and remember to use vector based image formats, for

example EPS, SVG, PDF or EMF and not pixel based formats for the report.

These figures need to be in the report not attached separately. Also, show

zoomed in ECG traces of one heartbeat so that it is possible to identify the

different parts of a single heartbeat (see Fig. 1) and that it’s possible to check

if it’s still intact.

No high level Python functions except of FFT/IFFT and the window functions

are allowed. Any use of “lfilter” or “firwin” will result in zero marks for

the whole report. If the same ECG data is spotted in two different reports this

will result in zero marks.

Hand in your report at the teaching office (Room 620 James Watt Building

South). Deadline is 12th November 3pm.

Figure 1: A normal ECG with P,Q,R,S,T waves (taken from Wikipedia)


站长地图