У меня есть ряд данных rr (расстояния между r-r пиком в сигнале электрокардиограммы PQRST) , и я хочу генерировать реалистичный сигнал ЭКГ в matlab или python. Я нашел некоторые материалы для matlab (ecg
встроенная функция в Matlab), но я не могу понять, как сгенерировать его из rr-данных, и я ничего не нашел для python. Любой совет?симулятор реалистичного сигнала ЭКГ из данных rr для matlab или python
4
A
ответ
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()
6
Стив Tjoa ответ дал мне очень хорошую основу для написания следующего сценария. Это очень похожее, за исключением того, что я вырвал некоторые строки кода, чтобы сделать его более понятным для n00bs, как я. Я также добавил более длинный период отдыха для сердца, чтобы дать немного более точную репликацию. Сценарий позволяет установить следующее: частота сердечных сокращений bpm, продолжительность захвата, добавленный шум, разрешение adc и частота дискретизации adc. Я бы порекомендовал установить anaconda для его запуска. Он установит необходимые библиотеки и предоставит вам отличную среду ID Spyder для ее запуска.
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')
хей, спасибо за ответ, с этим постом я уже получил перекати знак, лол – nkint 2010-12-15 19:15:48
по way.ok, я использовал что-то вроде вашего решения, но мой вопрос был (mayebe слишком специфичный для домена для общего форума программирования, как этот). Мой вопрос заключался в том, как генерировать реальный сигнал ecg, а не какие-либо сигналы. Более реалистичная ecg-волна, которую я нашел в сети, таков: http: //www.physionet.org/physiotools/ecgsyn/Matlab/, но он вычисляет rr-интервал, основанный на некоторых параметрах, и мне не удалось получить код только для одной picewise-волны (этот код делает не менее 18 волн с вычисленным rr, нет простого способа получить только 1 волну , я думаю из-за вероятностной причины ..) – nkint 2010-12-15 19:28:02