2010-12-08 1 views
4

У меня есть ряд данных rr (расстояния между r-r пиком в сигнале электрокардиограммы PQRST) , и я хочу генерировать реалистичный сигнал ЭКГ в matlab или python. Я нашел некоторые материалы для matlab (ecg встроенная функция в Matlab), но я не могу понять, как сгенерировать его из rr-данных, и я ничего не нашел для python. Любой совет?симулятор реалистичного сигнала ЭКГ из данных rr для matlab или python

ответ

9

Это соответствует вашим потребностям? Если нет, сообщите мне. Удачи.

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

+0

хей, спасибо за ответ, с этим постом я уже получил перекати знак, лол – nkint 2010-12-15 19:15:48

+0

по way.ok, я использовал что-то вроде вашего решения, но мой вопрос был (mayebe слишком специфичный для домена для общего форума программирования, как этот). Мой вопрос заключался в том, как генерировать реальный сигнал ecg, а не какие-либо сигналы. Более реалистичная ecg-волна, которую я нашел в сети, таков: http: //www.physionet.org/physiotools/ecgsyn/Matlab/, но он вычисляет rr-интервал, основанный на некоторых параметрах, и мне не удалось получить код только для одной picewise-волны (этот код делает не менее 18 волн с вычисленным rr, нет простого способа получить только 1 волну , я думаю из-за вероятностной причины ..) – nkint 2010-12-15 19:28:02

6

Стив Tjoa ответ дал мне очень хорошую основу для написания следующего сценария. Это очень похожее, за исключением того, что я вырвал некоторые строки кода, чтобы сделать его более понятным для n00bs, как я. Я также добавил более длинный период отдыха для сердца, чтобы дать немного более точную репликацию. Сценарий позволяет установить следующее: частота сердечных сокращений bpm, продолжительность захвата, добавленный шум, разрешение adc и частота дискретизации adc. Я бы порекомендовал установить anaconda для его запуска. Он установит необходимые библиотеки и предоставит вам отличную среду ID Spyder для ее запуска.

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 
# e.g. 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') 

 Смежные вопросы

  • Нет связанных вопросов^_^