Đồ án Xây dựng chương trình mô phỏng quá trình điều khiển và hiển thị các thông số sinh học

KẾT LUẬN CHUNG 1. Kết quả đạt được của đồ án Với nội dung đồ án “Xây dựng chương trình mô phỏng quá trình điều khiển và hiển thị các thông số sinh học” cùng với việc tìm hiểu tại bệnh viện Hữu Nghị, công ty Nipon tôi đã tìm hiểu và nghiên cứu và đạt được một số vấn đề cơ bản sau:  Tìm hiểu và đánh giá tầm quan trọng của các thiết bị theo dõi bệnh nhân hiện nay.  Nghiên cứu các phương pháp đo các thông số sinh học của thiết bị theo dõi.  Xây dựng chương trình mô phỏng tín hiệu và hiển thị các thông số sinh học dùng trong thiết bị theo dõi. Chương trình cho phép phân tích và nghiên cứu các dạng sóng ECG bình thường và dị thường, và có thể mô phỏng bất kì một dạng sóng ECG nào đưa ra sử dụng trong chương trình mô phỏng. 2. Hướng phát triển Chương trình mô phỏng tín hiệu sinh học ở đây mới chỉ thực hiện mô phỏng được một số tín hiệu điển hình như tín hiệu điện tim ECG, nhịp thở, SpO2 và một vài số liệu liên quan. Từ chương trình này có thể mô phỏng thêm đầy đủ các thông số đo và các dạng tín hiệu tương ứng của chúng như: các dạng sóng loạn nhịp nhằm biết được các triệu chứng loạn tim, tín hiệu CO2, các thông số về nhiệt độ, cung lương tim CO, huyết áp can thiệp IBP Với tín hiệu mô phỏng gần giống với tín hiệu chuẩn sinh học, nên chương trình có thể được ứng dụng trong giảng dạy các môn chuyên ngành, hay sử dụng để so sánh với các tín hiệu của thiết bị theo dõi nhằm phát hiện sự bất thường trong quá trình theo dõi bệnh nhân. 3. Kết luận Sau một thời gian nhận và thực hiện đồ án, qua quá trình nghiên cứu, tìm hiểu và tham khảo tài liệu trong sách và trên mạng cùng với sự chỉ bảo, định hướng của các thầy cô hướng dẫn trong bộ môn điện tử Y sinh đặc biệt là thầy Vũ Duy Hải, với sự giúp đỡ của Thầy Hiền trưởng phòng kĩ thuật bệnh viên Hữu Nghị, chú Phạm Quốc Trọng giám đốc kĩ thuật công ty Nipon, tôi đã hoàn thành đồ án theo đúng tiến độ đặt ra. Do đồ án là một trong những vấn đề lớn và chương trình mô phỏng còn mang tính thực tế không cao do tính chất ứng dụng của nó còn ít. Bản thân là một cá nhân trong quá trình làm không tránh khỏi các kiến chủ quan của mình mà các vấn đề đưa ra còn có thể gặp nhiều sai sót. Vì vậy tôi rất mong được ý kiến phản hồi của các thầy cô trong bộ môn Điện tử Y sinh và các bạn trong lớp điện tử y sinh K47. Cuối cùng xin chân thành cảm ơn.

