我有节拍检测功能。首先,我使用 find peaks 检测 ecg 信号中的 r-peaks,并将这些峰值存储在一个数组中。然后该函数找到 ecg 峰值范围内的 ppg 信号的所有峰值,并将它们也存储在一个数组中。 现在我对几个先证者进行了多次测量,其中我的峰值将被检测到。我的代码遍历所有测量并为每个测量一个一个地执行代码。然后我的程序在先证者 2 处中断了测量 3,并出现以下错误消息。
ValueError: negative dimensions are not allowed
def beat_detect (ECG, PPG_red_interp, PPG_ir_interp, PPG_red2_interp, PPG_ir2_interp):
ecg_peaks = signal.find_peaks(ECG, height=np.mean(ECG)+2*np.std(ECG), prominence=np.mean(ECG)+np.std(ECG))
ecg_beats = np.zeros((len(ecg_peaks[0]) - 2, 110))
ppg_red_beats = np.zeros((len(ecg_peaks[0]) - 2, 110))
ppg_ir_beats = np.zeros((len(ecg_peaks[0]) - 2, 110))
ppg_red2_beats = np.zeros((len(ecg_peaks[0]) - 2, 110))
ppg_ir2_beats = np.zeros((len(ecg_peaks[0]) - 2, 110))
for i in range(1, len(ecg_peaks[0])-1):
ecg_beats[i-1] = ECG[ecg_peaks[0][i]-55:ecg_peaks[0][i]+55]
ppg_red_beats[i-1] = PPG_red_interp[ecg_peaks[0][i]-55:ecg_peaks[0][i]+55]
ppg_ir_beats[i-1] = PPG_ir_interp[ecg_peaks[0][i]-55:ecg_peaks[0][i]+55]
ppg_red2_beats[i-1] = PPG_red2_interp[ecg_peaks[0][i]-55:ecg_peaks[0][i]+55]
ppg_ir2_beats[i-1] = PPG_ir2_interp[ecg_peaks[0][i]-55:ecg_peaks[0][i]+55]
return ecg_peaks, ecg_beats, ppg_red_beats, ppg_ir_beats, ppg_red2_beats, ppg_ir2_beats
我认为这是因为我的 find peaks 函数没有在 ecg 信号中找到任何峰值,所以我在数组 ecg_peaks 中没有值。因此,对于发生错误的 ecg 信号,我用 find peaks 检测到了峰值。找到所有峰。之后我交换了我的心电信号文件,然后错误发生在先证者 7,测量 4。然后我再次交换心电图信号文件,错误只发生在先证者 17,测量 1。但是,再次更换文件没有带来任何改进。 所以这不可能是由于峰值检测或 ecg 信号数据,对吗?我该如何解决这个问题,有什么想法吗?
我会很高兴提出建议或解决方案。
你分配了
... = np.zeros((len(ecg_peaks[0]) - 2, 110))
这对输入施加了约束
.shape
——它
必须有一个以上的峰值条目。
所以检查它:
assert len(ecg_peaks[0]) >= 2, ecg_peaks[0]
... = np.zeros((len(ecg_peaks[0]) - 2, 110))
这将帮助您向上游追查问题 在数据流中,识别处理阶段 无法识别足够的 ECG 峰值。 例如,您可能希望以图形方式绘制输入 然后调整您的
height=
和prominence=
阈值。