1. Trang chủ
  2. » Luận Văn - Báo Cáo

Nghiên cứu và phát triển thuật toán lọc nhiễu thở trong đo lường cung lượng tim bằng phương pháp trở kháng ngực

90 6 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 90
Dung lượng 2,2 MB

Nội dung

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN ĐIỆN TỬ - VIỄN THÔNG LUẬN VĂN THẠC SĨ Nghiên cứu phát triển thuật toán lọc nhiễu thở đo lường Cung lượng tim phương pháp trở kháng ngực CHU QUANG DẦN chuquangdan37@gmail.com Ngành Kỹ thuật y sinh Giảng viên hướng dẫn: PGS TS Vũ Duy Hải Viện: Điện tử - Viễn thông, Trường Đại học Bách Khoa Hà Nội HÀ NỘI, 9/2020 TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI LUẬN VĂN THẠC SĨ Nghiên cứu phát triển thuật toán lọc nhiễu thở đo lường Cung lượng tim phương pháp trở kháng ngực CHU QUANG DẦN chuquangdan37@gmail.com Ngành Kỹ thuật y sinh Giảng viên hướng dẫn: PGS TS Vũ Duy Hải Viện: Điện tử - Viễn thông, Trường Đại học Bách Khoa Hà Nội HÀ NỘI, 9/2020 CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập – Tự – Hạnh phúc BẢN XÁC NHẬN CHỈNH SỬA LUẬN VĂN THẠC SĨ Họ tên tác giả luận văn: Chu Quang Dần Đề tài luận văn: NGHIÊN CỨU VÀ PHÁT TRIỂN THUẬT TOÁN LỌC NHIỄU THỞ TRONG ĐO LƯỜNG CUNG LƯỢNG TIM BẰNG PHƯƠNG PHÁP TRỞ KHÁNG NGỰC Chuyên ngành: Kỹ thuật Y sinh Mã số SV: CB180179 Tác giả, Người hướng dẫn khoa học Hội đồng chấm luận văn xác nhận tác giả sửa chữa, bổ sung luận văn theo biên họp Hội đồng ngày 02/10/2010 với nội dung sau: Đã chỉnh sửa tồn số lỗi tả, lề xuống dịng theo góp ý hội đồng Ngày 09 tháng 10 năm 2020 Giáo viên hướng dẫn CHỦ TỊCH HỘI ĐỒNG Tác giả luận văn ĐỀ TÀI LUẬN VĂN NGHIÊN CỨU VÀ PHÁT TRIỂN THUẬT TOÁN LỌC NHIỄU THỞ TRONG ĐO LƯỜNG CUNG LƯỢNG TIM BẰNG PHƯƠNG PHÁP TRỞ KHÁNG NGỰC Giáo viên hướng dẫn Ký ghi rõ họ tên Lời cảm ơn Tôi xin gửi lời cảm ơn sâu sắc đến PGS.TS Vũ Duy Hải, người trực tiếp hướng dẫn có góp ý, chỉnh sửa để đề tài luận văn thực thành công Đồng thời xin gửi lời cảm ơn đến nhà trường Bộ môn Công nghệ Điện tử Kỹ thuật Y sinh tạo điều kiện để tơi thực luận văn Tóm tắt nội dung luận văn Mục đích, đối tượng, phạm vi nghiên cứu Mục tiêu cụ thể: mục tiêu nghiên cứu luận văn cụ thể hóa sau: • Khảo sát, đánh giá cách đầy đủ nhiễu thở ghi đo tín hiệu trở kháng ngực dải phổ, biên độ ảnh hưởng đến việc phát điểm đặc trưng tín hiệu ICG phục vụ mục đích tính tốn thơng số huyết động • Tìm hiểu tổng hợp số phương pháp sử dụng để loại bỏ nhiễu thở đánh giá ưu, nhược điểm phương pháp • Nghiên cứu, đề xuất thuật toán nhằm loại bỏ thành phần nhiễu thở tín hiệu thu • Đánh giá hiệu lọc nhiễu thuật toán đề xuất từ sở liệu xây dựng tín hiệu ICG chuẩn Ý nghĩa khoa học thực tiễn đề tài Đề tài nghiên cứu thực luận văn nhằm giải vấn đề đo lường Cung lượng tim phương pháp trở kháng ngực loại bỏ nhiễu thở Điều hỗ trợ việc trích xuất điểm đặc trưng từ đồ thị tín hiệu ICG cách xác hơn, từ nâng cao độ xác thơng số huyết động tính tốn Các phương pháp lọc nhiễu thở chưa thực triệt để, phương pháp tổn ưu nhược điểm riêng Luận văn đề xuất thuật tốn lọc nhiễu nhằm tối ưu hóa hiệu lọc nhiễu, cải thiện độ xác thơng số tính tốn Từ giúp phương pháp trở kháng ngực có ý nghĩa mặt lâm sàng, hỗ trợ chẩn đoán điều trị bệnh liên quan đến tim Phương pháp nghiên cứu Các phương pháp nghiên cứu sử dụng đề tài là: • Phương pháp thu thập thông tin: tài liệu thu thập nghiên cứu từ sở liệu thống báo khoa học tài liệu kế thừa từ nghiên cứu trước • Phương pháp lý luận: tổng hợp, nghiên cứu đánh giá sở lý thuyết kết thực tế phương pháp lọc nhiễu nay, từ đưa đề xuất thuật tốn dựa đánh giá cách kết hợp ưu điểm phương pháp lại với Tạo nguồn tín hiệu đầu vào cho lọc với thơng số biết trước từ cho khả đánh giá cách đầy đủ hiệu lọc nhiễu lọc • Phương pháp thực nghiệm: tiến hành thử nghiệm thuật tốn với nguồn tín hiệu đầu vào, so sánh định lượng định tính kết đầu so với tín hiệu chuẩn Phân tích đặc trưng nhiễu thở ảnh hưởng dựa tín hiệu nhiễu thở thực tế thu tình nguyện viên Kết luận văn hồn thành yêu cầu đặt ban đầu, kết cuối thuật toán cho hiệu lọc nhiễu tốt với hai trường hợp thở bình thường thở gắng sức, nhiên trường hợp thở nhanh thuật tốn chưa hoạt động hiệu HỌC VIÊN Ký ghi rõ họ tên MỤC LỤC PHẦN MỞ ĐẦU xiii CHƯƠNG TỔNG QUAN 1.1 Cung lượng tim 1.1.1 Định nghĩa 1.1.2 Vai trò cung lượng tim 1.1.3 Các yếu tố ảnh hưởng đến cung lượng tim 1.2 Các phương pháp đo lường cung lượng tim 1.3 Phương pháp tim đồ trở kháng ngực CHƯƠNG NHIỄU THỞ VÀ ẢNH HƯỞNG CỦA NHIỄU THỞ LÊN ĐO LƯỜNG CUNG LƯỢNG TIM BẰNG PHƯƠNG PHÁP TIM ĐỒ TRỞ KHÁNG NGỰC 13 2.1 Nhiễu thở ghi đo tín hiệu ICG 13 2.2 Ảnh hưởng nhiễu thở phương pháp ICG 14 2.2.1 Dải phổ biên độ 14 2.2.2 Các điểm đặc trưng công thức tính tốn thơng số huyết động 16 2.2.3 Ảnh hưởng nhiễu thở lên việc xác định điểm đặc trưng 19 CHƯƠNG CÁC THUẬT TOÁN LOẠI BỎ NHIỄU THỞ 22 3.1 Tổng hợp phương pháp loại bỏ nhiễu thở 22 3.1.1 Nhóm phương pháp khơng sử dụng tín hiệu thở làm tham chiếu 22 3.1.2 Nhóm phương pháp sử dụng tín hiệu thở làm tham chiếu 26 3.1.3 Nhận xét 28 3.2 Đề xuất thuật toán lọc nhiễu thở dựa biến đổi Wavelet trung bình tồn 28 CHƯƠNG TRIỂN KHAI THUẬT TOÁN 31 4.1 Lọc số vi phân số 31 4.1.1 Lọc số 31 4.1.2 Vi phân số 35 4.2 Biến đổi Wavelet 36 4.2.1 Cơ sở lý thuyết 36 4.2.2 Thuật toán Mallat 40 4.3 Trung bình tồn 43 4.3.1 Thuật tốn phát đỉnh R tín hiệu ECG 43 4.3.2 Thuật toán trung bình tồn 45 CHƯƠNG KẾT QUẢ VÀ BÀN LUẬN 46 5.1 Kết đánh giá thuật toán 46 5.1.1 Phương pháp đánh giá thuật toán 46 5.1.2 Cơng cụ xử lý tín hiệu 47 5.1.3 Kết đánh giá: 49 5.2 Kết luận kiến nghị 58 5.2.1 Kết luận chung 58 5.2.2 Hướng phát triển đề tài 59 5.2.3 Kiến nghị đề xuất 59 TÀI LIỆU THAM KHẢO 61 PHỤ LỤC CODE 62 DANH MỤC HÌNH VẼ Hình 1.1 Ảnh hưởng nhịp tim tới cung lượng tim CO Hình 1.2 Khả co bóp tim trạng thái bệnh lý khác Hình 1.3 Ảnh hưởng áp suất máu cuối kỳ tâm trương tới giá trị CO Hình 1.4 Nguyên lý tổng quát đo tim đồ trở kháng ngực 10 Hình 1.5 Dạng tim đồ trở kháng ngực (ICG) tín hiệu điện tim ECG 11 Hình 2.1 Ảnh hưởng nhiễu thở trạng thái thở bình thường lên tín hiệu ICG (dZ/dt) 15 Hình 2.2 Ảnh hưởng nhiễu thở trạng thái thở nhanh lên tín hiệu ICG (dZ/dt) 15 Hình 2.3 Ảnh hưởng nhiễu thở trạng thái thở gắng sức lên tín hiệu ICG (dZ/dt) 16 Hình 2.4 Các điểm đặc trưng quan trọng tín hiệu ICG 17 Hình 3.1 Biểu diễn tín hiệu dZ/dt tín hiệu ECG trục thời gian [6] 22 Hình 3.2 Sơ đồ khối lọc thích nghi sử dụng biến đổi wavelet [12] 26 Hình 3.3 Sơ đồ khối lọc nhiễu thở thích nghi sử dụng cảm biến dịng khí [13] 27 Hình 3.4 Vị trí đặt điện cực thiết bị loại gắn ngực [14] 28 Hình 3.5 Sơ đồ thực thuật tốn theo mơ hình lọc nhiễu thở đề xuất 30 Hình 4.1 Mơ hình tích chập dạng trực tiếp lọc FIR với trạng thái trung gian 34 Hình 4.2 Ba dạng hàm wavelet a) Wavelet Harr, b) Wavelet Daubechies 5, c) Wavelet Morlet 38 Hình 4.3 Sơ đồ thuật tốn Mallat chiều phân giải tín hiệu 41 Hình 4.4 Sơ đồ thuật tốn Mallat chiều khơi phục tín hiệu 42 Hình 4.5 Phương pháp tạo đáp ứng xung lọc dùng biến đổi wavelet 42 Hình 4.6 Ví dụ hệ số lọc tạo từ lọc wavelet tỉ lệ gốc 43 Hình 4.7 Sơ đồ khối thực thi thuật tốn Pan-Tompkins 44 Hình 5.1 Mơ hình đánh giá thuật tốn lọc nhiễu 46 Hình 5.2 Giao diện phần mềm thiết kế lọc số C# 48 Hình 5.3 Trang giao diện phần lọc số phần mềm thiết kế lọc số C# 49 Hình 5.4 Giao diện cơng cụ xử lý tín hiệu C# 49 Hình 5.5 Giao diện phần lọc wavelet cơng cụ xử lý tín hiệu C# 49 Hình 5.6 Dạng sóng ECG trung gian sau tích phân cửa sổ dịch chuyển 51 Hình 5.7 Tín hiệu ECG với điểm đánh dấu 51 Hình 5.8 Tín hiệu ICG dạng sóng lớn nhiễu thở bình thường trước sau xử lý 52 Hình 5.9 Tín hiệu ICG dạng sóng lớn nhiễu thở gắng sức trước sau xử lý53 Hình 5.10 Tín hiệu ICG dạng sóng lớn nhiễu thở nhanh trước sau xử lý 54 Hình 5.11 Tín hiệu ICG dạng sóng nhỏ nhiễu thở bình thường trước sau xử lý 55 Hình 5.12 Tín hiệu ICG dạng sóng nhỏ nhiễu thở gắng sức trước sau xử lý 56 Hình 5.13 Tín hiệu ICG dạng sóng nhỏ nhiễu thở nhanh trước sau xử lý 57 public double[] coif3 = new double[] { 0.0037935129, 0.0077825964, -0.0234526961, -0.0657719113, 0.0611233900, 0.4051769024, -0.7937772226, 0.4284834764, 0.0717998216, -0.0823019271, -0.0345550276, 0.0158805449, 0.0090079761, -0.0025745177, -0.0011175188, 0.0004662170, 0.0000709833, -0.0000345998 }; public static double[] coif4 = new double[] { -0.0008923137, -0.0016294920, 0.0073461663, 0.0160689440, 0.0266823002, -0.0812666997, 0.0560773133, 0.4153084070, -0.7822389309, 0.4343860565, 0.0666274743, -0.0962204420, -0.0393344271, 0.0250822618, 0.0152117315, -0.0056582867, 0.0037514362, 0.0012665619, 0.0005890208, -0.0002599746, -0.0000623390, 0.0000312299, 0.0000032597, -0.0000017850 }; public static double[] coif5 = new double[] { 0.0002120808, 0.0003585897, -0.0021782364, -0.0041593588, 0.0101311175, 0.0234081568, -0.0281680290, -0.0919200106, 0.0520431632, 0.4215662067, -0.7742896037, 0.4379916262, 0.0620359640, -0.1055742087, -0.0412892088, 0.0326835743, 0.0197617789, -0.0091642312, -0.0067641854, 0.0024333732, 0.0016628637, -0.0006381313, -0.0003022596, 0.0001405411, 0.0000413404, -0.0000213150, 0.0000037347, 0.0000020638, 1.674E-70000, -9.52E-800000 }; //giá trị hàm wavelet dạng Biorthogonal public static double[] bior11 = new double[] { -0.7071067812, 0.7071067812 }; public static double[] bior13w = new double[] { 0, 0, -0.7071067812, 0.7071067812, 0, }; public static double[] bior13s = new double[] { -0.0883883476, 0.0883883476, 0.7071067812, 0.7071067812, 0.0883883476, -0.0883883476 }; public static double[] bior15w = new double[] { 0, 0, 0, 0, -0.7071067812, 0.7071067812, 0, 0, 0, }; public static double[] bior15s = new double[] { 0.0165728152, -0.0165728152, -0.1215339780, 0.1215339780, 0.7071067812, 0.7071067812, 0.1215339780, -0.1215339780, -0.0165728152, 0.0165728152 }; /////////////////////////////////////////////////////////////////////////////// private int DataOrder = 0; private int DataLength; private int WaveletLevel; private int WaveletFilterLength; private double[] WaveletType; List data_3Cycles = new List(); private List RminList = new List(); private List LmaxList = new List(); /////////////////////////////////////////////////////////////////////////////// private void WaveletTransform_Btn_Click(object sender, EventArgs e) { Series SpectraSeries = Spectrum_Chart.Series[0]; SpectraSeries.Points.Clear(); SignalSelect = 1; Data_Analysis = MainSig_List; _SamplingRate = MainSig_SR; //DisplaySignal(); 63 DerivativeSig_List_Float.Clear(); for (int i = 0; i < Data_Analysis.Count; i++) { DerivativeSig_List_Float.Add((float)Data_Analysis[i]); } List Wavelet_Result = Wavelet_ProcessData(DerivativeSig_List_Float); for (int i = 0; i < Wavelet_Result.Count; i++) { SpectraSeries.Points.AddXY(i, 10000 + Wavelet_Result[i]); ProcessedSig_rtbx.AppendText((10000 + Wavelet_Result[i]).ToString() + "\r\n"); } } /////////////////////////////////////////////////////////////////////////////// int SAMPLE_FREQ = 1000; private List Wavelet_ProcessData(List data) { double[] waveletType = _wavelet.db8;//meyer _wavelet.SetParameters(SAMPLE_FREQ, 10, waveletType); double[] highPassFilter = _wavelet.Hi_Decomposition(); double[] lowPassFilter = _wavelet.Lo_Decomposition(); //////////////////////////////////////////////////// List d1_D = _wavelet.DownSampling(_wavelet.ConvolutionFunction(data, highPassFilter)); List a1_D = _wavelet.DownSampling(_wavelet.ConvolutionFunction(data, lowPassFilter)); List d2_D = _wavelet.DownSampling(_wavelet.ConvolutionFunction(a1_D, highPassFilter)); List a2_D = _wavelet.DownSampling(_wavelet.ConvolutionFunction(a1_D, lowPassFilter)); List d3_D = _wavelet.DownSampling(_wavelet.ConvolutionFunction(a2_D, highPassFilter)); List a3_D = _wavelet.DownSampling(_wavelet.ConvolutionFunction(a2_D, lowPassFilter)); List d4_D = _wavelet.DownSampling(_wavelet.ConvolutionFunction(a3_D, highPassFilter)); List a4_D = _wavelet.DownSampling(_wavelet.ConvolutionFunction(a3_D, lowPassFilter)); List d5_D = _wavelet.DownSampling(_wavelet.ConvolutionFunction(a4_D, highPassFilter)); List a5_D = _wavelet.DownSampling(_wavelet.ConvolutionFunction(a4_D, lowPassFilter)); List d6_D = _wavelet.DownSampling(_wavelet.ConvolutionFunction(a5_D, highPassFilter)); List a6_D = _wavelet.DownSampling(_wavelet.ConvolutionFunction(a5_D, lowPassFilter)); List d7_D = _wavelet.DownSampling(_wavelet.ConvolutionFunction(a6_D, highPassFilter)); List a7_D = _wavelet.DownSampling(_wavelet.ConvolutionFunction(a6_D, lowPassFilter)); List d8_D = _wavelet.DownSampling(_wavelet.ConvolutionFunction(a7_D, highPassFilter)); 64 List a8_D = _wavelet.DownSampling(_wavelet.ConvolutionFunction(a7_D, lowPassFilter)); List d9_D = _wavelet.DownSampling(_wavelet.ConvolutionFunction(a8_D, highPassFilter)); List a9_D = _wavelet.DownSampling(_wavelet.ConvolutionFunction(a8_D, lowPassFilter)); List d10_D = _wavelet.DownSampling(_wavelet.ConvolutionFunction(a9_D, highPassFilter)); List a10_D = _wavelet.DownSampling(_wavelet.ConvolutionFunction(a9_D, lowPassFilter)); //////////////////////////////////////////////////////////////////// List a9_D_Reconstructed = _wavelet.GetReconstructedCoefficients(d10_D, a10_D, a9_D, "d"); List a8_D_Reconstructed = _wavelet.GetReconstructedCoefficients(d9_D, a9_D_Reconstructed, a8_D, "d"); List a7_D_Reconstructed = _wavelet.GetReconstructedCoefficients(d8_D, a8_D_Reconstructed, a7_D, "d"); List a6_D_Reconstructed = _wavelet.GetReconstructedCoefficients(d7_D, a7_D_Reconstructed, a6_D, "d"); List a5_D_Reconstructed = _wavelet.GetReconstructedCoefficients(d6_D, a6_D_Reconstructed, a5_D, "d"); List a4_D_Reconstructed = _wavelet.GetReconstructedCoefficients(d5_D, a5_D_Reconstructed, a4_D, "a+d"); List a3_D_Reconstructed = _wavelet.GetReconstructedCoefficients(d4_D, a4_D_Reconstructed, a3_D, "a+d"); List a2_D_Reconstructed = _wavelet.GetReconstructedCoefficients(d3_D, a3_D_Reconstructed, a2_D, "a+d"); List a1_D_Reconstructed = _wavelet.GetReconstructedCoefficients(d2_D, a2_D_Reconstructed, a1_D, "a+d"); List ReconstructedSignal = _wavelet.ReconstructSignal(d1_D, a1_D_Reconstructed, "a+d"); List tmp_FinalReconstructedSignal = _myLib.MiddleTruncateSignal(ReconstructedSignal, data); return tmp_FinalReconstructedSignal; } /////////////////////////////////////////////////////////////////////////////// public void SetParameters(int dataLength, int waveletLevel, double[] waveletType) { this.DataLength = dataLength; this.WaveletLevel = waveletLevel; this.WaveletFilterLength = waveletType.Length; this.WaveletType = waveletType; } /////////////////////////////////////////////////////////////////////////////// public int CalculateRmin() { int Rmin = 0; 65 int ceil = (int)((DataLength * DataOrder) / ((int)Math.Pow(2, WaveletLevel))) + 1; Rmin = (int)Math.Pow(2, WaveletLevel) * ceil - DataOrder * DataLength; if (Rmin == (int)Math.Pow(2, WaveletLevel)) Rmin = 0; return Rmin; } /////////////////////////////////////////////////////////////////////////////// public int CalculateLmax(int Rmin) { int Lmax = 0; Lmax = ((int)Math.Pow(2, WaveletLevel) - 1) * (WaveletFilterLength - 1) - Rmin; return Lmax; } ///////////////////////////////////////////////////////////////////////////////// public List ConvolutionFunction(List data, double[] filterCoefficients) { int Length = data.Count + filterCoefficients.Length - 1; ; var result = new double[Length]; List filteredSignal = new List(); for (int i = 0; i < data.Count; i++) { for (int j = 0; j < filterCoefficients.Length; j++) { result[i + j] += data[i] * filterCoefficients[j]; } } foreach (float tmpVar in result) { filteredSignal.Add(tmpVar); } return filteredSignal; } /////////////////////////////////////////////////////////////////////////////// public List DownSampling(List data) { List result = new List(); for (int i = 0; i < data.Count; i++) { float value = 0; if (i % == 0) { value = data[i]; 66 result.Add(value); } } return result; } /////////////////////////////////////////////////////////////////////////////// public List UpSampling(List data) { List result = new List(); int iniLength = data.Count; int upLength = * iniLength - 1; for (int i = 0; i < upLength; i++) { float value = new float(); if (i % == 0) { value = data[i / 2]; result.Add(value); } else { value = 0; result.Add(value); } } return result; } /////////////////////////////////////////////////////////////////////////////// public double[] Lo_Reconstruction() { double[] coefficents = this.WaveletType; double[] Lo_R = new double[coefficents.Length]; for (int i = 0; i < coefficents.Length; i++) { Lo_R[i] = coefficents[i] / 0.7071; } return Lo_R; } /////////////////////////////////////////////////////////////////////////////// public double[] Lo_Decomposition() { double[] Lo_R = Lo_Reconstruction(); double[] Lo_D = Lo_R; Array.Reverse(Lo_D); 67 return Lo_D; } /////////////////////////////////////////////////////////////////////////////// public double[] Hi_Reconstruction() { double[] Lo_R = Lo_Reconstruction(); int N = Lo_R.Length; double[] Hi_R = new double[N]; for (int i = 0; i < N; i++) { if ((i % 2) == 0) Hi_R[i] = Lo_R[N - i - 1]; else Hi_R[i] = -Lo_R[N - i - 1]; } return Hi_R; } /////////////////////////////////////////////////////////////////////////////// public double[] Hi_Decomposition() { double[] Hi_R = Hi_Reconstruction(); double[] Hi_D = Hi_R; Array.Reverse(Hi_D); return Hi_D; } /////////////////////////////////////////////////////////////////////////////// public int CalculatePmin(int dataLength, int waveletLevel, int dataNumIndex) { int Pmin = 0; int ceil = 0; if (dataNumIndex == (int)(int)Math.Pow(2, waveletLevel)) { ceil = dataLength; } else { ceil = (int)(dataNumIndex * dataLength / Math.Pow(2, waveletLevel)) + 1; } Pmin = (int)Math.Pow(2, waveletLevel) * ceil - dataNumIndex * dataLength; return Pmin; } //////////////////////////////////////////////////////////////////////////////// public int CalculateLmax(int waveletLevel, int filterLength, int Pmin) 68 { int Lmax = 0; int r_d = ((int)(Math.Pow(2, waveletLevel)) - 1) * (filterLength - 1); Lmax = r_d - Pmin; return Lmax; } /////////////////////////////////////////////////////////////////////////////// public List GetReconstructedCoefficients(List d_D, List a_D, List pre_a_D, string select) { List ReconstructedSig_Tmp = ReconstructSignal(d_D, a_D, select);// To reconstruct a2_D from a3_D and d3_D int firstIndex0; int lastIndex0; if (((ReconstructedSig_Tmp.Count - pre_a_D.Count)) % != 0) { firstIndex0 = ((ReconstructedSig_Tmp.Count - pre_a_D.Count) / 2) + 1; lastIndex0 = ReconstructedSig_Tmp.Count - ((ReconstructedSig_Tmp.Count - pre_a_D.Count) / 2) + 1; } else { firstIndex0 = ((ReconstructedSig_Tmp.Count - pre_a_D.Count) / 2); lastIndex0 = ReconstructedSig_Tmp.Count - ((ReconstructedSig_Tmp.Count - pre_a_D.Count) / 2); } List a_D_Reconstructed = new List(); if (((ReconstructedSig_Tmp.Count - pre_a_D.Count)) % == 0) { for (int i = firstIndex0; i < lastIndex0; i++) { float value = new float(); value = ReconstructedSig_Tmp[i]; a_D_Reconstructed.Add(value); } } else { for (int i = firstIndex0; i < lastIndex0 - 1; i++) { float value = new float(); value = ReconstructedSig_Tmp[i]; a_D_Reconstructed.Add(value); } } 69 return a_D_Reconstructed; } /////////////////////////////////////////////////////////////////////////////// public List LeftTruncateSignal(List input, int LeftIndex) { List result = new List(); input.RemoveRange(0, LeftIndex); result = input; return result; } /////////////////////////////////////////////////////////////////////////////// public List RightTruncateSignal(List input, int Right) { List result = new List(); input.Reverse(); input.RemoveRange(0, Right); input.Reverse(); result = input; return result; } Các hàm thực thuật toán phát đỉnh R tín hiệu ECG /////////////////////////////////////////////////////////////////////////////// private void ECG_Processing(object sender, EventArgs e) { R_Peaks_List.Clear(); List QRS_Location_List = new List(); PointF QRS_Location_Point = new PointF(); QuickClearChart(Temp_Processing_ECG_Series); QuickClearChart(QRSComplex_Series); QuickClearChart(QRSCompleLocation_Series); QuickClearChart(T_Point_Series); List Processed_ECG = new List(); Processed_ECG = _myLibrary.FivePointDer(ECG_Signal_List, MainSig_SamplingRate); Processed_ECG = _myLibrary.SquareSignal(Processed_ECG); Processed_ECG = _myLibrary.MovingWindowIntegration(Processed_ECG, 64); List Tem_Data = new List(); for (int i = 0; i < Processed_ECG.Count; i++) 70 { try { if (i = ECG_Thres && (Processed_ECG[i - 1] / 1000) < ECG_Thres) { QRS_Location_Point.X = i - 40; Tem_Data.Clear(); } else if ((Processed_ECG[i] / 1000) ECG_Thres) { QRS_Location_Point.Y = i - 40;//-20 QRS_Location_List.Add(QRS_Location_Point) for (int j = (int)QRS_Location_Point.X; j < QRS_Location_Point.Y; j++) { PointF point = new PointF(); point.X = j; point.Y = ECG_Signal_List[j] Tem_Data.Add(point); } PointF MaxPoint = new PointF(); MaxPoint = _myLibrary.findMaxPoint(Tem_Data); QRSCompleLocation_Series.Points.AddXY(MaxPoint.X, MaxPoint.Y); R_Peaks_List.Add(MaxPoint); } Temp_Processing_ECG_Series.Points.AddXY(i, Processed_ECG[i] / 1000); } } catch (Exception ex) { } } for (int i = 0; i < R_Peaks_List.Count; i++) { if (i < (R_Peaks_List.Count - 1)) { Tem_Data.Clear(); for (int j = (int)R_Peaks_List[i].X + 10; j < R_Peaks_List[i + 1].X - 50; j++) { 71 PointF point = new PointF(); point.X = j; point.Y = ECG_Signal_List[j]; Tem_Data.Add(point) } PointF MaxPoint = new PointF(); MaxPoint = _myLibrary.findMaxPoint(Tem_Data); } } } /////////////////////////////////////////////////////////////////////////////// public List ForwarsDer(List data, float fs) { data.Insert(0, previousDataToDeriviate); List derivattive = new List(); for (int i = 0; i < data.Count; i++) { float value = 0; if (i < (data.Count - 1)) { value = (data[i + 1] - data[i]) / ((float)(50 / fs)); derivattive.Add(value); } else previousDataToDeriviate = data[i]; } data.Clear(); return derivattive; } /////////////////////////////////////////////////////////////////////////////// public List FivePointDer(List data, float fs) { List InputData = data.ToList(); if (fourPreviousDataToDeriviate.Count == 0) { for (int i = 0; i < 4; i++) { InputData.Insert(i, 0); } } else { for (int i = 0; i < 4; i++) { InputData.Insert(i, fourPreviousDataToDeriviate[4 - - i]); 72 } fourPreviousDataToDeriviate.Clear(); } List derivattive = new List(); float h = / fs; for (int i = 4; i < InputData.Count; i++) { float value = -1 * (-25 * InputData[i] + 48 * InputData[i - 1] - 36 * InputData[i - 2] + 16 * InputData[i - 3] - * InputData[i - 4]) / (12 * h); derivattive.Add(value); if (i >= (InputData.Count - 4)) fourPreviousDataToDeriviate.Add(InputData[i]); } //data.Clear(); return derivattive; } /////////////////////////////////////////////////////////////////////////////// public List MovingWinIntegrator(List data, int N) { List integral = new List(); for (int i = 0; i < data.Count; i++) { float value = 0; if (i == 0) { value = 0; integral.Add(value); } if (i 0) { float temp = 0; for (int j = 0; j < i; j++) { temp += ((data[j])) / N; } value = temp; integral.Add(value); } if (i > N) { float temp = 0; for (int j = 1; j = 1) { if (data[i - 1] > data[i]) { markDescending = 1; value = data[i]; temp_LocalMinimums.Add(value); } else { if (markDescending == 1) { PointF point = new PointF(i, temp_LocalMinimums.ElementAt(temp_LocalMinimums.Count - 1)); localMinimums.Add(point); } markDescending = 0; } } } return localMinimums; } /////////////////////////////////////////////////////////////////////////////// public List peakDetector(List data) { List peaks = new List(); List tempPeaks = new List(); int markAscending = 0; 74 for (int i = 0; i < data.Count; i++) { float value = 0; if (i >= 1) { if (data[i - 1] = 0) { positiveTrend = true; if (negativeTrend == true) { negativeTrend = false; PointF point = new PointF(); point.X = i - 1; point.Y = data[i - 1]; zeroCrossingPoint.Add(point); } negativeTrend = false; 75 } else { negativeTrend = true; if (positiveTrend == true) { positiveTrend = false; PointF point = new PointF(); point.X = i - 1; point.Y = data[i - 1]; zeroCrossingPoint.Add(point); } positiveTrend = false; } } return zeroCrossingPoint; } Hàm thực phép trung bình toàn /////////////////////////////////////////////////////////////////////////////// private void CreateTypicalSample_btn_Click(object sender, EventArgs e) { List Cardiac_Cycle_Length_List = new List(); // Tách chu kỳ tín hiệu ICG for (int i = 0; i < ECG_R_Selected_List.Count; i++) { List ICG_Each_Cycle_List = new List(); PointF Sample = new PointF(); if (i

