3.3.1. Nhiệm vụ
Xây dựng đƣợc một hệ thống phân tích tín hiệu điện não đồ có khả năng hỗ trợ bác sĩ chẩn đoán bệnh động kinh. Hệ thống phải có khả năng xử lý các phép tính toán phức tạp (khi xử lý tín hiệu) nhƣng cũng phải có giao diện ngƣời sử dụng tốt.
3.3.2. Khó khăn
Chƣơng trình viết bằng Matlab để thử nghiệm kết quả, Matlab cũng có khả năng thiết kế giao diện ngƣời sử dụng tuy nhiên rất hạn chế, đồng thời Matlab cũng không mạnh về việc tƣơng tác với các hệ quản trị cơ sở dƣ liệu. Một hệ thống ứng dụng trong thực tiễn không thể thiếu các yếu tố trên, do đó Matlab không phù hợp để làm phần mềm triển khai thực tế. Trong khi đó các công cụ xây dựng phần mềm thông thƣờng thì lại không có thƣ viện toán học để xử lý các tính toán phức tạp nhƣ Matlab.
3.3.3. Lựa chọn giải pháp
Có một số giải pháp để lựa chọn nhƣ sau:
- Tự xây dựng bộ thƣ viện xử lý toán học cho hệ thống
- Sử dụng File thực thi Matlab Stand Alone kết hợp với ngôn ngữ lập trình khác - Sử dụng Matlab Builder Library kết hợp với ngôn ngữ lập trình khác
Giải pháp thứ nhất thì quá tốn thời gian công sức, cần một đội ngũ nhân lực rất lớn và làm việc trong thời gian dài mới có thể đáp ứng đƣợc. Trong khuôn khổ luận văn của học viên thì điều này là không khả thi. Giải pháp thứ hai cũng đã đƣợc học viên thử nghiệm một thời gian, tuy nhiên học viên nhận thấy rằng việc tƣơng tác giữa hai ngôn ngữ lúc này không đƣợc linh hoạt, rất khó khăn cho việc lập trình. Học viên quyết định chọn giải pháp thứ ba, sử dụng công cụ Matlab Builder để đƣa các chƣơng trình Matlab thành dạng thƣ viện chia sẻ DLL, và C# có thể sử dụng chúng. Nhƣ vậy đã có thể kết hợp uyển chuyển hai ngôn ngữ để vừa xử lý đƣợc các tính toán toán học phức tạp, đồng thời xây dựng đƣợc hệ thống có giao diện ngƣời sử dụng thân thiện và khả năng quản lý dữ liệu.
Chuyển đổi chƣơng trình Matlab thành thƣ viện Matlab DLL [21]
Việc xử lý tín hiệu đƣợc định nghĩa thành các thƣ viện Matlab DLL để phần mềm có thể sử dụng và xử lý dữ liệu. Để có thể gọi đến và sử dụng nhƣ một lớp trong C# vào thì phải viết chƣơng trình Matlab dƣới dạng một hàm. Sau đó dùng công cụ
Deploytool trong Matlab để thực hiện chuyển chƣơng trình đó thành file DLL dạng .NET Assembly. Tiếp theo thực hiện khai báo lớp mới với các file .m cần thiết rồi tạo file (Hình 3-7). File đƣợc tạo ra có định dạng .DLL.
Hình 3-7: Công cụ tạo Matlab DLL
Chuyển kiểu dữ liệu giữa C# và Matlab [21]
Một vấn đề đặt ra là kiểu dữ liệu của biến trong Matlab và C# là khác nhau. Lớp đƣợc tạo ra bởi thƣ viện Matlab DLL sẽ không hiểu tham số truyển vào có kiểu int (số nguyên trong C#) hay kiểu char ký tự trong C#) là gì. Nhƣ vậy ta cần khai báo kiểu dữ liệu cho tham số truyền với kiểu mà Matlab hiểu đƣợc, bản thân C# không định nghĩa những kiểu này, để làm đƣợc điều đó ta cần đến thƣ viện MWArray.dll của Matlab: MWNumbericArray - kiểu số, MWArray - kiểu mảng, MWCharArray - kiểu ký tự, MWCellArray - kiểu ma trận...
3.3.4. Môi trƣờng và nền tảng phát triển
Hệ điều hành
Hệ thống sử dụng hệ điều hành Windows 7.
Hệ thống sử dụng hệ quản trị cơ sở dữ liệu Microsoft Access của Microsoft.
Công nghệ phát triển
Sử dụng công cụ phát triển phần mềm Microsoft Visual Studio 2010, ngôn ngữ C#, trên nền tảng Microsoft .NET Framework 4.0. Xây dựng hệ thống sử dụng mô hình 3 lớp với các ƣu điểm: dễ quản lý các thành phần của hệ thống, thuận lợi khi có nhu cầu thay đổi hay nâng cấp.
Hình 3-8: Mô hình hệ thống
3.4. CHƢƠNG TRÌNH 3.4.1. Mô hình chức năng
Phân hệ Quản lý dữ liệu bệnh nhân:
- Nạp dữ liệu từ máy đo: Chọn thƣ mục chứa dữ liệu bệnh nhân sau khi đo, lấy dữ liệu thông tin cá nhân và dữ liệu EEG thô của bệnh nhân đƣa vào phần mềm.
- Tìm kiếm dữ liệu bệnh nhân: Tìm kiếm bệnh nhân theo tiêu chí tên và tuổi, cho phép truy nhập nhanh đến dữ liệu bệnh nhân mong muốn.
- Hiển thị thông tin bệnh nhân: Hiển thị chi tiết các thông tin cá nhân của bệnh nhân.
Phân hệ Lọc tín hiệu điện não:
- Bao gồm các chức năng loại bỏ các loại nhiễu khỏi tín hiệu EEG
Phân hệ Đọc tín hiệu điện não:
- Hiển thị theo thời gian: Quan sát tín hiệu điện não theo thời gian - Hiển thị theo mẫu: Quan sát tín hiệu điện não theo mẫu
Hình 3-9: Mô hình chức năng
3.4.2. Giao diện
Giao diện phần mềm hiển thị chi tiết thông tin một bệnh nhân (Hình 3-10). Trên cùng bên trái là danh sách bệnh nhân hiển thị theo dạng cây, trên cùng bên phải là màn hình hiển thị các thông tin chi tiết về bệnh nhân. Ngƣời sử dụng có thể tìm kiếm dữ liệu bệnh nhân theo các tiêu chí: tên, tuổi và giới tính; chức năng tìm kiếm đƣợc đặt ngay phía dƣới danh sách bệnh nhân. Các chức năng nạp dữ liệu từ máy đo (Load Data), hiển thị thông tin cá nhân (Patient details) và các chức năng lọc dữ liệu EEG đƣợc bố trí ở góc dƣới cùng bên tay trái của màn hình hiển thị. Nhóm các chức năng đọc và hiển thị dữ liệu EEG đƣợc bố trí ở dƣới cùng bên tay phải gồm: đọc dữ liệu trên một kênh, đọc dữ liệu trên các kênh lựa chọn và đọc dữ liệu trên tất cả các kênh.
Hình 3-10: Giao diện hệ thống
3.4.3. Cơ sở dữ liệu
Bảng dữ liệu của hệ thống sử dụng hệ quản trị cơ sở dữ liệu Access bao gồm các thông tin chính sau:
StudyID: khóa chính, lƣu mã bản ghi của bệnh nhân StudyDate: ngày đo dữ liệu
Surname: tên bệnh nhân
DateOfBirth: ngày sinh của bệnh nhân Gender: giới tính
Age: tuổi (tính tại thời điểm đo)
HasVideo: có quay Video khi đo dữ liệu hay không Studylength: thời gian do dữ liệu (tính theo giây) URL: lƣu vị trí của dữ liệu EEG bệnh nhân trên ổ cứng
KẾT LUẬN
Luận văn đã nghiên cứu các đặc tính của tín hiệu điện não và đặc điểm của nhiễu mắt, nhiễu cơ từ đó đề xuất phƣơng pháp mới sử dụng thuật toán SOBI kết hợp kĩ thuật nhận dạng nguồn nhiễu để loại bỏ nhiễu mắt, nhiễu cơ ra khỏi tín hiệu điện não.
Nhóm nghiên cứu đã thực hiệu đo điện não đồ trên 50 bệnh nhân có tiền sử mắc bệnh động kinh khác nhau. Phân loại và chuyển đổi các đoạn dữ liệu điện não nền, có gai động kinh, có nhiễu mắt, nhiễu cơ từ định dạng của máy đo *.EEG sang định dạng *.MAT để sử dụng làm dữ liệu cho các nghiên cứu tiếp theo.
Dữ liệu sau khi chuyển đổi sang định dạng *.MAT có nhiều thành phần nhiễu do các linh kiện điện tử gây ra nhƣ: nhiễu 50Hz, nhiễu điện một chiều, nhiễu điện cực v.v chính vì vậy trong nghiên cứu này đã sử dụng các bộ lọc thông cao (loại các tín hiệu có tần số <0.5Hz), bộ lọc thông thấp (loại tín hiệu có tần số > 70Hz), bộ lọc chặn dải để loại tín hiệu điện lƣới 50Hz. Các kết quả cho thấy tín hiệu sau khi lọc khá giống với tín hiệu EEG ban đầu.
Học viên đã cài đặt và thử nghiệm phƣơng pháp đề xuất trên dữ liệu mô phỏng và dữ liệu thực, thực hiện so sánh và đánh giá với các phƣơng pháp đã có. Với việc sử dụng thuật toán này để loại nhiễu mắt, nhiễu cơ trong tín hiệu EEG có gai động kinh và kết quả cho thấy nhiễu mắt đƣợc loại bỏ khá tốt mà không làm ảnh hƣởng đến tín hiệu gai động kinh. Tuy nhiên hạn chế của phƣơng pháp là khối lƣợng xử lý tính toán còn cao (do phải tính FFT cho tín hiệu trên toàn bộ dữ liệu), nên tốc độ xử lý chậm, cần có sự cải tiến (nhƣ phát hiện nguồn nhiễu mà không cần tính FFT hay chỉ thực hiện thuật toán với đoạn dữ liệu đƣợc xác định trƣớc là có nhiễu).
Học viên cũng đã xây dựng thành công hệ thống phân tích thông tin điện não đồ, bƣớc đầu góp phần hỗ trợ bác sĩ chuyên khoa thần kinh chẩn đoán bệnh động kinh, hạn chế việc chẩn đoán nhầm. Các chức năng chính của hệ thống bao gồm:
+ Giao diện ngƣời sử dụng đơn giản, dễ thao tác.
+ Chức năng lọc tín hiệu điện não thô (theo các loại bộ lọc: thông thấp, thông cao, triệt dải).
+ Các chức năng loại nhiễu mắt, nhiễu cơ từ tín hiệu điện não.
+ Các chức năng đọc tín hiệu và hiển thị kết quả.
Những nghiên cứu tiếp tục từ kết quả của luận văn nếu đƣợc đầu tƣ, cải tiến có thể ứng dụng vào thực tiễn. Trong quá trình làm luận văn, học viên đã có một công bố tại hội nghị quốc tế Advanced Technologies for Communications (ATC-2013) và một
bài đã đăng ký tại Hội thảo quốc gia 2014 về Điện tử, Truyền thông và Công nghệ thông tin (REV-ECIT2014):
N. T. Anh Dao, Tran Duc Nghia, Nguyen Thi Hao, Tran Duc Tan, and Nguyen Linh Trung, “An Effective Procedure for Reducing EOG and EMG Artifacts from EEG Signals”, in The International Conference on Advanced Technologies for Communications 2013, Ho Chi Minh City, Viet Nam, Oct. 2013, vol. 1, pp. 328 - 332.
Trần Đức Nghĩa, Hoàng Quang Khải, Nguyễn Hùng Phong, Trần Đức Tân,
Nguyễn Linh Trung, “Nghiên cứu và phát triển phần mềm loại nhiễu phục vụ chẩn đoán điện não đồ”, Hội thảo quốc gia 2014 về Điện tử, Truyền thông và Công nghệ thông tin (REV-ECIT2014), Nha Trang, Khánh Hòa, Việt Nam, tháng 9/2014 (Submitted)
TÀI LIỆU THAM KHẢO
[1]. Anderer P, Roberts S, Schlogl A, Gruber G, Klosch G, Herrmann W, Rappelsberger P, Filz O, Barbanoj MJ, Dorffner G, Saletu B .Artifact processing in computerized analysis of sleep EEG – a review Neuropsychobiology 1999;40:150-157.
[2]. A. Belouchrani, et al., “A Blind Source Separation Technique using Second Order Statistics,” IEEE Trans. Signal Processing, Vol. 45, No. 2, Feb. 1997, pp. 434– 444.
[3]. Barlow JS. Artifact processing (rejection and minimization) in EEG data processing. Handbook of electroencephalography and clinical neurophysiology 1986; 2: 15–62.
[4]. Bayliss JD, Ballard DH. Recognizing Evoked Potentials in a Virtual Environment. In: Proc. Advances in Neural Information Processing Systems. 2000; vol.12. [5]. Bayliss JD, Ballard DH. A Virtual Reality Testbed for Brain-Computer Interface
Research. IEEE Transactions on Rehabilitation Engineering 2000b; 8:188-190. [6]. Bayliss JD, Ballard DH. Single Trial P300 Recognition in a Virtual Environment.
In: Proc.CIMA'99 (Soft Computing in Biomedicine).1999.
[7]. Choi S, Cichocki A, Park HM, Lee SY. Blind Source Separation and Independent Component Analysis: A Review. Neural Information Processing- Letters and Review 2005; 6:1–57.
[8]. Croft RJ, Barry RJ. Removal of ocular artifact from the EEG: a review. Neurophysiol Clin 2000; 30:5-19.
[9]. N. T. Anh Dao, Tran Duc Nghia, Nguyen Thi Hao, Tran Duc Tan, and Nguyen Linh Trung, “An Effective Procedure for Reducing EOG and EMG Artifacts from EEG Signals”, in The International Conference on Advanced Technologies for Communications 2013, Ho Chi Minh City, Viet Nam, Oct. 2013, vol. 1, pp. 328 - 332.
[10]. Donald L. Schomer, F. H. Lopes da Silva, 2011, Niedermeyer's Electroencephalography: Basic Principles, Clinical Applications, and Related Fields, Lippincott Williams & Wilkins
[11].Fisch BJ (2000) Fisch and Spehlmann's Eeg Primer: Basic Principles of Digital and Analog Eeg. Elsevier Publishing Company.
[12].Gratton G. Dealing with artifacts: The EOG contamination of the event-reJated brain potential. Behavior Research Methods, Instruments, & Computers 1998; 30: 44-53.
[13].Jasper, H. H. (1958). The ten-twenty electrode placement system of the International Federation. Electroencephalography and Clinical Neurophysiology, 10, 371-375.
[14].Jung TP, Humphries C, Lee TW, Makeig S, McKeown MJ, Iragui V, Sejnowski TJ. Extended ICA removes artifacts from electroencephalographic recordings. . Advances in Neural Information Processing Systems 1998; 10:894-900.
[15].Jung TP, Makeig S, Westerfield M, Townsend J, Courchesne E, Sejnowski TJ. Analysis and visualization of single-trial event-related potentials. Hum Brain Mapp 2001; 14:166-185.
[16].Jung TP, Makeig S, Westerfield M, Townsend J, Courchesne E, Sejnowski TJ. Removal of eye activity artifacts from visual event-related potentials in normal and clinical subjects. Clin Neurophysiol 2000; 111:1745-1758.
[17].Leif Sornmo, Pablo Laguna “Bioelectrical Signal Processing in Cardiac and Neurological Applications”, Academic Press, 2005.
[18].McFarland DJ, McCane LM, David SV, Wolpaw JR “Spatial filter selection for EEG-based ommunication Electroencephalogr” Clin Neurophysiol 1997; 103:386-394.
[19].Moore J, Zouridakis G Biomedical Technology and Devices Handbook. CRC Press, 2004.
[20].Niedermeyer E, Silva FLd Electroencephalography: Basic Principles, Clinical Applications, and Related Fields. Lippincott Williams & Wilkins, 2004.
[21].Phan Le, 2004, Matlab C# Book, LePhan Publishing, ISBN 0-9725794-4-3 [22].Puthusserypady S1, Ratnarajah T, Jue R, Ratnarajah T., “Robust estimation of
HDR in fMRI using H(infinity) filters” IEEE Trans Biomed Eng. 2010 May;57(5):1133-42. doi: 10.1109/TBME.2009.2039569. Epub 2010 Feb 17. [23].Seungjin Choi, Andrzej Cichocki, Hyung-Min Park and Soo- Young Lee, “Blind
Source Separation and Independent Component Analysis” vol. 6, No.1, January 2005.
[24].S. Puthusserypady, T. Ratnarajah, “Robust adaptive techniques for minimization of EOG artefacts from EEG signals” 2006, Vol. 86.9, pp. 2351-2363.
[25].Vigario R, Sarela J, Jousmiki V, Hamalainen M, Oja E. Independent component approach to the analysis of EEG and MEG recordings. Biomedical Engineering, IEEE Transactions on 2000; 47:589-593.
[26].Wim De Clercq*, Anneleen Vergult, Bart Vanrumste, Wim Van Paesschen, and Sabine Van Huffel, “Cannonical Correlattion Analysis Applied to Remove Muscle Artifacts Froms the Electroencephalogram”
[27].Ziling Zhou and Sadasivan Decomposition, “EOG artifact minimization using oblique projection corrected eigenvector decomposition” s30th Annual International IEEE EMBS Conference Vancouver, British Columbia, Canada, August 20-24, 2008.
PHỤ LỤC
Code lọc nhiễu trên C# sử dụng thƣ viện Matlab DLL
private void btnRun_Click(object sender, EventArgs e) {
string loc = cbbLoc.SelectedItem.ToString();
if(loc == "CreatRawData") { btnRun.Text = "Running"; btnRun.Refresh();
//var solver1 = SolverClass.solver();
//var addvalues1 = solver1.addvalues(new
Dim(Convert.ToInt32(textBox1.Text)));
// addvalues1.SavetoCSV();
//MessageBox.Show("Running...");
var zz = Directory.CreateDirectory("C:\\EEGData\\");
//string linkeeg = zz + "EEGDataRaw.mat";
//if (File.Exists(linkeeg))
// File.Delete(linkeeg);
string linkfile = txtReference.Text;
MWCharArray tenfile = null;
tenfile = new MWCharArray(linkfile);
//MWNumericArray duration = Convert.ToInt32(txtStudyLenght.Text);
ReadProFusion test = new ReadProFusion();
test.ReadProFusionEEG((MWCharArray)tenfile);
//tao ra file EEGDataRaw trong thu muc C:\EEGData\EEGDataRaw
string path = AppDomain.CurrentDomain.BaseDirectory;
var forderDataRaw = Directory.CreateDirectory(path +
Convert.ToString(txtStudyID.Text) + "\\EEGData\\EEGDataRaw\\");
//xoa file cu
string duongdanfile = path + Convert.ToString(txtStudyID.Text) +
"\\EEGData\\EEGDataRaw\\EEGData.mat";
if (File.Exists(duongdanfile)) File.Delete(duongdanfile);
string oldPath = "C:\\EEGData\\EEGDataRaw.mat";
string newPath = path + Convert.ToString(txtStudyID.Text) +
"\\EEGData\\EEGDataRaw\\";
string newFileName = "EEGData";
FileInfo f = new FileInfo(oldPath);
f.CopyTo(String.Format("{0}{1}{2}", newPath, newFileName,
f.Extension)); btnRun.Text = "Done"; btnRun.Refresh(); // MessageBox.Show("done"); } if (loc == "Prefilter") { btnRun.Text = "Running";
btnRun.Refresh();
string path = AppDomain.CurrentDomain.BaseDirectory;
string linkfile1 = path + Convert.ToString(txtStudyID.Text) +
"\\EEGData\\EEGDataRaw\\EEGData";
MWCharArray tenfile1 = null;
tenfile1 = new MWCharArray(linkfile1);
var forderFilter = Directory.CreateDirectory(path +
Convert.ToString(txtStudyID.Text) + "\\EEGData\\PreFilter\\");
string dauraFilter = path + Convert.ToString(txtStudyID.Text) +
"\\EEGData\\PreFilter\\EEGData";
MWCharArray outputlinkFilter = null;
outputlinkFilter = new MWCharArray(dauraFilter);
filter chayfilter = new filter();
chayfilter.prefilter((MWCharArray)tenfile1,
(MWCharArray)outputlinkFilter); btnRun.Text = "Done"; btnRun.Refresh(); } if (loc == "EMG") { btnRun.Text = "Running"; btnRun.Refresh();
string path = AppDomain.CurrentDomain.BaseDirectory;
string dauvaoEMG = path + Convert.ToString(txtStudyID.Text) +
"\\EEGData\\PreFilter\\EEGData";
MWCharArray inputlinkEMG = null;
inputlinkEMG = new MWCharArray(dauvaoEMG);
var forderEMG = Directory.CreateDirectory(path +
Convert.ToString(txtStudyID.Text) + "\\EEGData\\EMG\\");
string dauraEMG = path + Convert.ToString(txtStudyID.Text) +
"\\EEGData\\EMG\\EEGData";
MWCharArray outputlinkEMG = null;
outputlinkEMG = new MWCharArray(dauraEMG);
MWNumericArray channel1EMG; MWNumericArray channel2EMG; MWNumericArray channel3EMG; MWNumericArray channel4EMG; MWNumericArray sampleEMG; if (frmConfig.check == 1) {
string[] lines = File.ReadAllLines(path +
Convert.ToString(txtStudyID.Text) + "\\EEGData\\EMG\\EMG.txt");
sampleEMG = Convert.ToInt32(lines[lines.Length - 5]);
channel1EMG = Convert.ToInt32(lines[lines.Length - 4]);
channel2EMG = Convert.ToInt32(lines[lines.Length - 3]);
channel3EMG = Convert.ToInt32(lines[lines.Length - 2]);
channel4EMG = Convert.ToInt32(lines[lines.Length - 1]);
MessageBox.Show("Run with text file"); } else { channel1EMG = 4; channel2EMG = 6; channel3EMG = 8; channel4EMG = 1; sampleEMG = 1000; }
//MWArray test.ReadProFusionEEG=((MWCharArray)tenfile, (MWNumericArray)duration);
EMG.SOBInhieuco((MWCharArray)inputlinkEMG, (MWCharArray)outputlinkEMG,
(MWNumericArray)channel1EMG, (MWNumericArray)channel2EMG, (MWNumericArray)channel3EMG,
(MWNumericArray)channel4EMG, (MWNumericArray)sampleEMG);
btnRun.Text = "Done"; btnRun.Refresh(); } if (loc == "EOG") { btnRun.Text = "Running"; btnRun.Refresh();
string path = AppDomain.CurrentDomain.BaseDirectory;
string dauvaoEOG = path + Convert.ToString(txtStudyID.Text) +
"\\EEGData\\PreFilter\\EEGData";
MWCharArray inputlinkEOG = null;
inputlinkEOG = new MWCharArray(dauvaoEOG);
var forderEOG = Directory.CreateDirectory(path +
Convert.ToString(txtStudyID.Text) + "\\EEGData\\EOG\\");
string dauraEOG = path + Convert.ToString(txtStudyID.Text) +
"\\EEGData\\EOG\\EEGData";
MWCharArray outputlinkEOG = null;
outputlinkEOG = new MWCharArray(dauraEOG);
MWNumericArray channel1EOG; MWNumericArray channel2EOG; MWNumericArray channel3EOG; MWNumericArray channel4EOG; MWNumericArray sampleEOG; if (frmConfig.check == 2) {
string[] lines = File.ReadAllLines(path +
Convert.ToString(txtStudyID.Text) + "\\EEGData\\EOG\\EOG.txt");
sampleEOG = Convert.ToInt32(lines[lines.Length - 5]);
channel1EOG = Convert.ToInt32(lines[lines.Length - 4]);
channel2EOG = Convert.ToInt32(lines[lines.Length - 3]);
channel3EOG = Convert.ToInt32(lines[lines.Length - 2]);
channel4EOG = Convert.ToInt32(lines[lines.Length - 1]);
MessageBox.Show("Run with text file"); } else { channel1EOG = 1; channel2EOG = 4; channel3EOG = 5; channel4EOG = 11; sampleEOG = 1000; }
SOBIEOG EOG = new SOBIEOG();
//MWArray test.ReadProFusionEEG=((MWCharArray)tenfile,