doc126 trang | Chia sẻ: oanh_nt | Lượt xem: 1214 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Đồ án Xây dựng chương trình mô phỏng quá trình điều khiển và hiển thị các thông số sinh học, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
, Q, R, S và T, độ rộng của mỗi sóng và các khoảng thời gian như các khoảng P-R, S-T, và Q-T. Hình 3.1: Tín hiệu ECG điển hình Các đặc trưng chính của chương trình mô phỏng này: Bất kì giá trị nào của nhịp tim có thể được thiết lập Bất kì giá trị nào của các khoảng thời gian giữa các đỉnh ( ví dụ khoảng PR) có thể được thiết lập. Bất kì giá trị nào của biên độ có thể được thiết lập cho mỗi đỉnh Sự rung cơ có thể được mô phỏng Nhiễu do các điện cực có thể được mô phỏng Nhịp mạch của dạng sóng ECG đặc biệt có thể được trình bày trong một đồ thị tách riêng Nguyên lý Chuỗi Fourier Bất kì các hàm chu kì mà thỏa mãn điều kiện của Dirichlet’s có thể được mô tả như một chuỗi lớn của sin và cos theo tần số mà xuất hiện như một bội số chủ yếu của tần số. f (x) = (ao/2) + Σ an cos (nπx / l) + Σ bn sin (nπx / l), n=1 n=1 ao = (1/ l ) ∫ f (x) dx ,T = 2l --à (1) T an = (1/ l ) ∫ f (x) cos (nπx / l) dx , n = 1,2,3…. --à (2) T bn = (1/ l ) ∫ f (x) sin (nπx / l) dx , n = 1,2,3…. --à (3) T Tín hiệu ECG là chu kì với tần số cơ bản được xác định bởi nhịp tim. Nó cũng thỏa mãn các điều kiện của Dirichlet’s: Đơn trị và có hạn trong khoảng thời gian được định sẵn. Có thể tích phân hoàn toàn Có trị số cực đại và cực tiểu giữa các khoảng thời gian có hạn Có trị số không liên tục Do đó chuỗi Fourier có thể được sử dụng để mô tả tín hiệu ECG. Nếu quan sát trong hình 1, ta có thể thấy chu kì đơn của một tín hiệu ECG là sự trộn lẫn giữa dạng sóng tam giác và dạng sóng hình sin. Mỗi đặc điểm quan trọng của tín hiệu ECG có thể được mô tả bằng cách dịch và vẽ theo một trong những dạng sóng được thấy trong hình. Các thành phần QRS, Q, S của tín hiệu điện tim có thể được mô tả bằng dạng sóng tam giác. Các thành phần P, T, U có thể được mô tả bằng dạng sóng sin. Chúng ta có thể tạo mỗi thành phần này, các thành phần đó có thể được thêm vào cuối để có được tín hiệu ECG. Chu kì thành phần QRS của tín hiệu ECG Hình 3.2: Tạo dạng sóng QRS Phương trình tổng quát dạng sóng QRS Từ phương trình (1) có: f(x) = (–bax/l) + a 0 < x < ( l/b ) = ( bax/l) + a (– l/b)< x < 0 ao = (1/ l ) ∫ f (x) dx T = (a/b) * (2 – b ) an = (1/ l ) ∫ f (x) cos (nπx / l) dx T = ( 2ba / (n2π2 )) * ( 1 – cos (nπ/b)) bn = (1/ l ) ∫ f (x) sin (nπx / l) dx T = 0 ( Bởi vì dạng sóng là hàm chẵn) ∞ f (x) = (ao/2) + Σ an cos (nπx / l) n=1 Thành phần chu kì sóng P của tín hiệu ECG Hình 3.3: Tạo dạng sóng P Phương trình tổng quát dạng sóng P f(x) = cos ((πbx) /(2l)) (–l/b)< x < (l/b) ao = (1/ l ) ∫ cos ((πbx) / (2l)) dx T = (a/(2b))(2-b) an = (1/ l ) ∫ cos ((πbx) / (2l)) cos (nπx / l) dx T = (((2ba)/(i2π2)) (1-cos((nπ)/b))) cos((nπx)/l) bn = (1/ l ) ∫ cos ((πbx) / (2l)) sin (nπx / l) dx T = 0 ( bởi vì dạng sóng là hàm chẵn) ∞ f (x) = (ao/2) + Σ an cos (nπx / l) n=1 Sóng P: Sóng P là thành phần tín hiệu điện gây bởi sự khử cực ở tâm nhĩ. Cả tâm nhĩ trái và phải đều tác động đồng thời.Mối liên hệ nó với QRS thì ra toàn bộ tim. Sự thiếu hoặc không đều sóng đỉnh P chỉ ra chứng loạn nhịp tim. Hình khối của sóng P được dùng để phân tích các vấn đề thuộc tâm nhĩ. Dạng sóng P đầu ra được tính theo công thức rút ra từ phương trình tổng quát dạng sóng P: harm1=(((sin((pi/(2*b))*(b-(2*i))))/(b-(2*i))+(sin((pi/(2*b))*(b+(2*i))))/(b+(2*i)))*(2/pi))*cos((i*pi*x)/l); Trong đó: a: biên độ sóng P; b: độ rộng sóng P; l: tần số nhịp tim; x: thời gian ( với các thông số này có thể thay đổi được) Sóng Q Khi hiển thị sẽ tái hiện lại các dòng nhỏ ngang ở bên trái và bên phải tương ứng với các hoạt động của nguồn khi di chuyển trong các vách ngăn của tâm thất. Sóng Q rộng và sâu không có vách ngăn gốc nhưng lại chỉ ra chứng nhồi máu phụ thuốc lớn vào độ sâu cơ tim. Dạng sóng đầu ra của sóng Q được tính theo công thức: harm5=(((2*b*a)/(i*i*pi*pi))*(1-cos((i*pi)/b)))*cos((i*pi*x)/l); Trong đó: a: biên độ sóng Q; b: độ rộng của sóng Q; l: tần số nhịp tim; x: thời gian ( với các thông số này có thể thay đổi được) Sóng QRS: Sóng QRS tương ứng với dòng gây bởi trạng thái co của tâm thất trái và tâm thất phải, sóng này rõ ràng cụ thể hơn trạng thái gây bởi tâm nhĩ và liên quan nhiều đến các sợi cơ, cho nên kết quả dẫn đến sự đổi dạng rất lớn của tín hiệu ECG tại đây. Khoảng thời gian tồn tại của QRS thông thường nhỏ hơn hoặc bằng 0.1s. Sự bất thường trong QRS chỉ ra các bệnh lý về chứng đập nhanh, trương tâm thất hoặc sự bất thường trong tâm thất. QRS thường nhỏ khi triệu chứng về viêm màng ngoài tim hoặc sự nở ra của màng ngoài tim. Đầu ra dạng sóng QRS được tính theo công thức: harm=(((2*b*a)/(i*i*pi*pi))*(1-cos((i*pi)/b)))*cos((i*pi*x)/l); Trong đó: a: biên độ sóng QRS; b: độ rộng; l: tần số nhịp tim; x: thời gian ( các thông số này có thể thay đổi được) Sóng S: Chỉ ra khoảng hoạt động của nguồn theo các cơ tim thuộc tâm thất. Dạng sóng đầu ra của sóng S được tính theo công thức: harm3=(((2*b*a)/(i*i*pi*pi))*(1-cos((i*pi)/b)))*cos((i*pi*x)/l); Trong đó: a: biên độ sóng S; b: độ rộng ; l: tần số nhịp tim; x: thời gian ( với các thông số có thể thay đổi được). Sóng T: Sóng T thể hiện sự tái phân cực của tâm thất. Cuối QRS thường không rõ ràng khi chỉ ra sự tái phân cực của tâm nhĩ cho nên ít trông thấy. Điện tích, các nhân của cơ tim giống như các đường cong. Một xung nhỏ được đặt vào chúng sẽ phân cực tái hợp, thiết lập nên đường cong lên nhanh chóng lại sự tái phân cực. Đầu ra dạng sóng T được tính theo công thức: harm2=(((sin((pi/(2*b))*(b-(2*i))))/(b-(2*i))+(sin((pi/(2*b))*(b+(2*i))))/(b+(2*i)))*(2/pi))*cos((i*pi*x)/l); Trong đó: a: biên độ sóng ; b: độ rộng sóng; x: thời gian; l: tần số nhịp tim( với các thông số này có thể thay đổi được). Sóng U: Sóng U không bao giờ quan sát được vì nó quá nhỏ và thường theo sóng T để xác định. Nó thường hiển thị sự tái khử cực của các cơ tim hay là các ống Purkinje. Sóng U nhô lên thường được xem trong hypokalemia, 3 chứng loạn nhịp giống như hội chứng dài QT bẩm sinh và trong xác định sự xuất huyết máu. Vòng lõm sóng U chỉ ra sự thiếu máu cục bộ của tim hay dung tích trái tâm thất bị quá tải. Đầu ra dạng sóng U được tính theo công thức: harm4=(((sin((pi/(2*b))*(b-(2*i))))/(b-(2*i))+(sin((pi/(2*b))*(b+(2*i))))/(b+(2*i)))*(2/pi))*cos((i*pi*x)/l); Trong đó: a: biên độ sóng; b: độ rộng sóng; x: thời gian; l: tần số nhịp tim ( trung bình 80 nhịp/phút) ( với các thông số này có thể thay đổi được). Nhịp tim(HR) Được xác định là số lần tim đập trong một phút, được đo bằng cách lấy trung bình hay khoảng thời gian giữa hai đỉnh R liền nhau. Trung bình ở một người bình thường có nhịp tim khoảng 80 – 83 nhịp/phút. 3.2. Tín hiệu SpO2 và % SpO2 Độ bão hòa ôxi trong máu được tính là tỉ số giữa lượng oxi tới hạn với tổng khả năng có thể chứa oxi của máu động mạch. Tín hiệu SpO2 được tổng hợp từ 2 tín hiệu thu được từ sự hấp thụ của 2 ánh sáng đỏ và ánh sáng hồng ngoại. Hình 3.2 mô tả dạng sóng của SpO2 Hình 3.4 :Dạng sóng SpO2 Dựa theo phương trình dạng sóng u và t có sự thay đổi về biên độ và độ rộng ta có dạng sóng SpO2 được tổng hợp theo 2 dạng sóng u và t và ta có phương trình dạng sóng: Song_spo2=(((sin((pi/(2*b))*(b-(2*i))))/(b-(2*i))+(sin((pi/(2*b))*(b+(2*i))))/(b+(2*i)))*(2/pi))*cos((i*pi*x)/l); Trong đó: a: biên độ sóng ; b: độ rộng sóng ; l: tần số ( được tính theo cùng với tần số của nhịp tim – trung bình 80 nhịp/phút); x: thời gian của sóng % SpO2 Đối với một người bình thường thì nồng độ oxi bão hòa trong máu thường nằm trong khoảng từ 97 – 99%. 3.3. Tín hiệu nhịp thở và nhịp thở RESP Tín hiệu nhịp thở được lấy từ việc xác định CO2, tín hiệu được lấy từ bất kỳ đầu từ một đầu dò được đem khuếch đại và trong khoảng thời gian này thực hiện đo giữa hai xung kế tiếp nhau. Dải đo thường từ 0 đến 50 nhịp/ phút. Tín hiệu nhịp thở theo phương pháp trở kháng Trong phương pháp trở kháng, nhịp thở được đo và theo dõi bằng cách gắn các điện cực ECG vào bệnh nhân và kết nối chúng với đầu nối ECG/ RESP trên thiết bị theo dõi. Phương pháp này đo sự thay đổi trở kháng giữa R và F ( RA và LL) hoặc R và L (RA và LA) của các điện cực ECG. Biên độ của dạng sóng nhịp thở đo theo phương pháp này khác nhau theo vị trí các điện cực. Hình 3.5: Vị trí đặt điện cực và biên độ dạng sóng của chúng Trong hình là ví dụ về vị trí đặt các điện cực và biên độ dạng sóng của chúng. Đo tín hiệu nhịp thở bị ảnh hưởng bởi sự dịch chuyển ngực và bụng. Biên độ của dạng sóng thay đổi theo sự thay đổi không đáng kể của vị trí điện cực F(LL). Vì vậy có sự khác nhau đáng kể giữa các bệnh nhân khác nhau. Đo tín hiệu nhịp thở bị ảnh hưởng bởi sự dịch chuyển của ngực. Phát hiện nhịp thở ở ngực. Có sự khác nhau rất lớn về biên độ giữa các bệnh nhân khác nhau. Biên độ tín hiệu nhịp thở rất lớn, do đó phát hiện tốc độ dễ. Ví trí điện cực tương tự như đạo trình II của điện tim. Tín hiệu nhịp thở theo phương pháp điện trở nhiệt Trong phương pháp điện trở nhiệt, nhịp thở được đo và theo dõi bằng cách gắn điện trở gần ổng quản của bệnh nhân và kết nối với mạch thở đồng thời kết nối với đầu đa kết nối trên thiết bị theo dõi. Phương pháp này đo và so sánh nhiệt độ thay đổi do sự hít vào và thở ra sử dụng điện trở nhiệt. Tăng nhiệt độ của không khí hít vào trong khi theo dõi trong phương pháp dùng điện trở nhiệt là nguyên nhân làm giảm nhiệt độ, gây ra sự khác nhau giữa quá trình hít vào và thở ra, và biên độ của dạng sóng nhịp thở nhỏ. Khi nhiệt độ hít vào tăng cao hơn nhiệt độ thở ra, thì pha của quá trình thở ra và hít vào có thể được duy trì. Hình 3.4 mô tả dạng sóng và các khoảng thời gian thay đổi nồng độ CO2. Hình 3.6: Dạng sóng nhịp thở Dạng sóng nhịp thở cho ta biết các giá trị: - Cung cấp giá trị tại điểm bão hòa oxi EtCO2 - Đánh giá trực quan về tình trạng thông khí của bệnh nhân - Xác minh về sự sắp đặt ống ET thích hợp - Đánh giá về máy thông khí/ tình trạng của mạch thở Thuật toán Dạng sóng nhịp thở được lấy theo dạng gần đúng của hàm sin(x). Nên đồ thị dạng sóng nhịp thở được tính theo công thức: Y= sin(x) +1 Với tần số nhịp thở là 20, 30, 40 3.4. Thông số NIBP Các thông số huyết áp không can thiệp bao gồm: huyết áp tâm trương, huyết áp tâm thu và huyết áp trung bình được tính tương đối theo công thức: Với một người bình thường: - Huyết áp tâm thu : 75 – 77mHg - Huyết áp tâm trương: 115-117mHg - Trung bình: 89-91mHg Và các tùy chọn về bệnh nhân, chu kì đo và áp suất của bơm 3.5. Kết quả thực hiện 3.5.1. Mục đích của sự mô phỏng Ở đây sẽ tạo ra một chương trình mô phỏng tín hiệu điện tim mà thực hiện mô phỏng các tín hiệu ECG trên bề mặt cơ thể từ các nguồn rối loạn tim, tín hiệu về độ bão hòa oxi trong máu SpO2, tín hiệu nhịp thở, và các thông số đo của huyết áp không can thiệp. Với tín hiệu điện tim có thể thay đổi các nguồn bằng cách thay đổi các đặc tính của điện thế hoạt động khu vực gần tim và ngay sau đó tạo ra một thiết lập mới nhịp tim và dữ liệu bề mặt cơ thể. Muc đích của việc sử dụng chương trình mô phỏng ECG là để hiểu mối quan hệ giữa các thông số và các đặc trưng của mô tim và kết quả đo được các đặc trưng của biểu đồ dòng điện và biểu đồ điện tim. Chương trình này mô tả đầy đủ mô phỏng phát triển về sự kích hoạt thông qua nhịp tim con người và kết quả điện thế bề mặt (trong và ngoài) tim và cơ thể, đồng thời mô phỏng tín hiệu về nồng độ bão hòa oxi trong máu SpO2 kết hợp với tín hiệu điện tim có thể cho ta phát hiện ra một số loại bệnh nguy hiểm. 3.5.2. Cấu trúc chương trình Chương trình mô phỏng tín hiệu được thực hiện bằng phần mềm Visual Basic 6.0, với dạng sóng dựa trên mô phỏng Matlab. Chương trình mô phỏng tín hiệu có chức năng mô phỏng các tín hiệu điện tim ECG, tín hiệu nhịp thở, tín hiệu về nồng độ oxi bão hòa trong máu SpO2, và các thông số đo nhịp tim, nhịp thở, nhịp mạch, % SpO2, huyết áp không can thiệp NIBP ( tâm trương, tâm thu, trung bình). File Imitate about Exit ECG SpO2 NIBP Hình 3.7: Cấu trúc của chương trình Chạy file MP.exe xuất hiện giao diện chính của chương trình như hình 3.9. Hình 3.8. Giao diện chính của chương trình mô phỏng Kích Menu File xuất hiện Menu con Exit để kết thúc chương trình như trong hình 3.10. Hình 3.9. Menu con Exit kết thúc chương trình Kích Menu Iitimate xuất hiện menu con ECG, SpO2, NIBP, là các form con mô phỏng các tín hiệu ECG, SpO2 và NIBP như trong hình 3.11. Hình 3.10. các menu con mô phỏng tín hiệu Kích menu con Iimitate/ECG xuất hiện chương trình mô phỏng tín hiệu ECG như trong hình 3.12. Hình 3.11. Giao diện chương trình mô phỏng ECG Trong form ECG này gồm có: Tín hiệu điện tim ECG mô phỏng 2 đạo trình của điện tim là đạo trình II và đạo trình V2 như trong hình 3.13. Hình 3.12. Tín hiệu mô phỏng đạo trình II (a) và V (b) Với tốc độ có thể thay đổi từ 10 đến 50mm/s, biên độ tăng theo từng mức từ 1 đến 5. Ô Pulse/min hiển thị ngẫu nhiên nhịp tim với các giá trị được gán trước nằm trong khoảng từ 80 đến 83 nhịp/phút. Nút Channel là để tùy chọn kênh đo ở đây có 12 kênh là: I, II, III, V1 đến V6 và aVL, aVR, aVF. Tín hiệu nhịp thở được mô phỏng gần đúng theo dạng sóng sin như trong hình 3.14. Hình 3.13. Dạng sóng mô phỏng tín hiệu nhịp thở Ô Resp/min là tần số nhịp thở hay là số lần thở trong một phút ở đây có tùy chọn tăng hoặc giảm trong khoảng từ 20 đến 40 lần/phút. Nút Close đóng cửa sổ ECG lại, trở về với giao diện chính của chương trình. Kích menu con Iimitate/SpO2 xuất hiện form SpO2 mô phỏng tín hiệu SpO2 như trong hình 3.15. Hình 3.14. Form SpO2 Trong form SpO2 này gồm có: Ô Pulse/min là giá trị về thông số nhịp mạch xuất hiện ngẫu nhiên với các giá trị được định sẵn trong khoảng từ 79 đến 81 nhịp/phút Ô SpO2 % là nồng độ oxi bão hòa trong máu được tính theo % xuất hiện ngẫu nhiên với các giá trị được định sẵn nằm trong khoảng từ 97 đến 99. Cuối cùng là dạng sóng của SpO2 như được thấy trong hình 3.14. Kích menu con Iimitate/NIBP xuất hiện form NIBP với các thông số đo tương ứng như trong hình 3.16. Hình 3.15. Form NIBP Trong form NIBP này gồm có: Ô Sys [mHg] là giá trị áp suất tâm thu. Ô Dia [mHg] là giá trị áp suất tâm trương. Ô Map[mHg] là giá trị áp suất trung bình, giá trị được tính theo công thức Ô Pulse[bpm] là giá trị nhịp tim trong một phút. Kích nút Read Stat là nút reset lại có 2 tùy chọn là Measure và Idle Kích nút START là nút bắt đầu đo thì ở nút Read Stat ở trạng thái đo là Measure còn nếu không thì nút này ở trạng thái Idle. Khi kích nút này thì ở áp suất bơm nút Pump to sẽ có giá trị tăng từ 0 đến 140mHg đối với trẻ em (Neonate) hoặc tăng từ 0 đến 170mHg đối với người lớn ( Adult), sau đó lại giảm liên tục về 20mHg với Neonate hoặc giảm về 30mHg với Adult thì các giá trị ở các ô Sys, Dia, Map, Pulse sẽ hiển thị các giá trị đo được gán sẵn. Kích nút Set Cycle là nút thay đổi các chu kì đo trong khoảng thời gian cho phép, ở đây có các tùy chọn là : Manual, 1min, 2min, 3min, 4min, 5min, 10min, 15min, 30min. Các tùy chọn này chỉ thực hiện thay đổi được khi nút Read Stat ở trạng thái Idle không phải trạng thái đo. Kích nút Neo/adult là lựa chọn loại bệnh nhân là người lớn (Adult) hay trẻ em (Neonate). Tùy chọn này cũng chỉ thực hiện thay đổi khi nút Read Stat ở trạng thái Idle. Kích nút Pump to là nút áp suất của ống bơm tính theo mHg, có các tùy chọn nằm trong khoảng từ 100 đến 180mHg, có thể thay đổi khi mức ngưỡng đối với trẻ em là 140mHg, Adult là 170mHg. Các tùy chọn này cũng chỉ thay đổi được khi nút Read Stat ở trạng thái Idle. Kích nút Close là nút đóng form NIBP lại và trở về với giao diện chính của chương trình. Kích menu Help xuất hiện menu con About là thông tin người thực hiện và giảng viên hướng dẫn. Như trong hình 3.17 Hình 3.16. form about 3.6. Kết luận chương 3 Trong chương này mục đích đã giới thiệu về thông tin các tín hiệu đã được mô phỏng và ứng dụng trong thực tế nhằm phát hiện các loại bệnh nguy hiểm thường gặp. Chương trình mô phỏng tín hiệu điện tim, nhịp thở, SpO2, NIBP bằng phần mềm lập trình VB 6.0. Chương trình mô phỏng có chức năng hiển thị dạng sóng các đạo trình của điện tim và số liệu về nhịp tim, dạng sóng nhịp thở và tần số nhịp thở. Số liệu và dạng sóng SpO2, các số liệu về huyết áp không can thiệp. Qua đó có thể cho thấy một cách tổng quan về một số thông số quan trọng trong thiết bị theo dõi bệnh nhân. Ví dụ việc kết hợp theo dõi đồng thời tín hiệu điện tim và tín hiệu SpO2 để phát hiện sự thay đổi đột ngột trong huyết áp (PWTT – Pulse Wave Transit Time, khoảng thời gian truyền xung) Hình 3.17: Mối quan hệ PWTT với tín hiệu ECG và SpO2 PWTT ( Pulse Wave Transit Time) là một thông số mà xác định sự thay đổi đột ngột trong huyết áp. PWTT là khoảng giữa sóng R của tín hiệu ECG và lúc bắt đầu của sóng xung SpO2. Trong nhiều trường hợp, PWTT thay đổi theo sự thay đổi trong tuần hoàn máu. Sự thay đổi PWTT này có thể được dùng để đo NIBP. KẾT LUẬN CHUNG Kết quả đạt được của đồ án Với nội dung đồ án “Xây dựng chương trình mô phỏng quá trình điều khiển và hiển thị các thông số sinh học” cùng với việc tìm hiểu tại bệnh viện Hữu Nghị, công ty Nipon tôi đã tìm hiểu và nghiên cứu và đạt được một số vấn đề cơ bản sau: Tìm hiểu và đánh giá tầm quan trọng của các thiết bị theo dõi bệnh nhân hiện nay. Nghiên cứu các phương pháp đo các thông số sinh học của thiết bị theo dõi. Xây dựng chương trình mô phỏng tín hiệu và hiển thị các thông số sinh học dùng trong thiết bị theo dõi. Chương trình cho phép phân tích và nghiên cứu các dạng sóng ECG bình thường và dị thường, và có thể mô phỏng bất kì một dạng sóng ECG nào đưa ra sử dụng trong chương trình mô phỏng. Hướng phát triển Chương trình mô phỏng tín hiệu sinh học ở đây mới chỉ thực hiện mô phỏng được một số tín hiệu điển hình như tín hiệu điện tim ECG, nhịp thở, SpO2 và một vài số liệu liên quan. Từ chương trình này có thể mô phỏng thêm đầy đủ các thông số đo và các dạng tín hiệu tương ứng của chúng như: các dạng sóng loạn nhịp nhằm biết được các triệu chứng loạn tim, tín hiệu CO2, các thông số về nhiệt độ, cung lương tim CO, huyết áp can thiệp IBP… Với tín hiệu mô phỏng gần giống với tín hiệu chuẩn sinh học, nên chương trình có thể được ứng dụng trong giảng dạy các môn chuyên ngành, hay sử dụng để so sánh với các tín hiệu của thiết bị theo dõi nhằm phát hiện sự bất thường trong quá trình theo dõi bệnh nhân. Kết luận Sau một thời gian nhận và thực hiện đồ án, qua quá trình nghiên cứu, tìm hiểu và tham khảo tài liệu trong sách và trên mạng cùng với sự chỉ bảo, định hướng của các thầy cô hướng dẫn trong bộ môn điện tử Y sinh đặc biệt là thầy Vũ Duy Hải, với sự giúp đỡ của Thầy Hiền trưởng phòng kĩ thuật bệnh viên Hữu Nghị, chú Phạm Quốc Trọng giám đốc kĩ thuật công ty Nipon, tôi đã hoàn thành đồ án theo đúng tiến độ đặt ra. Do đồ án là một trong những vấn đề lớn và chương trình mô phỏng còn mang tính thực tế không cao do tính chất ứng dụng của nó còn ít. Bản thân là một cá nhân trong quá trình làm không tránh khỏi các kiến chủ quan của mình mà các vấn đề đưa ra còn có thể gặp nhiều sai sót. Vì vậy tôi rất mong được ý kiến phản hồi của các thầy cô trong bộ môn Điện tử Y sinh và các bạn trong lớp điện tử y sinh K47. Cuối cùng xin chân thành cảm ơn. Sinh viên Nguyễn Thị Huyền TÀI LIỆU THAM KHẢO [1] Nguyễn Đức Thuận, Nguyễn Thái Hà, Vũ Duy Hải, Đinh Thị Nhung, Phạm Đức Hiền, Bùi Xuân Vinh, Bài giảng thiết bị điện từ y tế - tập 1: thiết bị chẩn đoán chức năng và thiết bị chăm sóc đặc biệt, Hà Nội 2004 [2] Võ Hiếu Nghĩa, Các chương trình mẫu Visual Basic 6.0, Nhà xuất bản Thống kê [3] Nguyễn Đức Thuận, Nguyễn Việt Dũng, Bài giảng cảm biến và đo lường Y sinh, Hà Nội 2001 [4] Nihon Kohden, Life Scope P BEDSIDE MONITOR BSM – 4100 J/K Operation Manual, .pdf [5] Nihon Kohden, Life Scope P BEDSIDE MONITOR BSM – 4100 J/K Service Manual , .pdf [6] Nihon Kohden, CENTRAL MONITOR CNS – 9701 J/K – Operation Manual, .pdf [7] Nihon Kohden, CENTRAL MONITOR CNS – 9701 J/K – Service Manual, .pdf [8] Tài liệu trên các trang Web: truy nhập từ ngày 1/3 đến 5/5/2007 - - - - - [9] Ross Flewelling, “Biomedical Engineering HandBook”, chapter 86 Noninvasive Optical Monitoring, Nellcor Incorporation, 1977. [10] Leslie A. Geddes, “Biomedical Engineering HandBook”, chapter 72, cardiac output Measurement, Purdue University. [11] Christopher M. Tenedero, Mary Anne D. Rây, and Luis G. Sison, Ph.D, Design and implementation of a single – channel ECG amplifier with DSP post-processing in Matlab, Instrumentation, Robotics, and Controls laboratory University of the Philippines, Diliman, Quezon City. [12] Spencer Kee, “Biomedical Technology and devices Handbook, section 5, Interventional Disease Treatment”, chapter 22, Anesthisia/ Monitoring Devices, M.D Anderson Cancer Center. [13] MATLAB The Language of Technical Computing, The Mathworks. [14] GS. Trần Đỗ Thịnh, BS. Trần Văn Đồng, Hướng dẫn đọc điện tim, Nhà xuất bản y học, Hà Nội, 1998. PHỤ LỤC Mã nguồn chương trình mô phỏng tín hiệu ‘ Form MO_PHONG Private Sub mnuFile_About_Click() Form1.Show End Sub Private Sub mnuFile_Exit_Click() End End Sub Private Sub mnuIimitate_ECG_Click() frmECG.Show frmECG.Width = 8055 frmECG.Height = 5745 End Sub Private Sub mnuIimitate_NIBD_Click() frmNIBP.Show frmNIBP.Width = 7830 frmNIBP.Height = 5025 End Sub Private Sub mnuIimitate_SpO2_Click() frmSpO2.Show frmSpO2.Width = 7170 frmSpO2.Height = 5130 End Sub ‘ Form ECG Const pi = 3.14159265 Const l = 1 Const f = 0.03 'Dieu tan so cua song EKG Const f_v = 0.01 'Dieu tan so cua song EKG_V Const ds = 1800 'Dieu chinh vi tri cua song EKG Const ds_v = 800 'Dieu chinh vi tri cua song EKG_V Const ds_nt = 1000 'Dieu chinh vi tri cua song nhip tho Const dr_nt = 600 'Dieu chinh bien do cua song nhip tho Dim val_speed As Integer Dim dr As Integer 'Dieu chinh bien do cua song EKG Dim f_nt As Single 'Dieu tan so cua song nhip tho Dim cal_td As Integer, cal_td_v As Integer, cal_td_nt As Integer Dim xp_v As Integer, xq_v As Integer, xqrs_v As Integer, xs_v As Integer, xt_v As Integer, xu_v As Integer Dim xp As Integer, xq As Integer, xqrs As Integer, xs As Integer, xt As Integer, xu As Integer Private Function song_p(ByVal x As Single) As Single Dim a As Single, b As Single, p1 As Single, p2 As Single, harm1 As Single Dim i As Integer, n As Integer a = 0.25 x = x + (1 / 1.8) b = 3 n = 100 p1 = 1 / l p2 = 0 For i = 1 To n harm1 = (((Sin((pi / (2 * b)) * (b - (2 * i)))) / (b - (2 * i)) + (Sin((pi / (2 * b)) * (b + (2 * i)))) / (b + (2 * i))) * (2 / pi)) * Cos((i * pi * x) / l) p2 = p2 + harm1 Next song_p = a * (p1 + p2) End Function Private Function song_p_v(ByVal x As Single) As Single Dim a As Single, b As Single, p1 As Single, p2 As Single, harm1 As Single Dim i As Integer, n As Integer a = 0.14 x = x + 0.16 b = (2 * l) / 0.09 n = 100 p1 = 1 / l p2 = 0 For i = 1 To n harm1 = (((Sin((pi / (2 * b)) * (b - (2 * i)))) / (b - (2 * i)) + (Sin((pi / (2 * b)) * (b + (2 * i)))) / (b + (2 * i))) * (2 / pi)) * Cos((i * pi * x) / l) p2 = p2 + harm1 Next song_p_v = a * (p1 + p2) End Function Private Function song_q(ByVal x As Single) As Single Dim a As Single, b As Single, q1 As Single, q2 As Single, harm5 As Single Dim i As Integer, n As Integer x = x + l / 6 a = 0.025 b = 15 n = 100 q1 = (a / (2 * b)) * (2 - b) q2 = 0 For i = 1 To n harm5 = (((2 * b * a) / (i * i * pi * pi)) * (1 - Cos((i * pi) / b))) * Cos((i * pi * x) / l) q2 = q2 + harm5 Next song_q = -1 * (q1 + q2) End Function Private Function song_qrs(ByVal x As Single) As Single Dim a As Single, b As Single, qrs1 As Single, qrs2 As Single, harm As Single Dim i As Integer, n As Integer a = 1 b = 5 n = 100 qrs1 = (a / (2 * b)) * (2 - b) qrs2 = 0 For i = 1 To n harm = (((2 * b * a) / (i * i * pi * pi)) * (1 - Cos((i * pi) / b))) * Cos((i * pi * x) / l) qrs2 = qrs2 + harm Next song_qrs = qrs1 + qrs2 End Function Private Function song_qrs_v(ByVal x As Single) As Single Dim a As Single, b As Single, qrs1 As Single, qrs2 As Single, harm As Single Dim i As Integer, n As Integer a = 0.3 b = (2 * l) / 0.066 n = 100 qrs1 = (a / (2 * b)) * (2 - b) qrs2 = 0 For i = 1 To n harm = (((2 * b * a) / (i * i * pi * pi)) * (1 - Cos((i * pi) / b))) * Cos((i * pi * x) / l) qrs2 = qrs2 + harm Next song_qrs_v = qrs1 + qrs2 End Function Private Function song_s(ByVal x As Single) As Single Dim a As Single, b As Single, s1 As Single, s2 As Single, harm3 As Single Dim i As Integer, n As Integer x = x - l / 6 a = 0.25 b = 15 n = 100 s1 = (a / (2 * b)) * (2 - b) s2 = 0 For i = 1 To n harm3 = (((2 * b * a) / (i * i * pi * pi)) * (1 - Cos((i * pi) / b))) * Cos((i * pi * x) / l) s2 = s2 + harm3 Next song_s = -1 * (s1 + s2) End Function Private Function song_s_v(ByVal x As Single) As Single Dim a As Single, b As Single, s1 As Single, s2 As Single, harm3 As Single Dim i As Integer, n As Integer x = x - 0.09 a = 0.75 b = (2 * l) / 0.11 n = 100 s1 = (a / (2 * b)) * (2 - b) s2 = 0 For i = 1 To n harm3 = (((2 * b * a) / (i * i * pi * pi)) * (1 - Cos((i * pi) / b))) * Cos((i * pi * x) / l) s2 = s2 + harm3 Next song_s_v = -1 * (s1 + s2) End Function Private Function song_t(ByVal x As Single) As Single Dim a As Single, b As Single, t1 As Single, t2 As Single, harm2 As Single Dim i As Integer, n As Integer a = 0.35 x = x - (1 / 1.8) b = 7 n = 20 t1 = 1 / l t2 = 0 For i = 1 To n harm2 = (((Sin((pi / (2 * b)) * (b - (2 * i)))) / (b - (2 * i)) + (Sin((pi / (2 * b)) * (b + (2 * i)))) / (b + (2 * i))) * (2 / pi)) * Cos((i * pi * x) / l) t2 = t2 + harm2 Next song_t = a * (t1 + t2) End Function Private Function song_t_v(ByVal x As Single) As Single Dim a As Single, b As Single, t1 As Single, t2 As Single, harm2 As Single Dim i As Integer, n As Integer a = 0.2 x = x - 0.2 - 0.045 b = (2 * l) / 0.142 n = 100 t1 = 1 / l t2 = 0 For i = 1 To n harm2 = (((Sin((pi / (2 * b)) * (b - (2 * i)))) / (b - (2 * i)) + (Sin((pi / (2 * b)) * (b + (2 * i)))) / (b + (2 * i))) * (2 / pi)) * Cos((i * pi * x) / l) t2 = t2 + harm2 Next song_t_v = a * (t1 + t2) End Function Private Function song_u(ByVal x As Single) As Single Dim a As Single, b As Single, u1 As Single, u2 As Single, harm4 As Single Dim i As Integer, n As Integer a = 0.03 x = x - (1 / 1.1) b = 21 n = 100 u1 = 1 / l u2 = 0 For i = 1 To n harm4 = (((Sin((pi / (2 * b)) * (b - (2 * i)))) / (b - (2 * i)) + (Sin((pi / (2 * b)) * (b + (2 * i)))) / (b + (2 * i))) * (2 / pi)) * Cos((i * pi * x) / l) u2 = u2 + harm4 Next song_u = a * (u1 + u2) End Function Private Sub draw_ekg(ByVal sample As Integer) Dim k As Single Dim x As Single Dim td As Integer Dim i As Integer Dim check As Boolean k = ds - xp td = sample check = False Picture1.ForeColor = &H80000005 Picture1.Line (10, 1)-(10, Picture1.ScaleHeight) 'Ve song EKG tu trai qua phai Do While (check = False) x = 0.01 'Ve song p While Round(x, 2) < 2 If td 0 Then Picture1.ForeColor = &H80000005 Picture1.Line (td + 20, 1)-(td + 20, Picture1.ScaleHeight) 'Xoa truoc khi ve Picture1.ForeColor = &H8000000D Picture1.Line (td, k)-(td + 10, ds - dr * song_p(Round(x, 2))) 'Ve song End If k = ds - dr * song_p(Round(x, 2)) x = Round(x, 2) + f If td + 10 > Picture1.ScaleWidth Then check = True Else td = td + 10 End If If (check = True) Then Exit Do Wend If (check = True) Then Exit Do x = 3.5 'Ve song q While Round(x, 2) < 3.92 If td 0 Then Picture1.ForeColor = &H80000005 Picture1.Line (td + 20, 1)-(td + 20, Picture1.ScaleHeight) Picture1.ForeColor = &H8000000D Picture1.Line (td, k)-(td + 10, ds - xq - dr * song_q(Round(x, 2))) End If k = ds - xq - dr * song_q(Round(x, 2)) x = Round(x, 2) + f If td + 10 > Picture1.ScaleWidth Then check = True Else td = td + 10 End If If (check = True) Then Exit Do Wend If (check = True) Then Exit Do x = 5.8 'Ve song r While Round(x, 2) < 6.22 If td 0 Then Picture1.ForeColor = &H80000005 Picture1.Line (td + 20, 1)-(td + 20, Picture1.ScaleHeight) Picture1.ForeColor = &H8000000D Picture1.Line (td, k)-(td + 10, ds - xqrs - dr * song_qrs(Round(x, 2))) End If k = ds - xqrs - dr * song_qrs(Round(x, 2)) x = Round(x, 2) + f If td + 10 > Picture1.ScaleWidth Then check = True Else td = td + 10 End If If (check = True) Then Exit Do Wend If (check = True) Then Exit Do x = 8.1 'Ve song s While Round(x, 2) < 8.27 If td 0 Then Picture1.ForeColor = &H80000005 Picture1.Line (td + 20, 1)-(td + 20, Picture1.ScaleHeight) Picture1.ForeColor = &H8000000D Picture1.Line (td, k)-(td + 10, ds - xs - dr * song_s(Round(x, 2))) End If k = ds - xs - dr * song_s(Round(x, 2)) x = Round(x, 2) + f If td + 10 > Picture1.ScaleWidth Then check = True Else td = td + 10 End If If (check = True) Then Exit Do Wend If (check = True) Then Exit Do x = 9.07 'Ve song t While Round(x, 2) < 11.2 If td 0 Then Picture1.ForeColor = &H80000005 Picture1.Line (td + 20, 1)-(td + 20, Picture1.ScaleHeight) Picture1.ForeColor = &H8000000D Picture1.Line (td, k)-(td + 10, ds - xt - dr * song_t(Round(x, 2))) End If k = ds - xt - dr * song_t(Round(x, 2)) x = Round(x, 2) + f If td + 10 > Picture1.ScaleWidth Then check = True Else td = td + 10 End If If (check = True) Then Exit Do Wend If (check = True) Then Exit Do x = 12.9 'Ve song u While Round(x, 2) < 13.1 If td 0 Then Picture1.ForeColor = &H80000005 Picture1.Line (td + 20, 1)-(td + 20, Picture1.ScaleHeight) Picture1.ForeColor = &H8000000D Picture1.Line (td, k)-(td + 10, ds - xu - dr * song_u(Round(x, 2))) End If k = ds - xu - dr * song_u(Round(x, 2)) x = Round(x, 2) + f If td + 10 > Picture1.ScaleWidth Then check = True Else td = td + 10 End If If (check = True) Then Exit Do Wend Loop k = ds - xp td = sample 'Ve song EKG tu phai qua trai Do While (td > 0) x = 13.09 'Ve song u While Round(x, 2) >= 12.9 If td Picture1.ScaleWidth Then Picture1.ForeColor = &H80000005 Picture1.Line (td - 20, 1)-(td - 20, Picture1.ScaleHeight) Picture1.ForeColor = &H8000000D Picture1.Line (td, k)-(td - 10, ds - xu - dr * song_u(Round(x, 2))) End If k = ds - xu - dr * song_u(Round(x, 2)) x = Round(x, 2) - f If td - 10 < 0 Then Exit Sub Else td = td - 10 End If Wend x = 11.19 'Ve song t While Round(x, 2) >= 9.07 If td Picture1.ScaleWidth Then Picture1.ForeColor = &H80000005 Picture1.Line (td - 20, 1)-(td - 20, Picture1.ScaleHeight) Picture1.ForeColor = &H8000000D Picture1.Line (td, k)-(td - 10, ds - xt - dr * song_t(Round(x, 2))) End If k = ds - xt - dr * song_t(Round(x, 2)) x = Round(x, 2) - f If td - 10 < 0 Then Exit Sub Else td = td - 10 End If Wend x = 8.26 'Ve song s While Round(x, 2) >= 8.1 If td Picture1.ScaleWidth Then Picture1.ForeColor = &H80000005 Picture1.Line (td - 20, 1)-(td - 20, Picture1.ScaleHeight) Picture1.ForeColor = &H8000000D Picture1.Line (td, k)-(td - 10, ds - xs - dr * song_s(Round(x, 2))) End If k = ds - xs - dr * song_s(Round(x, 2)) x = x - f If td - 10 < 0 Then Exit Sub Else td = td - 10 End If Wend x = 6.21 'Ve song r While Round(x, 2) >= 5.8 If td Picture1.ScaleWidth Then Picture1.ForeColor = &H80000005 Picture1.Line (td - 20, 1)-(td - 20, Picture1.ScaleHeight) Picture1.ForeColor = &H8000000D Picture1.Line (td, k)-(td - 10, ds - xqrs - dr * song_qrs(Round(x, 2))) End If k = ds - xqrs - dr * song_qrs(Round(x, 2)) x = Round(x, 2) - f If td - 10 < 0 Then Exit Sub Else td = td - 10 End If Wend x = 3.91 'Ve song q While Round(x, 2) >= 3.5 If td Picture1.ScaleWidth Then Picture1.ForeColor = &H80000005 Picture1.Line (td - 20, 1)-(td - 20, Picture1.ScaleHeight) Picture1.ForeColor = &H8000000D Picture1.Line (td, k)-(td - 10, ds - xq - dr * song_q(Round(x, 2))) End If k = ds - xq - dr * song_q(Round(x, 2)) x = Round(x, 2) - f If td - 10 < 0 Then Exit Sub Else td = td - 10 End If Wend x = 1.99 'Ve song p While Round(x, 2) >= 0.01 If td Picture1.ScaleWidth Then Picture1.ForeColor = &H80000005 Picture1.Line (td - 20, 1)-(td - 20, Picture1.ScaleHeight) Picture1.ForeColor = &H8000000D Picture1.Line (td, k)-(td - 10, ds - dr * song_p(Round(x, 2))) End If k = ds - dr * song_p(Round(x, 2)) x = Round(x, 2) - f If td - 10 < 0 Then Exit Sub Else td = td - 10 End If Wend Loop End Sub Private Sub draw_ekg_v(ByVal sample As Integer) Dim k As Single Dim x As Single Dim td As Integer Dim i As Integer Dim check As Boolean k = ds_v - xp_v td = sample check = False Picture1.ForeColor = &H80000005 Picture1.Line (td, 1)-(td, Picture1.ScaleHeight) Picture1.Line (td + 10, 1)-(td + 10, Picture1.ScaleHeight) 'Ve song EKG_V tu trai qua phai Do While (check = False) x = 1.65 'Ve song p While Round(x, 2) < 2 If td 0 Then Picture1.ForeColor = &H80000005 Picture1.Line (td + 20, 1)-(td + 20, Picture1.ScaleHeight) 'Xoa truoc khi ve Picture1.ForeColor = &H8000000D Picture1.Line (td, k)-(td + 10, ds_v - dr * song_p_v(Round(x, 2))) 'Ve song End If k = ds_v - dr * song_p_v(Round(x, 2)) x = Round(x, 2) + f_v If td + 10 > Picture1.ScaleWidth Then check = True Else td = td + 10 End If If (check = True) Then Exit Do Wend If (check = True) Then Exit Do x = 3.7 'Ve song q While Round(x, 2) < 3.92 If td 0 Then Picture1.ForeColor = &H80000005 Picture1.Line (td + 20, 1)-(td + 20, Picture1.ScaleHeight) Picture1.ForeColor = &H8000000D Picture1.Line (td, k)-(td + 10, ds_v - xq_v - dr * song_q(Round(x, 2))) End If k = ds_v - xq_v - dr * song_q(Round(x, 2)) x = Round(x, 2) + f_v If td + 10 > Picture1.ScaleWidth Then check = True Else td = td + 10 End If If (check = True) Then Exit Do Wend If (check = True) Then Exit Do x = 5.97 'Ve song r While Round(x, 2) < 6.04 If td 0 Then Picture1.ForeColor = &H80000005 Picture1.Line (td + 20, 1)-(td + 20, Picture1.ScaleHeight) Picture1.ForeColor = &H8000000D Picture1.Line (td, k)-(td + 10, ds_v - xqrs_v - dr * song_qrs_v(Round(x, 2))) End If k = ds_v - xqrs_v - dr * song_qrs_v(Round(x, 2)) x = Round(x, 2) + f_v If td + 10 > Picture1.ScaleWidth Then check = True Else td = td + 10 End If If (check = True) Then Exit Do Wend If (check = True) Then Exit Do x = 8.02 'Ve song s While Round(x, 2) < 8.15 If td 0 Then Picture1.ForeColor = &H80000005 Picture1.Line (td + 20, 1)-(td + 20, Picture1.ScaleHeight) Picture1.ForeColor = &H8000000D Picture1.Line (td, k)-(td + 10, ds_v - xs_v - dr * song_s_v(Round(x, 2))) End If k = ds_v - xs_v - dr * song_s_v(Round(x, 2)) x = Round(x, 2) + f_v If td + 10 > Picture1.ScaleWidth Then check = True Else td = td + 10 End If If (check = True) Then Exit Do Wend If (check = True) Then Exit Do x = 10 'Ve song t While Round(x, 2) < 10.5 If td 0 Then Picture1.ForeColor = &H80000005 Picture1.Line (td + 20, 1)-(td + 20, Picture1.ScaleHeight) Picture1.ForeColor = &H8000000D Picture1.Line (td, k)-(td + 10, ds_v - xt_v - dr * song_t_v(Round(x, 2))) End If k = ds_v - xt_v - dr * song_t_v(Round(x, 2)) x = Round(x, 2) + f_v If td + 10 > Picture1.ScaleWidth Then check = True Else td = td + 10 End If If (check = True) Then Exit Do Wend If (check = True) Then Exit Do x = 12.9 'Ve song u While Round(x, 2) < 13.1 If td 0 Then Picture1.ForeColor = &H80000005 Picture1.Line (td + 20, 1)-(td + 20, Picture1.ScaleHeight) Picture1.ForeColor = &H8000000D Picture1.Line (td, k)-(td + 10, ds_v - xu_v - dr * song_u(Round(x, 2))) End If k = ds_v - xu_v - dr * song_u(Round(x, 2)) x = Round(x, 2) + f_v If td + 10 > Picture1.ScaleWidth Then check = True Else td = td + 10 End If If (check = True) Then Exit Do Wend Loop k = ds_v - xp_v td = sample 'Ve song EKG_V tu phai qua trai Do While (td > 0) x = 13.09 'Ve song u While Round(x, 2) >= 12.9 If td Picture1.ScaleWidth Then Picture1.ForeColor = &H80000005 Picture1.Line (td - 20, 1)-(td - 20, Picture1.ScaleHeight) Picture1.ForeColor = &H8000000D Picture1.Line (td, k)-(td - 10, ds_v - xu_v - dr * song_u(Round(x, 2))) End If k = ds_v - xu_v - dr * song_u(Round(x, 2)) x = Round(x, 2) - f_v If td - 10 < 0 Then Exit Sub Else td = td - 10 End If Wend x = 10.49 'Ve song t While Round(x, 2) >= 10 If td Picture1.ScaleWidth Then Picture1.ForeColor = &H80000005 Picture1.Line (td - 20, 1)-(td - 20, Picture1.ScaleHeight) Picture1.ForeColor = &H8000000D Picture1.Line (td, k)-(td - 10, ds_v - xt_v - dr * song_t_v(Round(x, 2))) End If k = ds_v - xt_v - dr * song_t_v(Round(x, 2)) x = Round(x, 2) - f_v If td - 10 < 0 Then Exit Sub Else td = td - 10 End If Wend x = 8.14 'Ve song s While Round(x, 2) >= 8.02 If td Picture1.ScaleWidth Then Picture1.ForeColor = &H80000005 Picture1.Line (td - 20, 1)-(td - 20, Picture1.ScaleHeight) Picture1.ForeColor = &H8000000D Picture1.Line (td, k)-(td - 10, ds_v - xs_v - dr * song_s_v(Round(x, 2))) End If k = ds_v - xs_v - dr * song_s_v(Round(x, 2)) x = x - f If td - 10 < 0 Then Exit Sub Else td = td - 10 End If Wend x = 6.03 'Ve song r While Round(x, 2) >= 5.97 If td Picture1.ScaleWidth Then Picture1.ForeColor = &H80000005 Picture1.Line (td - 20, 1)-(td - 20, Picture1.ScaleHeight) Picture1.ForeColor = &H8000000D Picture1.Line (td, k)-(td - 10, ds_v - xqrs_v - dr * song_qrs_v(Round(x, 2))) End If k = ds_v - xqrs_v - dr * song_qrs_v(Round(x, 2)) x = Round(x, 2) - f_v If td - 10 < 0 Then Exit Sub Else td = td - 10 End If Wend x = 3.91 'Ve song q While Round(x, 2) >= 3.7 If td Picture1.ScaleWidth Then Picture1.ForeColor = &H80000005 Picture1.Line (td - 20, 1)-(td - 20, Picture1.ScaleHeight) Picture1.ForeColor = &H8000000D Picture1.Line (td, k)-(td - 10, ds_v - xq_v - dr * song_q(Round(x, 2))) End If k = ds_v - xq_v - dr * song_q(Round(x, 2)) x = Round(x, 2) - f_v If td - 10 < 0 Then Exit Sub Else td = td - 10 End If Wend x = 1.99 'Ve song p While Round(x, 2) >= 1.65 If td Picture1.ScaleWidth Then Picture1.ForeColor = &H80000005 Picture1.Line (td - 20, 1)-(td - 20, Picture1.ScaleHeight) Picture1.ForeColor = &H8000000D Picture1.Line (td, k)-(td - 10, ds_v - dr * song_p_v(Round(x, 2))) End If k = ds_v - dr * song_p_v(Round(x, 2)) x = Round(x, 2) - f_v If td - 10 < 0 Then Exit Sub Else td = td - 10 End If Wend Loop End Sub Private Sub nhip_tho(ByVal sample As Integer) Dim k As Single Dim x As Single Dim td As Integer Dim i As Integer Dim check As Boolean td = sample check = False Picture2.ForeColor = &H80000005 Picture2.Line (td, 1)-(td, Picture2.ScaleHeight) Picture2.Line (td + 10, 1)-(td + 10, Picture2.ScaleHeight) Do While (check = False) x = 0 k = ds_nt While Round(x, 2) < 2 * pi If td 0 Then Picture2.ForeColor = &H80000005 Picture2.Line (td + 20, 1)-(td + 20, Picture2.ScaleHeight) 'Xoa truoc khi ve Picture2.ForeColor = &HFF Picture2.Line (td, k)-(td + 10, ds_nt - dr_nt * (Sin(Round(x, 2)))) 'Ve song End If k = ds_nt - dr_nt * (Sin(Round(x, 2))) x = Round(x, 2) + f_nt If td + 10 > Picture2.ScaleWidth Then check = True Else td = td + 10 End If If (check = True) Then Exit Do Wend Picture2.Line (td, k)-(td, ds_nt) Loop td = sample Do While (td > 0) x = 2 * pi k = ds_nt While Round(x, 2) > 0 If td Picture2.ScaleWidth Then Picture2.ForeColor = &H80000005 Picture2.Line (td - 20, 1)-(td - 20, Picture2.ScaleHeight) 'Xoa truoc khi ve Picture2.ForeColor = &HFF Picture2.Line (td, k)-(td - 10, ds_nt - dr_nt * (Sin(Round(x, 2)))) End If k = ds_nt - dr_nt * (Sin(Round(x, 2))) x = Round(x, 2) - f_nt If td - 10 < 0 Then Exit Sub Else td = td - 10 End If Wend Picture2.Line (td, k)-(td, ds_nt) Loop End Sub Private Sub Command1_Click() Unload Me End Sub Private Sub Command2_Click() If val_speed > 0 Then val_speed = val_speed - 1 Text5.Text = val_speed * 10 + 10 & " mm/s" Timer1.Interval = val_speed * 20 + 1 End If End Sub Private Sub Command7_Click() If val_speed < 4 Then val_speed = val_speed + 1 Text5.Text = val_speed * 10 + 10 & " mm/s" Timer1.Interval = val_speed * 20 + 1 End If End Sub Private Sub Command3_Click() If Text4.Text = "50 Hz" Then Text4.Text = "60 Hz" Else Text4.Text = "50 Hz" End If End Sub Private Sub Command4_Click() If f_nt < 0.07 Then f_nt = f_nt + 0.01 cal_td_nt = calculate_td_nt Text3.Text = Round(f_nt * 100 - 3) * 10 End If End Sub Private Sub Command5_Click() If f_nt > 0.05 Then f_nt = f_nt - 0.01 cal_td_nt = calculate_td_nt Text3.Text = Round(f_nt * 100 - 3) * 10 End If End Sub Private Sub Command6_Click() If (Text2.Text = "II") Then Text2.Text = "V" Else Text2.Text = "II" End If End Sub Private Sub Form_Load() dr = 1500 f_nt = 0.06 val_speed = 2 change End Sub Private Sub change() cal_td = calculate_td cal_td_v = calculate_td_v cal_td_nt = calculate_td_nt xp = dr * song_p(0.01) xq = xp - dr * song_q(3.5) xqrs = xp - dr * song_qrs(5) xs = xp - dr * song_s(7.5) xt = xp - dr * song_t(9.5) xu = xp - dr * song_u(12) xp_v = dr * song_p_v(1.65) xq_v = xp_v - dr * song_q(3.5) xqrs_v = xp_v - dr * song_qrs_v(5.5) xs_v = xp_v - dr * song_s_v(7.8) xt_v = xp_v - dr * song_t_v(9.8) xu_v = xp_v - dr * song_u(12.5) End Sub Private Sub Slider2_Change() dr = 500 * Slider2.Value change End Sub Private Sub Timer1_Timer() Static tdd As Integer If Text2.Text = "II" Then draw_ekg (tdd) If tdd >= cal_td Then tdd = cal_td / 10 Else tdd = tdd + cal_td / 10 End If Else draw_ekg_v (tdd) If tdd >= cal_td_v Then tdd = cal_td_v / 10 Else tdd = tdd + cal_td_v / 10 End If End If End Sub Private Sub Timer2_Timer() Static tdd As Integer nhip_tho (tdd) If tdd >= cal_td_nt Then tdd = cal_td_nt / 10 Else tdd = tdd + cal_td_nt / 10 End If End Sub Private Function calculate_td() As Integer Dim m As Integer Dim x As Single x = 0.01 While Round(x, 2) < 2 x = Round(x, 2) + f m = m + 1 Wend x = 3.5 While Round(x, 2) < 3.92 x = Round(x, 2) + f m = m + 1 Wend x = 5.8 While Round(x, 2) < 6.22 x = Round(x, 2) + f m = m + 1 Wend x = 8.1 While Round(x, 2) < 8.27 x = Round(x, 2) + f m = m + 1 Wend x = 9.07 While Round(x, 2) < 11.2 x = Round(x, 2) + f m = m + 1 Wend x = 12.9 While Round(x, 2) < 13.1 x = Round(x, 2) + f m = m + 1 Wend calculate_td = 10 * m End Function Private Function calculate_td_v() As Integer Dim m As Integer Dim x As Single x = 1.65 While Round(x, 2) < 2 x = Round(x, 2) + f_v m = m + 1 Wend x = 3.7 While Round(x, 2) < 3.92 x = Round(x, 2) + f_v m = m + 1 Wend x = 5.97 While Round(x, 2) < 6.04 x = Round(x, 2) + f_v m = m + 1 Wend x = 8.02 While Round(x, 2) < 8.15 x = Round(x, 2) + f_v m = m + 1 Wend x = 10 While Round(x, 2) < 10.5 x = Round(x, 2) + f_v m = m + 1 Wend x = 12.9 While Round(x, 2) < 13.1 x = Round(x, 2) + f_v m = m + 1 Wend calculate_td_v = 10 * m End Function Private Function calculate_td_nt() As Integer Dim m As Integer Dim x As Single x = 0 While Round(x, 2) < 2 * pi x = Round(x, 2) + f_nt m = m + 1 Wend calculate_td_nt = 10 * m End Function Private Sub Timer3_Timer() Randomize Text1.Text = 80 + Int((4 * Rnd)) End Sub ‘ Form SpO2 Const pi = 3.14159265 Const l = 1 Const f = 0.01 'Dieu tan so cua song Const ds = 2500 'Dieu chinh vi tri cua song Const dr = 4000 'Dieu chinh bien do cua song Dim xt As Integer, xu As Integer Dim cal_td As Integer Private Sub Form_Load() ProgressBar1.Orientation = ccOrientationVertical xt = dr * song_t(1) xu = xt - dr * song_u(6) cal_td = calculate_td End Sub Private Sub Timer1_Timer() Static tdd As Integer draw_SpO2 (tdd) If tdd >= cal_td Then tdd = cal_td / 10 Else tdd = tdd + cal_td / 10 End If End Sub Private Sub Timer2_Timer() Randomize Text1.Text = 78 + Int((4 * Rnd)) Randomize Text2.Text = 97 + Int((3 * Rnd)) ProgressBar1.Value = Val(Text2.Text) - 95 End Sub Private Function song_t(ByVal x As Single) As Single Dim a As Single, b As Single, t1 As Single, t2 As Single, harm2 As Single Dim i As Integer, n As Integer a = 0.25 x = x - 0.15 - 0.045 b = (2 * l) / 0.45 n = 100 t1 = 1 / l t2 = 0 For i = 1 To n harm2 = (((Sin((pi / (2 * b)) * (b - (2 * i)))) / (b - (2 * i)) + (Sin((pi / (2 * b)) * (b + (2 * i)))) / (b + (2 * i))) * (2 / pi)) * Cos((i * pi * x) / l) t2 = t2 + harm2 Next song_t = a * (t1 + t2) End Function Private Function song_u(ByVal x As Single) As Single Dim a As Single, b As Single, u1 As Single, u2 As Single, harm4 As Single Dim i As Integer, n As Integer a = 0.08 x = x - 0.433 b = (2 * l) / 0.35 n = 100 u1 = 1 / l u2 = 0 For i = 1 To n harm4 = (((Sin((pi / (2 * b)) * (b - (2 * i)))) / (b - (2 * i)) + (Sin((pi / (2 * b)) * (b + (2 * i)))) / (b + (2 * i))) * (2 / pi)) * Cos((i * pi * x) / l) u2 = u2 + harm4 Next song_u = a * (u1 + u2) End Function Private Sub draw_SpO2(ByVal sample As Integer) Dim k As Single Dim x As Single Dim td As Integer Dim i As Integer Dim check As Boolean k = ds - xt td = sample check = False Picture1.ForeColor = &H80000005 Picture1.Line (td, 1)-(td, Picture1.ScaleHeight) Picture1.Line (td + 10, 1)-(td + 10, Picture1.ScaleHeight) 'Ve song tu trai qua phai Do While (check = False) x = 1.9 'Ve song t While Round(x, 2) < 2.37 If td 0 Then Picture1.ForeColor = &H80000005 Picture1.Line (td + 20, 1)-(td + 20, Picture1.ScaleHeight) 'Xoa truoc khi ve Picture1.ForeColor = &HFF80FF Picture1.Line (td, k)-(td + 10, ds - dr * song_t(Round(x, 2))) 'Ve song End If k = ds - dr * song_t(Round(x, 2)) x = Round(x, 2) + f If td + 10 > Picture1.ScaleWidth Then check = True Else td = td + 10 End If If (check = True) Then Exit Do Wend If (check = True) Then Exit Do x = 6.43 'Ve song u While Round(x, 2) < 6.75 If td 0 Then Picture1.ForeColor = &H80000005 Picture1.Line (td + 20, 1)-(td + 20, Picture1.ScaleHeight) Picture1.ForeColor = &HFF80FF Picture1.Line (td, k)-(td + 10, ds - xu - dr * song_u(Round(x, 2))) End If k = ds - xu - dr * song_u(Round(x, 2)) x = Round(x, 2) + f If td + 10 > Picture1.ScaleWidth Then check = True Else td = td + 10 End If If (check = True) Then Exit Do Wend Loop k = ds - xt td = sample 'Ve song tu phai qua trai Do While (td > 0) x = 6.74 'Ve song u While Round(x, 2) >= 6.43 If td Picture1.ScaleWidth Then Picture1.ForeColor = &H80000005 Picture1.Line (td - 20, 1)-(td - 20, Picture1.ScaleHeight) Picture1.ForeColor = &HFF80FF Picture1.Line (td, k)-(td - 10, ds - xu - dr * song_u(Round(x, 2))) End If k = ds - xu - dr * song_u(Round(x, 2)) x = Round(x, 2) - f If td - 10 < 0 Then Exit Sub Else td = td - 10 End If Wend x = 2.36 'Ve song t While Round(x, 2) >= 1.9 If td Picture1.ScaleWidth Then Picture1.ForeColor = &H80000005 Picture1.Line (td - 20, 1)-(td - 20, Picture1.ScaleHeight) Picture1.ForeColor = &HFF80FF Picture1.Line (td, k)-(td - 10, ds - dr * song_t(Round(x, 2))) End If k = ds - dr * song_t(Round(x, 2)) x = Round(x, 2) - f If td - 10 < 0 Then Exit Sub Else td = td - 10 End If Wend Loop End Sub Private Function calculate_td() As Integer Dim m As Integer Dim x As Single x = 1.9 While Round(x, 2) < 2.37 x = Round(x, 2) + f m = m + 1 Wend x = 6.43 While Round(x, 2) < 6.75 x = Round(x, 2) + f m = m + 1 Wend calculate_td = 10 * m End Function ‘ Form NIBP Dim val_cycle As Byte Dim val_Pump As Byte Private Sub Command1_Click() If Label_Status.Caption = "IDLE" Then Select Case val_cycle Case 0: Label10.Caption = "Manual" val_cycle = 1 Case 1: Label10.Caption = "1min" val_cycle = 2 Case 2: Label10.Caption = "2min" val_cycle = 3 Case 3: Label10.Caption = "3min" val_cycle = 4 Case 4: Label10.Caption = "4min" val_cycle = 5 Case 5: Label10.Caption = "5min" val_cycle = 6 Case 6: Label10.Caption = "10min" val_cycle = 7 Case 7: Label10.Caption = "15min" val_cycle = 8 Case 8: Label10.Caption = "30min" val_cycle = 0 End Select End If End Sub Private Sub Command10_Click() If Label_Status.Caption = "IDLE" Then Select Case val_Pump Case 0: Label14.Caption = "100mHg" val_Pump = 1 Case 1: Label14.Caption = "120mHg" val_Pump = 2 Case 2: Label14.Caption = "140mHg" val_Pump = 3 Case 3: Label14.Caption = "160mHg" val_Pump = 4 Case 4: Label14.Caption = "180mHg" val_Pump = 0 End Select End If End Sub Private Sub Command2_Click() Label_Status.Caption = "IDLE" End Sub Private Sub Command3_Click() Label_Status.Caption = "MEASURE" End Sub Private Sub Command4_Click() Unload Me End Sub Private Sub Command9_Click() If Label_Status.Caption = "IDLE" Then If Label12.Caption = "Neonate" Then Label12.Caption = "Adult" Else Label12.Caption = "Neonate" End If End If End Sub Private Sub Form_Load() val_cycle = 1 val_Pump = 1 End Sub Private Sub Timer1_Timer() Randomize Text1.Text = 115 + Int((3 * Rnd)) Randomize Text2.Text = 75 + Int((3 * Rnd)) Text3.Text = Round((2 * Val(Text2.Text) + Val(Text1.Text)) / 3) Randomize Text4.Text = 80 + Int((3 * Rnd)) End Sub

Các file đính kèm theo tài liệu này:

  • docDAN305.doc