Simulator of realistic ECG signal from rr data for matlab or python

I have a series of rr data (the distance between the rr peak in the PQRST electrocardiogram signal) and I want to generate a realistic ECG signal in matlab or python. I found some materials for matlab ( ecg built-in function in matlab), but I cannot figure out how to generate it from rr data, and I did not find anything for python. Any tips?

+4
source share
2 answers

Does this fit your needs? If not, let me know. Good luck.

 import scipy import scipy.signal as sig rr = [1.0, 1.0, 0.5, 1.5, 1.0, 1.0] # rr time in seconds fs = 8000.0 # sampling rate pqrst = sig.wavelets.daub(10) # just to simulate a signal, whatever ecg = scipy.concatenate([sig.resample(pqrst, int(r*fs)) for r in rr]) t = scipy.arange(len(ecg))/fs pylab.plot(t, ecg) pylab.show() 

ECG signal

+9
source

Steve Thoa's answer gave me a very good basis for writing the following script. This is very similar, except that I ripped out some lines of code to make it more readable for n00bs, like me. I also added a longer rest period for the heart to give a slightly more accurate replication. The script allows you to set the following: bpm heart rate, capture time, added noise, adc resolution and adc sample rate. I would recommend installing anaconda to run it. It will install the necessary libraries and provide you with an excellent ID Spyder environment to run it.

ecg signal

 import pylab import scipy.signal as signal import numpy print('Simulating heart ecg') # The "Daubechies" wavelet is a rough approximation to a real, # single, heart beat ("pqrst") signal pqrst = signal.wavelets.daub(10) # Add the gap after the pqrst when the heart is resting. samples_rest = 10 zero_array = numpy.zeros(samples_rest, dtype=float) pqrst_full = numpy.concatenate([pqrst,zero_array]) # Plot the heart signal template pylab.plot(pqrst_full) pylab.xlabel('Sample number') pylab.ylabel('Amplitude (normalised)') pylab.title('Heart beat signal Template') pylab.show() # Simulated Beats per minute rate # For a health, athletic, person, 60 is resting, 180 is intensive exercising bpm = 60 bps = bpm / 60 # Simumated period of time in seconds that the ecg is captured in capture_length = 10 # Caculate the number of beats in capture time period # Round the number to simplify things num_heart_beats = int(capture_length * bps) # Concatonate together the number of heart beats needed ecg_template = numpy.tile(pqrst_full , num_heart_beats) # Plot the heart ECG template pylab.plot(ecg_template) pylab.xlabel('Sample number') pylab.ylabel('Amplitude (normalised)') pylab.title('Heart ECG Template') pylab.show() # Add random (gaussian distributed) noise noise = numpy.random.normal(0, 0.01, len(ecg_template)) ecg_template_noisy = noise + ecg_template # Plot the noisy heart ECG template pylab.plot(ecg_template_noisy) pylab.xlabel('Sample number') pylab.ylabel('Amplitude (normalised)') pylab.title('Heart ECG Template with Gaussian noise') pylab.show() # Simulate an ADC by sampling the noisy ecg template to produce the values # Might be worth checking nyquist here # eg sampling rate >= (2 * template sampling rate) sampling_rate = 50.0 num_samples = sampling_rate * capture_length ecg_sampled = signal.resample(ecg_template_noisy, num_samples) # Scale the normalised amplitude of the sampled ecg to whatever the ADC # bit resolution is # note: check if this is correct: not sure if there should be negative bit values. adc_bit_resolution = 1024 ecg = adc_bit_resolution * ecg_sampled # Plot the sampled ecg signal pylab.plot(ecg) pylab.xlabel('Sample number') pylab.ylabel('bit value') pylab.title('%d bpm ECG signal with gaussian noise sampled at %d Hz' %(bpm, sampling_rate) ) pylab.show() print('saving ecg values to file') numpy.savetxt("ecg_values.csv", ecg, delimiter=",") print('Done') 
+6
source

All Articles