飞道的博客

基于GRNN网络和小波变换的ECG信号睡眠监测matlab仿真

442人阅读  评论(0)

目录

一、理论基础

二、核心程序

三、仿真测试结果



  
  1. 作者ID :fpga和matlab
  2. CSDN主页: https:/ /blog.csdn.net/ccsss22? type=blog
  3. 擅长技术:
  4. 1.无线基带,无线图传,编解码
  5. 2.机器视觉,图像处理,三维重建
  6. 3.人工智能,深度学习
  7. 4.智能控制,智能优化
  8. 5.其他

一、理论基础

1, 不同睡眠阶段会发出不同频率的波,所以最好用频谱的方法来提取出各个睡眠阶段中的不同频率的波如:α波,β波,θ波等等。

2,算法不需要太复杂,简便易懂最好。

3, 有关XML文件的作用我在这解释下,在matlab中用xmltest这个function可以得到所有XML的值,化成图就可以得到这个

这个数据是8小时睡眠的数据,上面这个XML文件图是对这8小时睡眠数据分期的结论,这个是老师给我们的正确结果,可以看到,前6小时这个人都处于清醒状态,所以是阶段0,六小时后开始睡眠阶段的变化,Y轴代表睡眠阶段,X轴是小时。

4,

      这个是我们原始的EEG信号,这个项目就是把这段原始信号通过算法来判断出每个时刻都处于什么睡眠阶段,然后得出结果后跟上面的XML文件的标准分期做对比来评判这种方法的准确率。

5, 打开EDF文件后会有21个测量人体电信号的传感器所测得的数据,但是我们只用其中四个A4,A2,C3,C1。上面这个原始EEG信号就是用A2-C3的差值所画的图,另外再做一个A4-C1的图就行。

我们的算法方法如下所示:

首先对原始的信号通过小波变换提取

然后小波变换做8层小波变换,提取第二层,第三层,第7层计算对应的能量,并做归一化处理。得到S1,S2,S3两个特征值

然后将 S1,S2,S3这五个变量做为特征提取变量。

1.1信号的小波分解与重构原理

 

然后通过8层次的小波分解,具体代码如下所示:

然后小波分解之后每一层的信号对应着具体不同的脑电波,具体看我这里的程序注释。

1.2GRNN网络

        广义回归神经网络(Generalized regression neural network, GRNN)是一种建立在非参数核回归基础之上的神经网络,通过观测样本计算自变量和因变量之间的概率密度函数。GRNN结构如图1所示,整个网络包括四层神经元:输入层、模式层、求和层与输出层。

       GRNN神经网络的性能,主要通过对其隐回归单元的核函数的光滑因子来设置的,不同的光滑因子可获得不同的网络性能。 

二、核心程序


  
  1. function [x_delta,x_theta,x_apha,x_beta,S2,S3,S5,S6,S7]=wavelete_energy_decompose( x)
  2. %小波分解
  3. [c,l]=wavedec( x, 8, 'db3');
  4. %下面的程序是对信号用小波进行分解。
  5. ca8=wrcoef( 'a',c,l, 'db3', 8);%心电、眼电干扰
  6. cd8=wrcoef( 'd',c,l, 'db3', 8);%0. 41~ 0. 82 delta波
  7. cd7=wrcoef( 'd',c,l, 'db3', 7);%0. 82~ 1.64 delta波
  8. cd6=wrcoef( 'd',c,l, 'db3', 6);%1. 64~ 3.28 delta波
  9. cd5=wrcoef( 'd',c,l, 'db3', 5);%3. 28~ 6.56 theta波
  10. cd4=wrcoef( 'd',c,l, 'db3', 4);%6. 56~ 13.13 apha波
  11. cd3=wrcoef( 'd',c,l, 'db3', 3);%13. 13~ 26.25 beta波
  12. cd2=wrcoef( 'd',c,l, 'db3', 2);%26. 25~ 52.25 高频噪声
  13. cd1=wrcoef( 'd',c,l, 'db3', 1);%52. 25~ 105 高频噪声
  14. %下面的程序时对小波分解的近似信号的系数提取
  15. %%%对delta系数求绝对和
  16. %x_delta=sum( abs(D8)^ 2)+sum( abs(D7)^ 2)+sum( abs(D6)^ 2);
  17. x_delta=sum( abs((cd8)).^ 2)+sum( abs((cd7)).^ 2)+sum( abs((cd6)).^ 2);
  18. %%%theta系数
  19. %x_theta=sum( abs(D5)^ 2);
  20. x_theta=sum( abs((cd5)).^ 2);
  21. %%%apha系数
  22. %x_apha=sum( abs(D4)^ 2);
  23. x_apha=sum( abs((cd4)).^ 2);
  24. %%%beta系数
  25. %x_beta=sum( abs(D3)^ 2);
  26. x_beta=sum( abs((cd3)).^ 2);
  27. %%%能量归一化
  28. energy_sum=x_delta+x_theta+x_apha+x_beta;
  29. x_delta=x_delta/energy_sum;
  30. x_theta=x_theta/energy_sum;
  31. x_apha=x_apha/energy_sum;
  32. x_beta=x_beta/energy_sum;
  33. S2 = sum( abs((cd2)).^ 2);
  34. S3 = sum( abs((cd3)).^ 2);
  35. S5 = sum( abs((cd5)).^ 2);
  36. S6 = sum( abs((cd6)).^ 2);
  37. S7 = sum( abs((cd7)).^ 2);
  38. S = S2+S3+S5+S6+S7;
  39. S2 = S2/S;
  40. S3 = S3/S;
  41. S5 = S5/S;
  42. S6 = S6/S;
  43. S7 = S7/S;

  
  1. function theStruct = parseXML(filename)
  2. % PARSEXML Convert XML file to a MATLAB structure.
  3. try
  4. tree = xmlread(filename);
  5. catch
  6. error( 'Failed to read XML file %s.',filename);
  7. end
  8. % Recurse over child nodes. This could run into problems
  9. % with very deeply nested trees.
  10. try
  11. theStruct = parseChildNodes(tree);
  12. catch
  13. error( 'Unable to parse XML file %s.',filename);
  14. end
  15. % ----- Local function PARSECHILDNODES -----
  16. function children = parseChildNodes(theNode)
  17. % Recurse over node children.
  18. children = [];
  19. if theNode.hasChildNodes
  20. childNodes = theNode.getChildNodes;
  21. numChildNodes = childNodes.getLength;
  22. allocCell = cell( 1, numChildNodes);
  23. children = struct( ...
  24. 'Name', allocCell, 'Attributes', allocCell, ...
  25. 'Data', allocCell, 'Children', allocCell);
  26. for count = 1:numChildNodes
  27. theChild = childNodes.item(count -1);
  28. children(count) = makeStructFromNode(theChild);
  29. end
  30. end
  31. % ----- Local function MAKESTRUCTFROMNODE -----
  32. function nodeStruct = makeStructFromNode(theNode)
  33. % Create structure of node info.
  34. nodeStruct = struct( ...
  35. 'Name', char(theNode.getNodeName), ...
  36. 'Attributes', parseAttributes(theNode), ...
  37. 'Data', '', ...
  38. 'Children', parseChildNodes(theNode));
  39. if any(strcmp(methods(theNode), 'getData'))
  40. nodeStruct.Data = char(theNode.getData);
  41. else
  42. nodeStruct.Data = '';
  43. end
  44. % ----- Local function PARSEATTRIBUTES -----
  45. function attributes = parseAttributes(theNode)
  46. % Create attributes structure.
  47. attributes = [];
  48. if theNode.hasAttributes
  49. theAttributes = theNode.getAttributes;
  50. numAttributes = theAttributes.getLength;
  51. allocCell = cell( 1, numAttributes);
  52. attributes = struct( 'Name', allocCell, 'Value', ...
  53. allocCell);
  54. for count = 1:numAttributes
  55. attrib = theAttributes.item(count -1);
  56. attributes(count).Name = char(attrib.getName);
  57. attributes(count). Value = char(attrib.getValue);
  58. end
  59. end

  
  1. clc;
  2. clear;
  3. close all;
  4. warning off;
  5. addpath 'func\'
  6. %读取数据选择
  7. SEL = 2; %设置 1,重新读取文件,设置 2,调用已经读取的数据
  8. if SEL = = 1
  9. %读取XML文件
  10. File_Name = 'mros-visit1-aa0009-profusion.xml';
  11. value = func_read_xml(File_Name);
  12. figure;
  13. subplot( 211);
  14. plot( value);
  15. %读取edf数据
  16. File_Name = 'mros-visit1-aa0009.edf';
  17. [sensorC3,sensorC4] = func_edf_read(File_Name); % 3为已知分类的信号,用来进行数据的训练
  18. subplot( 212);
  19. plot(sensorC3);
  20. save edf_data.mat value sensorC3 sensorC4
  21. else
  22. load edf_data.mat
  23. figure;
  24. subplot( 211);
  25. plot( value);
  26. subplot( 212);
  27. plot(sensorC3);
  28. axis([ 0,length(sensorC3), -600, 600]);
  29. end
  30. hd = fir1( 63, 0.3, 'low');
  31. sensorC3s = conv(sensorC3,hd);
  32. sensorC4s = conv(sensorC4,hd);
  33. %信号滤波
  34. sensorC3_filter = sensorC3s;
  35. %首先对已知的数据进行特征分析和提取,然后进行训练
  36. NUM = length(sensorC3_filter) /length( value);
  37. for i = 1:length( value) -1
  38. T(i, 1) = value(i);
  39. data(i,:) = sensorC3_filter(NUM *(i -1) + 1:NUM *i);
  40. end
  41. %信号特征提取
  42. Feature = func_get_feature(data);
  43. %睡眠大周期分割
  44. %进行神经网络的训练
  45. net_first = newgrnn(Feature ',T', 0.1);
  46. net_second = newgrnn(Feature ',T', 0.016);
  47. %然后对测试数据进行测试
  48. %信号滤波
  49. sensorC4_filter = sensorC4s;
  50. NUM = length(sensorC4_filter) /length( value);
  51. for i = 1:length( value)
  52. data2(i,:) = sensorC4_filter(NUM *(i -1) + 1:NUM *i);
  53. end
  54. %信号特征提取
  55. Feature2 = func_get_feature(data2);
  56. T2 = sim(net_first,Feature2 ');
  57. T2s = func_smooth(T2,64);
  58. T3 = round(T2s(1:length(sim(net_second,Feature2'))). *sim(net_second,Feature2 '));
  59. figure;
  60. subplot(211);
  61. plot(T3);title('测试信号识别结果 ');
  62. subplot(212);
  63. plot(sensorC4_filter);title('测试信号结果 ');
  64. axis([0,length(sensorC4_filter),-600,600]);

三、仿真测试结果

A28-46


转载:https://blog.csdn.net/ccsss22/article/details/127464459
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场