Ngày đăng: 07/12/2021, 19:46

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
[1] D. V. Hung, P. D. Hung, C. Q. Dan, V. D. Hai, D. T. Nhung, “A New Method of Measuring Impedance Cardiography for Cardiac Output Estimation by Directly Digitizing the High Frequency Modulated Signal at Lower Sampling Rate”, Journal of Science and Technology, 2019 Sách, tạp chí
Tiêu đề: A New Method of Measuring Impedance Cardiography for Cardiac Output Estimation by Directly Digitizing the High Frequency Modulated Signal at Lower Sampling Rate”, "Journal of Science and Technology
[2] L. E. Baker, L. A. Geddes, “Transthoracic current paths in impedance spirometry”, Proc. Symp. Biomed. Eng, pp. 181-186 , vol. 1, 1966 Sách, tạp chí
Tiêu đề: Transthoracic current paths in impedance spirometry”, "Proc. Symp. Biomed. Eng
[3] L. E. Baker, L. A. Geddes, H. E. Hoff, C. J. Chaput, “Physiological factors underlying transthoracic impedance variations in respiration”, Journal of Applied Physiology , 21 (5), pp. 1491-1499, 1966 Sách, tạp chí
Tiêu đề: Physiological factors underlying transthoracic impedance variations in respiration”, "Journal of AppliedPhysiology
[4] J. L. Logic, M. G. Maksud, L. H. Hamilton, “Factors affecting transthoracic impedance signals used to measure breathing”, Journal of Applied Physiology , 22 (2), pp. 251-254, 1967 Sách, tạp chí
Tiêu đề: Factors affecting transthoracicimpedance signals used to measure breathing”, "Journal of Applied Physiology
[5] R. Hill, J. Jansen, J. Fling, “Electrical impedance plethysmography: a critical analysis”, Journal of Applied Physiology , 22 (1), pp. 161-168, 1967 Sách, tạp chí
Tiêu đề: Electrical impedance plethysmography: a criticalanalysis”, "Journal of Applied Physiology
[6] R. M. Kelsey, W. Guethlein, “An evaluation of the ensemble averaged Impedance Cardiogram”, Psychophisiology USA, vol. 27, No. 1, pp. 25-27, 1990 Sách, tạp chí
Tiêu đề: An evaluation of the ensemble averaged Impedance Cardiogram”, "Psychophisiology USA
[7] B. E. Hurwitz, L. Y. Shyu, S. P. Reddy, N. Schneiderman, and J. H. Nagel, “Coherent ensemble averaging techniques for impedance carrdiography”, Proc. 3rd Annu. IEEE Symp. Comp. Based Med. Syst., 1988 Sách, tạp chí
Tiêu đề: Coherent ensemble averaging techniques for impedance carrdiography”, "Proc. 3rd Annu. IEEE Symp. Comp. Based Med. Syst
[8] Y. Yamamoto, M. S. Tamura, Y. Mouth, M. Miyasita, and H. Hamamoto, “Design and implementation for beat-by-beat impedance cardiography”, IEEE Trans. Biomed. Eng., vol. 35(12), pp. 1086-1090, 1988 Sách, tạp chí
Tiêu đề: Design and implementation for beat-by-beat impedance cardiography”, "IEEE Trans. Biomed. Eng
[9] S. B. Raza, R. P. Patterson, and L. Wang, “Filtering respiration and low- frequency movement artefacts from the cardiogenic electrical impedance signal”, Med. Biol. Eng. Comput., pp. 556-561, 1992 Sách, tạp chí
Tiêu đề: Filtering respiration and low-frequency movement artefacts from the cardiogenic electrical impedance signal”, "Med. Biol. Eng. Comput
[10] A. K. Barrows, M. Yoshizawa, and Y. Yasuda, “Filtering noncorrelated noise in impedance cardiography”, IEEE Trans. Biomed. Eng., vol. 42(3), pp. 324- 327, 1995 Sách, tạp chí
Tiêu đề: Filtering noncorrelated noise in impedance cardiography”, "IEEE Trans. Biomed. Eng
[11] V. K. Pandey, P. C. Pandey, “Wavelet based cancelation of respiratory artifacts in impedance cardiography”, Proc. 15th Intl. Conf. on Digital Signal Processing (IEEE/DSP), pp. 191-194, 2007 Sách, tạp chí
Tiêu đề: Wavelet based cancelation of respiratory artifacts in impedance cardiography”, "Proc. 15th Intl. Conf. on Digital Signal Processing (IEEE/DSP)
[12] M. Mallam, K. C. B. Rao, “Efficient reference-free adaptive artifact cancellers for impedance cardiography based remote health care monitoring systems”, Springer Plus 5:770, pp. 1-17, 2016 Sách, tạp chí
Tiêu đề: Efficient reference-free adaptive artifact cancellers for impedance cardiography based remote health care monitoring systems”, "Springer Plus 5:770
[13] V. K. Pandey and P.C. Pandey, “Cancellation of respiratory artifacts in impedance cardiography”, Proc. 27th Annual Int. Conf. of the IEEE Eng.Med. Biol. Soc. (IEEE/ EMBC’05), pp. 1-4, 2005 Sách, tạp chí
Tiêu đề: Cancellation of respiratory artifacts in impedance cardiography”, "Proc. 27th Annual Int. Conf. of the IEEE Eng. "Med. Biol. Soc. (IEEE/ EMBC’05)
[14] X. Hu, X. Chen, R. Ren, “Noninvasive Ambulatory Hemodynamic Monitoring Based on Electrocardiogram and Impedance Cardiography”, Journal of Fiber Bioengineering and Informatics 8:4, pp. 741-749, 2015 Sách, tạp chí
Tiêu đề: Noninvasive Ambulatory Hemodynamic Monitoring Based on Electrocardiogram and Impedance Cardiography”, "Journal of Fiber Bioengineering and Informatics 8:4
[15] V. D. Hai, P. D. Hung, C. Q. Dan, D. T. Nhung, “Specifying respiratory noises in the ICG signal to measure hemodynamic parameters”, 3 th International Conference on Multimedia Analysis and Pattern Recognition (MAPR), 2020 Sách, tạp chí
Tiêu đề: Specifying respiratory noises in the ICG signal to measure hemodynamic parameters”, "3"th" International Conference on Multimedia Analysis and Pattern Recognition (MAPR)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN