主要内容

基于深度学习回归的脑电信号去噪

本例演示了如何使用该方法从脑电图(EEG)信号中去除眼电噪声EEGdenoiseNet基准数据集[1]深度学习回归。的EEGdenoiseNet数据集包含4514个干净的脑电图片段和3400个眼伪影片段,可以用地面真实的干净脑电图合成有噪声的脑电图片段(数据集还包含肌肉伪影片段,但在本例中不使用)。

本例使用干净的、受EOG污染的脑电图信号来训练长短期记忆(LSTM)模型来去除EOG伪影。回归模型由原始输入信号和经短时傅里叶变换(STFT)变换的信号训练而成。STFT模型提高了性能,特别是在信噪比降低的情况下。

创建数据集

EEGdenoiseNet数据集包含4514个清晰的EEG片段和3400个EOG片段,可用于生成3个数据集,用于训练、验证和测试深度学习模型。所有信号段的采样率为256hz。为方便起见,数据集已上载到以下位置:https://ssd.mathworks.com/supportfiles/SPT/data/EEGEOGDenoisingData.zip金宝app

属性下载数据集download金宝appSupportFile函数。

%下载数据datasetZipFile = matlab.internal.examples.download金宝appSupportFile (“SPT”“数据/ EEGEOGDenoisingData.zip”);datasetFolder = fullfile (fileparts (datasetZipFile),“EEG_EOG_Denoising_Dataset”);如果~存在(datasetFolder“dir”)解压缩(datasetZipFile fileparts (datasetZipFile));结束

在下载数据后,位置datasetFolder包含两个MAT文件:

  • EEG_all_epochs.mat包含4514个长度为512个样本的清晰EEG段矩阵

  • EOG_all_epochs.mat包含3400 EOG段长度512个样本的矩阵

使用createDataset生成训练、验证和测试数据集的辅助函数。该功能结合干净的EEG和EOG信号,生成不同信噪比(SNR)的干净和有噪声的EEG段。对于任意一对EEG和EOG,可以使用以下组合方程得到具有给定信噪比的噪声段:

noisyEEG 脑电图描记器 + λ 小城镇

信噪比 10 日志 10 rms 脑电图描记器 rms λ 小城镇

你改变参数 λ 来控制神器的功率并达到一个特定的信噪比值。

来创建训练数据集createDataset将前2720对EEG和EOG段分别用随机信噪比在[- 7,2]dB区间组合10次,共计27200对训练对。每个训练对存储在名为MAT的文件夹中的MAT文件中火车.每个MAT文件包括:

  • 清晰的脑电图(存储在一个名为EEG)

  • EOG段(存储在一个名为小城镇

  • 一个有噪声的脑电图(存储在一个名为noisyEEG

  • 噪声段的信噪比(存储在一个名为信噪比

  • 信号段的采样率值(存储在名为Fs

创建验证数据集createDataset在[- 7,2]dB区间内,将接下来的340对EEG和EOG片段进行10次随机信噪比组合,共3400个验证片段。验证数据存储在名为MAT的文件夹中验证.每个MAT文件包含与训练集中描述的变量相同的变量。

最后,创建测试数据集createDataset将接下来的340对EEG和EOG片段进行10次合并,每个片段具有确定的信噪比值为-7、-6、-5、-4、-3、-2、-1、0、1和2 dB。测试数据存储在名为MAT的文件夹中测试.将具有相同信噪比的测试MAT文件分组在一个共同的子文件夹下,便于分析给定信噪比下训练模型的去噪性能。例如,信噪比为-3 dB的测试信号文件被存储在一个带有名称的文件夹中data_SNR_-3

调用createDataset函数创建数据集(这可能需要几秒钟)。设置createDatasetFlag属性中已经有数据集,则为falsedatasetFolder想跳过这一步。

createDatasetFlag =真正的如果createDatasetFlag createDataset (datasetFolder);结束

准备使用数据的数据存储

生成的数据集相当大(约430mb),因此使用数据存储来访问数据很方便,而不必一次性将其全部读入内存。创建信号数据存储来访问培训和验证数据。使用SignalVariableNames参数指定要从MAT文件中读取的变量(按希望读取的顺序)。还指定ReadOutputOrientation为“行”,以确保数据与LSTM网络兼容。

ds_Train = signalDatastore (fullfile (datasetFolder“训练”), SignalVariableNames = [“noisyEEG”“脑电波”), ReadOutputOrientation =“行”
ds_Train = signalDatastore with properties: Files:{'…/supp金宝apportfiles/SPT/data/EEG_EOG_Denoising_Dataset/train/data_1.mat';’……/ s金宝appupportfiles / SPT /数据/ EEG_EOG_Denoising_Dataset /火车/ data_10.mat”;“……/ s金宝appupportfiles / SPT /数据/ EEG_EOG_Denoising_Dataset /火车/ data_100。垫”……{'/home/fboucher/Documents/MATLAB/Examples/R2021b/supportfiles/SPT/data/EEG_金宝appEOG_Denoising_Dataset/train'} AlternateFileSystemRoots: [0×0 string] ReadSize: 1 SignalVariableNames: ["noisyEEG" "EEG"] ReadOutputOrientation: "row"
ds_Validate = signalDatastore (fullfile (datasetFolder“验证”), SignalVariableNames = [“noisyEEG”“脑电波”), ReadOutputOrientation =“行”);

从第一个训练文件中读取数据,绘制干净和嘈杂的脑电图信号。对数据存储的预览或读取方法的调用将产生一个1x2单元阵列,其中第一个单元包含有噪声的EEG段,第二个单元包含有干净的EEG段。

data =预览(ds_Train)
data =1×2单元阵列{[293.5459 312.8255 158.2003 54.3755 -122.9328 -245.2081 -263.6249 -231.0821 -265.4603 -326.4666 -382.5909 -399.4084 -271.8957 -35.5523 110.8435 163.8853 276.0972 411.6580 484.9692 579.9671 704.4224 715.7357 624.8036 565.6525 510.3934 346.0724 90.4347 -155.6278 -310.0931 -338.3046 -310.9277 -343.7870  -42,251.12 -462.0371 -499.4786 -578.8647 -588.3763 -497.5128 -492.0669 -614.5556 -661.3109 -579.5487 -480.8576 -331.8418 -131.9308 -64.3486 -92.1508 22.4674 179.0017 131.3366 21.0167 47.0048 72.9048 8.7219 -27.1450 -37.5581 -67.9045 -21.2165 68.1191 12.8107 -151.7520 -234.3676-217.8296 -185.2244 -164.2496 -186.3218 -259.2529 -330.6853 -405.8061 -503.9750 -501.7492 -288.2392 16.4508 253.6420 466.4391 717.8048 904.1583 974.9127 1.0648e + 03 1.2244e + 03 1.3335e + 03 1.3712e + 03 1.4139e + 03 1.4144e + 031.3391E + 03 1.3401C + 03 1.5020E + 03 1.6821C + 03 1.7543E + 03 1.7582C + 03 1.7833E + 03 1.8473E + 03 1.8473E + 03 1.8473E + 03 1.8685E + 03 1.7850E + 03 1.7850E + 03 1.6640E + 03 1.6640E + 03 1.5618E + 03 1.4678E+03 1.4627E + 03 1.5648E + 03 1.5608E + 03 1.4272E + 03 1.4523E + 03 1.6068E + 03 1.5567E + 03 1.3658E + 03 1.3158E + 03 1.3204E + 03 1.2457E + 03 1.22057E + 03 1.22057E + 03 1.24057E + 03 1.2400E + 03 1.0601C + 03 1.0654E + 03 1.0654E + 03 1.0684E + 03 1.0682E + 03 1.0135E +03 995.4703 1.0462e + 03 1.1054e + 03 1.0883e + 03 991.5936 946.6780 964.2951 876.7881 744.0202 754.4313 725.2564 462.8552 282.7478 422.9020 566.9241 473.6554 335.4952 296.2394 260.1373 181.3557 165.5355 299.4533 452.6924 393.9423 205.3760 191.1296 311.4351 300.4170 211.6092 214.6472 217.2602 164.5827 195.2764 297.2532 330.1215 322.6244 340.3149 298.3817 183.1748 170.3522309.5276 374.3551 265.5430 226.5715 340.0638 315.7039 136.6732 165.8833 344.5902 248.3717 -27.9482 -56.8646 109.7881 162.1398 105.1915 88.9519 110.0767 69.5323 -58.8971 -116.2790 -0.3552 46.8582 -126.7452 -229.6075 -141.9099 -154.0355 -296.3941 -354.4280 -386.1300 -419.9606 -274.0139 -66.4493 -44.1554  -85.8933 -88.3121 -162.2650 -186.2820 -37.5754 38.3777 -60.2507 -153.7257 -286.3940 -5187 -2866-640.6470 -6176 -640.6470 -661.4028 -784.5911 -908.6936 -911 -908.6936 -953.8550 -1.1159E + 03 -1.3089E + 03 -1.2774E + 03 -1.2213e + 03-1.3786E + 03 -1.5198E + 03 -1.4902E + 03 -1.4564E + 03 -1.4443E + 03 -1.3975E + 03 -1.4399E + 03 -1.5792E + 03 -1.6399E + 03 -1.6302E + 03 -1.6302E + 03-1.6650E + 03 -1.6882E + 03 -1.6382E + 03 -1.5771E + 03 -1.5110E + 03 -1.4109E + 03 -1.3619E + 03 -1.4156E + 03 -1.4516E + 03 -1.3837E + 03 -1.3837E + 03-1.2984e + 03 -1.2583e + 03 -1.1969e + 03 -1.0818e + 03 -949.8370 -785.9617 -593.8683 -484.6091 -493.6924 -486.5894 -376.9322 -254.3787 -246.5404 -358.0243 -457.8937 -455.3159 -407.6992 -323.9139 -143.8645-47.9140 -238.7738 -424.6188 -264.3816 -33.7708 -63.5278 -127.1567 -26.2163 21.3820 -79.8131 -156.4246 -169.0789 -204.3369 -265.7965 -319.7542 -345.6645 -347.2635 -346.8830 -298.6344 -193.2218 -175.2466 -263.6097 -282.8454 -246.9951 -273.7662  -255.3390 -160.0054 -156.2782 -160.6513 -21.3900 25.6993 -149.2867 -243.8079 -170.5436 -154.2558 -159.1055 -70.4898 -55.6186 -184.9485 -282.5962 -283.6852 -229.9518 -144.0285 -136.0738 -251.5972 -323.3831 -270.5175 -208.4219 -197.8861 -240.1977 -352.8216 -455.6938 -466.6105 -475.8638 -562.5412 -620.9217 -541.7099 -397.5501 -349.9958 -409.6095 -420.5214 -369.7480 -409.6981 -468.8235 -365.6404 -287.5636 -484.4784 -723.7460 -684.6297 -471.0508 -334.9867 -365.6236 -522.4700 -638.5261 -585.0912 -480.4407 -440.5247 -381.5005 -282.3495 -236.0896 -240.9890 -269.0734 -319.2842 -320.4942 -287.2268 -363.4684 -514.1044 -569.9932 -541.1071 -496.5918 -411.5588 -337.3943 -348.2844 -369.4418 -337.1498 -291.6518 -251.9061 -228.0908 -212.9140 -159.0688 -167.3810 -345.9673 -435.5995 -223.3164 -35.1722 -90.2426 -77.3739 76.3905 48.6435 -101.3630 -96.3987 -72.6505 -149.6118 -83.4186 118.1417 134.9427 11.3522 52.0115 234.5030 340.0810 350.6371 371.3420 399.1974 318.5930 109.3049 -26.2028 45.9424 146.2610 156.2677 236.4964 355.1251 247.6928 17.5845 -13.5088 51.5868 -16.7073 -56.6772 55.5756 108.1590 52.7701 78.7909 165.4370 175.4213 124.4899 25.4918 -105.4091 -121.8664 -17.4514 34.9487 52.8456 115.3902 88.9050 -18.9950 21.7647 156.9900 163.9505 119.2607 136.0510 123.1712 92.3660 90.3993 3.7770 -101.5293 -30.4743 77.8997 85.4559 200.3163 381.0650 305.4995 144.0639 243.1847 344.7070 166.2973 30.2100 181.1394 362.4509 376.9039 315.4304 277.4177 286.2399 295.2399 250.6823 252.2333 380.9921 475.7625 430.3416 383.2322 386.2697 341.6953 283.4970 299.4474 331.3131 303.5586 236.8910 185.7528 198.4428 256.0914 265.2153 197.2732 106.0651 42.6344 86.7558 248.4670 328.6696 217.0654 115.8127 134.7095 123.4219 88.0805 150.4634 172.4213 51.2537 2.9601 92.3141 124.4305 141.9237 263.2068 290.5031 176.4156 219.6978 370.3300 299.7149 172.6634 282.4104 368.8589 218.3248 102.9427 103.7194 35.4401 13.2908 120.6106 84.7856 -83.2411 -58.2985 78.9139 75.5260 48.0121 82.4030 47.5345 25.0876 139.5917 236.7479 227.8253 186.5794 90.9769 -2.7247 27.1747 18.1979 -137.4836 -170.3707 -35.5876 -33.7408 -118.0647 -38.4254 85.5209 98.7000 111.0841 147.8175 155.6366 195.0901 233.1084 198.1136 180.9826 170.8508 42.2914 -65.1522]} {[184.5071 182.3164 41.0644 -55.5457 -155.6309 -221.9838 -282.9218 -354.7277 -437.7731 -487.9534 -520.1615 -506.2143 -364.6989 -163.5820 -50.7511 26.8912 194.8870 390.9182 517.5795 593.4634 612.2013 553.5140 510.8928 534.3316 489.5771 283.2516 34.5120 -127.4337 -241.1786 -363.7183 -434.6263 -427.8548 -443.9207 -516.2359 -550.6356 -534.8068 -542.8537 -555.2995 -537.8079 -556.3362 -615.4577 -604.2526 -484.4763 -320.7209 -172.4580 -73.5406 -1.8568 99.4586 184.0984 160.4643 74.4949 10.5636 -49.4240 -109.0210 -128.1498 -128.4013 -118.2926 -59.3559 -7.2351 -44.3925 -118.2087 -159.5074 -187.7227 -207.9291 -217.5568 -252.9733 -292.6216 -298.9978 -342.3380 -450.3554 -489.6292 -382.5939 -218.6430 -74.2266 52.2691 138.1272 139.1030 70.6933 1.0145 -42.4630 -103.4616 -185.9607 -225.8533 -252.2135 -363.8540 -489.5758 -475.7173 -386.3537 -378.1933 -409.8378 -372.8535 -295.8953 -228.4253 -173.7187 -188.4879 -285.0080 -298.9211 -127.3412 35.8319 -8.3398 -118.2478 -78.7464 21.3938 24.1924 11.0743 63.1065 85.5681 67.8093 107.6461 164.9735 164.7395 168.9144 203.8057 210.9855 219.1537 276.0164 339.8352 392.1866 433.9953 414.4877 353.6295 330.8243 318.6424 277.9611 254.5348 223.2527 137.1390 95.9530 146.3726 145.0219 39.1259 -47.4125 -62.2298 -56.4713 -42.3134 4.4354 81.0353 126.2602 81.0397 30.0799 91.9103 167.9870 122.0614 58.4736 77.8752 70.7421 -2.9413 -26.6743 13.9483 41.7856 60.6159 94.5616 115.1145 107.3929 102.8801 137.3549 181.8851 180.3480 195.3455 292.6388 324.4309 217.9083 212.5276 355.4434 318.5107 82.7695 22.4755 169.3209 225.7422 174.6523 180.9261 205.8876 153.3403 75.5621 69.4078 132.9424 141.7501 24.3821 -82.4083 -65.1453 -27.1313 -50.0239 -96.2128 -162.3494 -188.0827 -70.3356 61.6508 38.1663 -23.7790 -24.5535 -55.9957 -65.6618 39.2241 115.0479 112.8966 166.4775 181.8789 34.0374 -78.0041 -51.5329 -63.2166 -109.3926 -83.1151 -97.0703 -158.8065 -84.3664 44.6814 32.8693 0.5971 78.9700 142.9246 150.2819 184.4547 175.9413 58.7671 -35.6207 -25.9139 -8.4974 -49.1827 -108.2087 -141.7154 -134.3698 -96.2263 -64.7217 -60.1042 -57.6134 -32.5431 1.9650 28.5149 55.7130 85.1667 111.3595 160.2484 226.6730 227.6562 137.4926 40.9107 -18.8243 -61.1854 -76.2282 -83.4148 -133.8459 -187.3029 -179.6742 -120.5781 -15.8016 81.0734 43.3321 -51.1707 16.9843 152.7320 125.5967 59.9723 124.7820 155.0875 57.7959 0.3257 14.7888 2.8780 -0.1661 25.2573 1.9835 -45.9279 -48.0225 -20.6491 18.3378 34.3649 -44.5040 -146.3061 -117.5063 -0.3587 53.6563 31.0214 18.0257 65.7692 124.1761 83.0233 -24.2939 -43.9572 -13.6894 -65.5889 -98.3299 -22.0335 -18.6543 -161.4866 -259.3167 -249.0026 -226.8589 -190.8240 -142.0858 -153.4440 -180.1550 -130.3496 -45.2894 12.9008 41.2162 21.2666 -25.4712 -20.7545 26.6362 39.2410 19.3302 27.9147 77.1813 112.9529 86.1450 36.0395 27.5247 27.7840 1.0752 5.4876 18.5464 -87.9264 -262.8144 -283.4608 -118.9496 6.6664 -54.1971 -179.8054 -185.7806 -107.2994 -87.5112 -78.2404 25.9276 108.8198 57.6744 -12.1159 -32.8426 -82.5263 -132.0208 -117.6162 -118.9881 -175.0695 -216.7788 -229.4338 -199.6173 -103.7726 -54.1239 -114.6663 -136.1396 -77.4445 -92.9215 -176.1955 -185.7606 -127.9888 -90.1109 -124.5307 -231.0845 -268.6486 -154.2345 -92.5942 -180.1112 -189.5059 -101.0242 -131.3268 -182.7982 -100.3321 -102.8661 -248.7238 -223.4905 -38.4470 -4.9460 -60.2417 11.5309 94.4714 73.1159 70.3551 126.3687 161.1489 162.7253 124.9805 57.2503 45.2784 76.0252 58.4429 51.2018 101.1252 83.8566 16.0189 65.7301 143.5281 73.0663 7.3477 92.5118 134.1665 42.8936 27.1547 126.4113 168.2120 144.8497 128.5777 81.5150 30.5906 49.1867 68.8646 53.4856 80.5853 87.3083 -4.4480 -26.8726 89.1834 120.0574 29.3774 19.3590 46.0898 -38.7869 -106.3669 -58.0703 -42.3876 -84.2495 -49.9379 35.0590 82.8349 113.9988 121.8874 95.8216 112.4760 144.4695 71.4178 -20.7198 50.3754 217.5505 288.2074 248.4080 198.0217 161.5141 108.6792 60.6000 79.7520 160.4816 222.2459 238.6432 242.2156 217.8590 154.8832 115.3816 121.1145 118.1581 87.5098 51.0366 34.3849 69.6186 121.3643 106.6053 50.6188 16.5712 -29.5941 -59.3618 28.4726 133.0784 88.4984 3.6516 29.6105 71.9211 49.0177 28.2880 14.6080 -9.6634 13.2494 48.8916 21.2872 17.1130 98.5594 147.5359 125.7440 132.8005 160.0092 133.7969 88.0235 70.9290 66.9099 57.3967 16.1320 -59.2551 -94.5876 -69.0312 -68.5262 -107.6983 -123.3063 -125.9344 -127.8381 -78.5704 -20.5095 -45.0608 -77.1851 -2.5161 99.9790 109.9419 60.5306 23.1728 8.3185 18.5414 20.5966 -58.5031 -182.2469 -212.0151 -135.8594 -89.1736 -113.9629 -101.7947 5.2091 129.6184 191.2036 200.8505 201.9036 194.7194 161.0028 114.6600 83.6711 40.1643 -29.6090 -84.8615]}
情节([数据{2}。“{1}数据。”),线宽= 2)传说(“清洁脑电图”“脑电图伴EOG伪影”)轴

如果对输入和输出信号进行归一化处理,回归网络的性能通常会得到改善。您可以转换信号数据存储,以便在从磁盘读取每个信号时对其应用规范化。的normalizeData助手函数列在本示例的最后。它只是减去信号的均值,然后除以信号的标准差。

ds_Train_T =变换(ds_Train @normalizeData);ds_Validate_T =变换(ds_Validate @normalizeData);

训练脑电信号去噪的回归模型

训练网络去噪信号,将有噪声的脑电信号输入到网络中,并在网络输出处要求脑电信号干净的地面真实信号。选择长短期记忆(LSTM)架构是因为它能够从时间序列中学习特征。

定义网络架构:当一个序列输入到网络,一个序列输出到网络时,将特征数设为1。使用dropout层来减少模型对训练数据的过拟合。使用回归层作为输出层,因为模型正在被训练执行回归。注意,必须对输入和输出信号应用规范化,以便使用转换后的数据存储比使用归一化选择的sequenceInputLayer这只是将输入标准化。

numFeatures = 1;numHiddenUnits = 100;layers = [sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits) dropoutLayer(0.2) fulllyconnectedlayer (numFeatures) regressionLayer];

定义训练选项参数:使用Adam优化器并选择在每个epoch洗牌数据。另外,指定验证数据存储ds_Validate_T作为验证数据的来源。

maxEpochs = 5;miniBatchSize = 150;选择= trainingOptions (“亚当”...MaxEpochs = MaxEpochs,...MiniBatchSize = MiniBatchSize,...InitialLearnRate = 0.005,...GradientThreshold = 1,...情节=“训练进步”...洗牌=“every-epoch”...Verbose = false,...ValidationData = ds_Validate_T,...ValidationFrequency = 100,...OutputNetwork =“best-validation-loss”);

使用trainNetwork函数来训练模型。可以直接将转换后的train数据存储传递给函数,因为数据存储在每次调用时都输出一个1x2的单元格数组,其中包含输入和输出信号方法。

训练步骤需要几分钟。您可以通过使用下面的选择器下载预先训练过的网络来跳过这些步骤。如果您想在示例运行时训练网络,请选择'培训网络'.如果您想跳过训练步骤,请选择'下载网络'和一个MAT文件,其中包含两个预先训练的网络-rawNet, stft净,将下载到您的机器中。

trainingFlag =“列车网络”如果trainingFlag = =“列车网络”rawNet = trainNetwork (ds_Train_T层,选项);其他的%下载预先训练的网络modelsZipFile = matlab.internal.examples.download金宝appSupportFile (“SPT”“数据/ EEGEOGDenoisingNetworks.zip”);modelsFolder = fullfile (fileparts (datasetZipFile),“EEG_EOG_Denoising_Networks”);如果~存在(modelsFolder“dir”)解压缩(modelsZipFile fileparts (modelsZipFile));结束modelsFile = fullfile (modelsFolder,“trainedNetworks.mat”);加载(modelsFile)结束

分析训练模型的去噪性能

利用测试数据集分析该算法的去噪性能rawNet网络。回想一下,测试数据集包含多个测试文件,针对[-7,-6,-5,-4,-3,-2,-1,0,1,2]dB中的每个SNR值。选取性能指标作为净基线脑电信号与去噪脑电信号之间的均方误差(MSE)。计算了无噪声脑电信号和无噪声脑电信号的MSE,给出了不去噪时的最坏情况MSE。在每个信噪比下,计算340个可用测试EEG段的每个MSE值,并得到平均MSE。

创建一个signalDatastore使用测试数据并使用转换后的数据存储来设置数据规范化。由于数据现在位于测试文件夹的子文件夹中,请指定IncludeSubfolders是真实的。此外,使用folders2labels函数来获取测试数据集中每个文件的文件夹名称列表,这样你就可以获得每个信噪比的数据。

ds_Test = signalDatastore (fullfile (datasetFolder“测试”), SignalVariableNames = [“noisyEEG”“脑电波”), IncludeSubfolders = true, ReadOutputOrientation =“行”);ds_Test_T =变换(ds_Test @normalizeData);%获取包含数据存储中每个文件的SNR值的标签标签= folders2labels (ds_Test)
标签=3400×1分类data_snr_1 data_snr_1 data_snr_1 data_snr_1 data_snr_1 data_snr_1 data_snr_1 data_snr_1 data_snr_1 data_snr_1 data_snr_1 data_snr_1 data_snr_1 data_snr_1 data_snr_1 data_snr_1 data_snr_1 data_snr_1 data_snr_1 data_snr_1 data_snr_1 data_snr_1 data_snr_1 data_snr_1data_SNR_-1⋮

对于每个信噪比值,对测试信号去噪,计算平均MSE值。使用子集函数来获取指向每个信噪比数据的数据存储。去噪一个信号叫预测函数将经过训练的网络和噪声数据作为输入。

信噪比= (2);MSE_Denoised_rawNet = 0(元素个数(信噪比),1);%测量去噪性能MSE_No_Denoise = 0(元素个数(信噪比),1);%测量不去噪时的最坏情况MSElblIdx = find(label == . label)“data_SNR_”+ num2str(信噪比(idx)));ds_Test_SNR =子集(ds_Test_T lblIdx);%新数据存储指向具有当前SNR值的文件%使用训练模型的预测函数去噪数据pred =预测(rawNet ds_Test_SNR);对象的340个去噪信号使用数组数据存储进行循环%当前信噪比值。转换数据存储以添加规范化%的一步。ds_Pred (arrayDatastore (pred OutputType = =变换“相同”), @normalizeData);mse = 0;mseWorstCase = 0;问= 0;hasdata(ds_Pred) testData = read(ds_Test_SNR);denoisedData =阅读(ds_Pred);{2}包含干净的脑电图,% test{1}数据包含噪声脑电图。mse = mse + sum((testData{2} - denoisedData{1}).^2)/numel(denoisedData{1});%不去噪时的最差MSE性能。%转换数据到单进动去噪数据是单%的精度。mseWorstCase = mseWorstCase + sum((single(testData{2}) - single(testData{1})).^2)/numel(testData{1});问=问+ 1;结束%去噪信号的平均MSEMSE_Denoised_rawNet (idx) = mse /问;%最坏情况平均MSEMSE_No_Denoise (idx) = mseWorstCase /问;结束

绘制平均MSE结果。

情节(信噪比、[MSE_No_Denoise MSE_Denoised_rawNet],线宽= 2)包含(“信噪比”) ylabel (“平均均方误差”)标题(“去噪性能”)传说(“最坏的情况(no-denoising)”用rawNet模型去噪

利用短时傅里叶变换特征提取提高性能

提高深度学习模型性能的常用方法是使用提取的特征来代替原始的原始信号数据。这些特性提供了输入数据的表示,使网络更容易了解信号的最重要方面。

选择窗口长度为64个样本,重叠长度为63个样本的短时傅里叶变换(STFT)。这个转换将有效地创建33个复杂特性,每个特性的长度为449个样本。LSTM网络不支持复杂输入,通过将特征的实金宝app部叠加在特征的虚部之上,可以将复杂特征分离为实部和虚部,得到66个真实特征,每个真实特征的长度为449个样本。

winLength = 64;overlapLength = 63;

transformSTFT这个例子末尾列出的辅助函数对输入信号进行归一化,然后计算它的STFT。该函数将实分量和虚分量堆叠起来,以创建一个实输出矩阵。此外,如果GPU可用,该函数将数据移动到GPU,以加速STFT计算,并减轻计算转换增加的复杂性。如果您不希望使用图形处理器,请设置useGPUFlag

useGPUFlag =真正的

利用该方法计算并绘制一对干净和噪声脑电图信号的短时傅立叶变换transformSTFT helper函数。

data =预览(ds_Train);P = transformSTFT(数据、winLength overlapLength useGPUFlag);图subplot(1,2,1) h = imagesc(P{2});h. parents . clim = [-40 57];标题(“清洁脑电图信号的STFT”) ylabel (“堆叠着真实和想象的特征”) subplot(1,2,2) h = imagesc(P{1});h. parents . clim = [-40 57];ylabel (“堆叠着真实和想象的特征”)标题(“噪声脑电图信号的短时傅立叶变换”

这个想法是训练一个网络,使它能够基于与噪声信号相对应的STFT输入产生去噪的STFT信号表示。注意,目标结果是一个去噪信号,而不是去噪的STFT表示,因此必须添加最后一个步骤来计算逆STFT (ISTFT),以恢复去噪信号,如下图所示。

辅助功能,transformISTFT,取去噪后的STFT网络输出,将堆叠的实特征和虚特征转换为复杂特征,并计算逆STFT。作为最后一步,函数对结果信号进行归一化。如果有可用的GPUuseGPUF如果延迟是真的,该函数将在GPU中执行所有计算,以减少处理时间。

属性创建训练、验证和测试数据存储来应用STFTtransformSTFT函数。

ds_Train_STFT =变换(ds_Train @ (d,西城,ol, fl) transformSTFT (d, winLength overlapLength useGPUFlag));ds_Validate_STFT =变换(ds_Validate @ (d,西城,ol, fl) transformSTFT (d, winLength overlapLength useGPUFlag));ds_Test_STFT =变换(ds_Test @ (d,西城,ol, fl) transformSTFT (d, winLength overlapLength useGPUFlag));

更新网络架构以考虑66个输入和输出特性,并在训练选项中指定新的验证数据。其他网络参数或选项不变。

numFeatures = winLength + 2;layers = [sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits) dropoutLayer(0.2) fulllyconnectedlayer (numFeatures) regressionLayer];选项。ValidationData = ds_Validate_STFT;

训练网络trainingFlag“列车网络”

如果trainingFlag = =“列车网络”stftNet = trainNetwork (ds_Train_STFT层,选项);结束

利用训练后的网络对测试数据进行脑电信号去噪。通过比较去噪和干净的基线脑电图信号,计算平均MSE值。

MSE_Denoised_stftNet = 0(元素个数(信噪比),1);%测量去噪性能lblIdx = find(label == . label)“data_SNR_”+ num2str(信噪比(idx)));指向具有当前SNR值的文件的新数据存储ds_Test_SNR =子集(ds_Test_T lblIdx);%计算MSE的原始脑电图信号ds_Test_STFT_SNR =子集(ds_Test_STFT lblIdx);% STFT转换%使用训练模型的预测函数去噪数据。pred =预测(stftNet ds_Test_STFT_SNR);对象的340个去噪信号使用数组数据存储进行循环%当前信噪比值。转换数据存储以计算逆% STFT,恢复实际去噪信号。ds_Pred (arrayDatastore (pred OutputType = =变换“相同”), @ (P,西城,ol) transformISTFT (P winLength overlapLength));mse = 0;问= 0;hasdata(ds_Pred) testData = read(ds_Test_SNR);denoisedData =阅读(ds_Pred);{2}包含干净的脑电图mse = mse + sum((testData{2} - denoisedData).^2)/numel(denoisedData);问=问+ 1;结束%去噪信号的平均MSEMSE_Denoised_stftNet (idx) = mse /问;结束

绘制未去噪、用原始输入信号训练的网络去噪、用STFT变换信号训练的网络去噪得到的平均MSE。您可以看到,STFT步长的添加改善了性能,特别是在较低的信噪比值下。

图绘制(信噪比,[MSE_No_Denoise、MSE_Denoised_rawNet MSE_Denoised_stftNet],线宽= 2)包含(“信噪比”) ylabel (“平均均方误差”)标题(“去噪性能”)传说(“最糟糕的情况(不去噪)”用rawNet模型去噪stftNet模型去噪

绘制不同信噪比的噪声和去噪信号。的getRandomEEG本例最后列出的辅助函数从测试数据集获得一个具有指定信噪比的随机脑电图信号。

信噪比=-7% dBdata = getRandomEEG (datasetFolder,信噪比);{1} noisyEEG = normalizeData(数据);{2} cleanEEG = normalizeData(数据);stftInput = transformSTFT (noisyEEG winLength、overlapLength useGPUFlag);denoisedEEG = transformISTFT(预测(stftNet stftInput)、winLength overlapLength);情节([cleanEEG。“denoisedEEG。“noisyEEG。”),线宽= 2)标题(脑电图去噪(信噪比=)+信噪比+“dB)”)传说(“清洁脑电图”“去噪脑电图”“吵了脑电图”)轴

结论

在这个例子中,您学习了如何训练一个深度网络来执行信号去噪的回归。你比较了两个模型,一个用原始的、干净的、带噪声的脑电图信号训练,另一个用短时间傅里叶变换提取的特征训练。您了解到可以通过叠加它们的实部和虚部并将它们作为独立的实部来使用复部特征。STFT序列的使用在较差的信噪比下提供了更大的性能改进,两种方法在性能上都随着信噪比的提高而收敛。

参考文献

[1] Haoming张、赵Mingqi陈伟,但丁Mantini,李Zherui Quanying刘。“脑电图去噪深度学习解决方案的基准数据集”https://arxiv.org/金宝搏官方网站abs/2009.11662

辅助函数

normalizeData-这个函数通过减去平均值并除以标准差来对输入信号进行归一化。

函数y = normalizeData (x)%此函数仅用于支持Signal中的示例金宝app%处理工具箱。它可能会在未来的版本中被更改或删除。如果Iscell (x) y = cell(1,numel(x));y {1} = {1} (x代表(x{1})) /性病(x {1});如果nummel (x) == 2 y{2} = (x{2}-mean(x{2}))/std(x{2});结束其他的Y = (x - mean(x))/std(x);结束结束

transformSTFT-这个函数使输入信号归一化数据并计算它们的短时傅里叶变换。它通过将实分量和虚分量叠加在另一个上面,将复STFT结果转换为实矩阵。

函数P = transformSTFT(数据、winLength overlapLength useGPUFlag)%此函数仅用于支持Signal中的示例金宝app%处理工具箱。它可能会在未来的版本中被更改或删除。如果~iscell(data) data = {data};结束细胞(P = 1,元素个数(数据);x ={1}的数据;如果useGPUFlag x = gpuArray(x);结束x = normalizeData (x);y = stft (x窗口= rectwin (winLength) OverlapLength = OverlapLength FrequencyRange =“单向的”);P {1} = [(y),图像放大(y)];如果nummel (data) == 2 x = data{2};如果useGPUFlag x = gpuArray(x);结束x = normalizeData (x);y = stft (x窗口= rectwin (winLength) OverlapLength = OverlapLength FrequencyRange =“单向的”);P {2} = [(y),图像放大(y)];结束结束

transformISTFT-这个函数取一个叠加实和虚STFT元素的矩阵,并将它们组合成一个复杂的STFT矩阵。然后该函数计算STFT反变换并对得到的重构信号进行归一化。

函数data = transformISTFT (P winLength overlapLength)%此函数仅用于支持Signal中的示例金宝app%处理工具箱。它可能会在未来的版本中被更改或删除。页= P {1};NumRows =大小(页1);X =页(:1:NumRows / 2) + 1我*页(1 + NumRows / 2:最终,);data = istft (X,窗口= rectwin (winLength) OverlapLength = OverlapLength ConjugateSymmetric = true, FrequencyRange =“单向的”)”。;data = normalizeData(数据);结束

createDataset-该功能将清晰的EEG信号片段与EOG片段相结合,创建训练、验证和测试数据集,以训练EEG去噪神经网络。

函数createDataset (dataDir)%此函数仅用于支持Signal中的示例金宝app%处理工具箱。它可能会在未来的版本中被更改或删除。%创建训练、验证和测试数据集,包括干净的脑电图%信号和被EOG片段污染的噪声脑电图信号。负载(fullfile (dataDir“EEG_all_epochs.mat”),“EEG_all_epochs”);负载(fullfile (dataDir“EOG_all_epochs.mat”),“EOG_all_epochs”);EEG_all_epochs = EEG_all_epochs(1:3400:)。';EOG_all_epochs = EOG_all_epochs。”;Fs = 256;trainingPercentage = 80;validationPercentage = 10;N =大小(EEG_all_epochs 2);%创建包含两个信号的mat文件的训练数据集% -一个干净的脑电图信号,一个被EOG伪影污染的脑电图信号。%将2720对EEG和EOG片段随机组合10次%信噪比在-7dB到2dB范围内,获得27200个训练段。EEG_training = EEG_all_epochs (:, 1: N * trainingPercentage / 100);EOG_training = EOG_all_epochs (:, 1: N * trainingPercentage / 100);M =大小(EEG_training 2);问= 0;如果~ (fullfile (dataDir,存在“训练”),“dir”) mkdir (fullfile (dataDir,“训练”))结束idx = 1: MKk = 1:10 CNT = CNT + 1;脑电图= EEG_training (:, idx)。';此次= EOG_training (:, idx)。';(noisyEEG,信噪比)= createNoisySegment(脑电图,小城镇,[7,2]);保存(fullfile (dataDir“训练”“data_”+ num2str(问)+“.mat”),“脑电波”“小城镇”“noisyEEG”“Fs”“信噪比”);结束结束%结合340对EEG和EOG数据建立验证数据集%分段10次,随机信噪比为(-7:2)dBEEG_validation = EEG_all_epochs (:, 1 + N * trainingPercentage / 100: N * trainingPercentage / 100 + N * validationPercentage / 100);EOG_validation = EOG_all_epochs (:, 1 + N * trainingPercentage / 100: N * trainingPercentage / 100 + N * validationPercentage / 100);M =大小(EEG_validation 2);问= 0;如果~ (fullfile (dataDir,存在“验证”),“dir”) mkdir (fullfile (dataDir,“验证”))结束idx = 1: MKk = 1:10 CNT = CNT + 1;脑电图= EEG_validation (:, idx)。';此次= EOG_validation (:, idx)。';(noisyEEG,信噪比)= createNoisySegment(脑电图,小城镇,[7,2]);保存(fullfile (dataDir“验证”“data_”+ num2str(问)+“.mat”),“脑电波”“小城镇”“noisyEEG”“Fs”“信噪比”);结束结束%结合340对EEG和EOG片段创建测试数据集[-7 -6 -5 -4 -3 -2 -1 0 1 2] dB。存储%训练集放在具有标识信噪比值名称的文件夹中,以便%通过访问具有特定信噪比的文件很容易分析性能。EEG_test = EEG_all_epochs (:, 1 + N * trainingPercentage / 100 + N * validationPercentage / 100:结束);EOG_test = EOG_all_epochs (:, 1 + N * trainingPercentage / 100 + N * validationPercentage / 100:结束);M =大小(EEG_test 2);SNRVect = (2);kk = 1:numel(SNRVect) cnt = 0;如果~ (fullfile (dataDir,存在“测试”“data_SNR_”+ num2str (SNRVect (kk))),“dir”) mkdir (fullfile (dataDir,“测试”“data_SNR_”+ num2str (SNRVect (kk))));结束idx = 1:M cnt = cnt + 1;脑电图= EEG_test (:, idx)。';此次= EOG_test (:, idx)。';(noisyEEG,信噪比)= createNoisySegment(脑电图,小城镇,SNRVect (kk));保存(fullfile (dataDir“测试”“data_SNR_”+ + num2str(信噪比)“/”+“data_”+ num2str(问)+“.mat”),“脑电波”“小城镇”“noisyEEG”“Fs”“信噪比”);结束结束结束函数[y, SNROut] = createNoisySegment(脑电图、工件、信噪比)%将脑电信号与伪影信号结合,信噪比为dB。如果信噪比为%二元素向量,其值是从一个统一的随机选取的区间百分比分布[信噪比(1)信噪比(2)]如果元素个数(信噪比)= = 2信噪比=信噪比(1)+(信噪比(2)信噪比(1))。*兰德(1,1);结束k = 10 ^(信噪比/ 10);λ= (1 / k) * rms (eeg) / rms(工件);Y = eeg + lambda * artifact;SNROut =信噪比;结束

getRandomEEG -函数从指定信噪比的随机脑电图测试文件。

函数data = getRandomEEG(datasetFolder,SNR)“测试”“data_SNR_”+ num2str(信噪比),SignalVariableNames = (“noisyEEG”“脑电波”), IncludeSubfolders = true);n =元素个数(sds.Files);idx =兰迪(n, 1);data =阅读(子集(sds, idx));结束

另请参阅

||(深度学习工具箱)