├── FiltroPasaBanda.m ├── RWE_DWT_Multinivel.m ├── ContarNaN.m ├── .gitignore ├── AcomodarDatos.m ├── AcomodarDatosLaplace.m ├── CAR.m ├── DWTCoeficientes.m ├── AcomodarDatosBinaria.m ├── Alfa_DWT_C3_C4.m ├── Subconjunto4segMI.m ├── Ventaneo.m ├── FiltroLaplaciano.m ├── ReemplazarNaNFiltroMediana.m └── README.md /FiltroPasaBanda.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EdgarMoyete/Preprocesamiento-BCI-IV-2a/HEAD/FiltroPasaBanda.m -------------------------------------------------------------------------------- /RWE_DWT_Multinivel.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EdgarMoyete/Preprocesamiento-BCI-IV-2a/HEAD/RWE_DWT_Multinivel.m -------------------------------------------------------------------------------- /ContarNaN.m: -------------------------------------------------------------------------------- 1 | clear 2 | clc 3 | 4 | load('LimpiosA09E.mat'); 5 | %nan_canal = sum(isnan(signals_limpias)) 6 | nan_total = sum(sum(isnan(signals_limpias))) -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | Datos 2 | A*.gdf 3 | MotorImageryA*.mat 4 | LimpiosA*.mat 5 | Filtra*.mat 6 | MI-EEG*.csv 7 | MI-EEG*.mat 8 | Ventaneo*.csv 9 | Filtro32Hz.m 10 | ReemplazarNaNPruebas.m 11 | PruebasFFT.m 12 | Etiquetas*.csv 13 | CAR*.mat 14 | Laplace*.mat -------------------------------------------------------------------------------- /AcomodarDatos.m: -------------------------------------------------------------------------------- 1 | %Edgar Moises Hernandez-Gonzalez 2 | %16/10/19-10/07/20 3 | %Acomodar los datos para que queden concatenados los canales 4 | %Input shape 288000x22 5 | %Output shape 288*22000 6 | 7 | clear 8 | clc 9 | 10 | %cambiar el 01 por el numero de sujeto y revisar si es T o E 11 | load('FiltradasA09E.mat'); 12 | 13 | nuevo = zeros(288,22000); 14 | contador2 = 1; 15 | 16 | for i=1:288 17 | contador1=1; 18 | for j=1:22 19 | nuevo(i, contador1:contador1+999)... 20 | = signals_filtradas(contador2:contador2+999, j); 21 | contador1 = contador1 + 1000; 22 | end 23 | contador2 = contador2 + 1000; 24 | end 25 | %cambiar el 01 por el numero de sujeto y revisar si es T o E 26 | csvwrite('MI-EEG-A09E.csv',nuevo); 27 | save('MI-EEG-A09E.mat','nuevo'); -------------------------------------------------------------------------------- /AcomodarDatosLaplace.m: -------------------------------------------------------------------------------- 1 | %Edgar Moises Hernandez-Gonzalez 2 | %09/07/20-10/07/20 3 | %Acomodar los datos para que queden concatenados los canales 4 | %Input shape 288000x2 5 | %Output shape 288*2000 6 | 7 | clear 8 | clc 9 | 10 | %cambiar el 01 por el numero de sujeto y revisar si es T o E 11 | load('FiltraLaplaceA09E.mat'); 12 | 13 | nuevo = zeros(288,2000); 14 | contador2 = 1; 15 | 16 | for i=1:288 17 | contador1=1; 18 | for j=1:2 19 | nuevo(i, contador1:contador1+999)... 20 | = signals_filtradas(contador2:contador2+999, j); 21 | contador1 = contador1 + 1000; 22 | end 23 | contador2 = contador2 + 1000; 24 | end 25 | %cambiar el 01 por el numero de sujeto y revisar si es T o E 26 | csvwrite('MI-EEG-Laplace-A09E.csv',nuevo); 27 | save('MI-EEG-Laplace-A09E.mat','nuevo'); -------------------------------------------------------------------------------- /CAR.m: -------------------------------------------------------------------------------- 1 | %Edgar Moises Hernandez-Gonzalez 2 | %28/06/20 3 | %CAR (common average reference) 4 | %Input shape: 288000x22 5 | %Output shape: 288000x22 6 | %canal C4 es el 12 7 | %muestra 3 es derecha para el sujeto 1 8 | 9 | clear 10 | clc 11 | 12 | %cambiar el 01 por el numero de sujeto y revisar si es T o E 13 | load('LimpiosA09E.mat') 14 | 15 | promedio = mean(signals_limpias,2); 16 | car = signals_limpias - promedio; 17 | %cambiar sujeto y sesion 18 | save('CarA09E.mat','car'); 19 | 20 | % % Esto es para graficar la diferencia de la senal al aplicar CAR 21 | % c4 = signals_limpias(2000:3000,12); 22 | % plot(c4,'LineWidth',1); 23 | % hold on 24 | % c4_car = car(2000:3000,12); 25 | % plot(c4_car,'LineWidth',1); 26 | % grid; 27 | % xlabel('Time'); 28 | % ylabel('Amplitude'); 29 | % legend('C4','C4 CAR'); 30 | % hold off -------------------------------------------------------------------------------- /DWTCoeficientes.m: -------------------------------------------------------------------------------- 1 | %Edgar Moises Hernandez-Gonzalez 2 | %01/12/19 3 | %DWT de dos niveles, coeficientes concatenados, la variable C o L 4 | 5 | clear 6 | clc 7 | 8 | load('MI-EEG-A01E.mat'); 9 | [f, c] = size(nuevo); 10 | todoCoef = []; %aqui guardaremos todo 11 | for i=1:f 12 | muestra = nuevo(i,:); %selecciona la fila i (muestra num i) 13 | muestraCoef = []; 14 | indiceInicio = 1; 15 | indiceFin = 1000; 16 | for j=1:22 %numero de canales 17 | canal = muestra(indiceInicio:indiceFin); 18 | [C,L] = wavedec(canal, 2, 'db4'); 19 | muestraCoef = [muestraCoef C]; 20 | indiceInicio = indiceInicio + 1000; 21 | indiceFin = indiceFin + 1000; 22 | end 23 | todoCoef = [todoCoef; muestraCoef]; %se van concatenando las muestras 24 | end 25 | 26 | %csvwrite('MI-EEG-DWT-Coef-A01E.csv',todoCoef); -------------------------------------------------------------------------------- /AcomodarDatosBinaria.m: -------------------------------------------------------------------------------- 1 | %Edgar Moises Hernandez-Gonzalez 2 | %29/04/20-10/07/20 3 | %Solo usar los de mano izquierda y derecha para clasificacion binaria 4 | %Input shape 288*22000 5 | %Output shape 144*22000 6 | 7 | clear 8 | clc 9 | 10 | %cambiar el 01 por el numero de sujeto y revisar si es T o E 11 | load('MI-EEG-A09E.mat') 12 | load('Datos\Labels\A09E.mat') 13 | 14 | binarios = zeros(144,22000); 15 | %etiquetas = zeros(144,1); 16 | 17 | contador = 1; 18 | for i=1:288 19 | if classlabel(i) == 1 || classlabel(i) == 2 20 | binarios(contador,:) = nuevo(i,:); 21 | %etiquetas(contador) = classlabel(i) - 1; 22 | contador = contador + 1; 23 | end 24 | end 25 | %cambiar el 01 por el numero de sujeto y revisar si es T o E 26 | csvwrite('MI-EEG-ID-A09E.csv', binarios); 27 | %csvwrite('Etiquetas-ID-A09E.csv', etiquetas); 28 | %save('MI-EEG-ID-A01E.mat','binarios'); -------------------------------------------------------------------------------- /Alfa_DWT_C3_C4.m: -------------------------------------------------------------------------------- 1 | %Edgar Moises Hernandez-Gonzalez 2 | %27/11/19 3 | %Alfa de C3 y C4 con DWT de dos niveles de descomposicion 4 | 5 | clear 6 | clc 7 | 8 | load('MI-EEG-A01E.mat'); 9 | [f, c] = size(nuevo); 10 | 11 | alfas = []; 12 | for i=1:f 13 | c3 = nuevo(i,7001:8000); %selecciona la fila i (muestra num i) 14 | c4 = nuevo(i,11001:12000); %selecciona la fila i (muestra num i) 15 | alfaC3 = alfa_dwt(c3); 16 | alfaC4 = alfa_dwt(c4); 17 | alfas = [alfas; alfaC3 alfaC4]; %guardar alfa de c3 y c4 18 | end 19 | 20 | csvwrite('MI-EEG-Alfa-A01E.csv', alfas); 21 | 22 | % plot(alfaC3); 23 | % title('Alpha C3'); 24 | % xlabel('Time'); 25 | % ylabel('Amplitude'); 26 | % grid; 27 | % 28 | % figure; 29 | % plot(alfaC4); 30 | % title('Alpha C4'); 31 | % xlabel('Time'); 32 | % ylabel('Amplitude'); 33 | % grid 34 | 35 | function alfa = alfa_dwt(senal) 36 | [C, L] = wavedec(senal, 2, 'db4'); 37 | alfa = appcoef(C, L, 'db4', 2); 38 | end -------------------------------------------------------------------------------- /Subconjunto4segMI.m: -------------------------------------------------------------------------------- 1 | %Edgar Moises Hernandez-Gonzalez 2 | %16/10/19-01/12/19 3 | %Subconjuntos de datos para BCI-IV-2a 4 | %Obtenemos los 4seg de MI del segundo 2 al 6 5 | %Fs=250Hz, por lo tanto en 4seg son 1000 datos 6 | %Input Shape: todox25 7 | %Output Shape: 288000x22 8 | 9 | clear 10 | clc 11 | 12 | %cargar los datos 13 | [s, h] = sload('A09E.gdf'); %cambiar el 01 por el numero de sujeto y revisar si es T o E 14 | %Asi para que no existan NaN (no sirve) 15 | %[s, h] = sload('A01T.gdf', 0, 'OVERFLOWDETECTION:OFF'); %cambiar el 01 por el numero de sujeto 16 | 17 | signals = zeros(288000, 22); 18 | 19 | for columna=1:22 %22 canales 20 | contador = 1; 21 | for i=1:288 %288 muestras 22 | %s(2seg : 6seg, numColumna) 23 | signals(contador:contador+999, columna) = s(h.TRIG(i)+500 : h.TRIG(i)+1499, columna); 24 | contador = contador + 1000; 25 | end 26 | end 27 | save('MotorImageryA09E.mat','signals'); %cambiar el 01 por el numero de sujeto y revisar si es T o E -------------------------------------------------------------------------------- /Ventaneo.m: -------------------------------------------------------------------------------- 1 | %Edgar Moises Hernandez-Gonzalez 2 | %15/04/20-17/05/20 3 | %Ventanas de 2 seg superpuestas al 95% (0.1 seg) 4 | %Input shape 288x22000 5 | %Output shape 6048*11000 6 | 7 | clear 8 | clc 9 | 10 | %cambiar el 01 por el numero de sujeto y revisar si es T o E 11 | load('MI-EEG-A04E.mat'); 12 | 13 | signals = zeros(6048, 11000); 14 | c = 1; 15 | for i=1:288 %muestras 16 | a = 1; 17 | b = 1; 18 | for j=1:22 %canales 19 | una_muestra = nuevo(i, a:a+999); 20 | signals(c:c+20, b:b+499) = ventaneo(una_muestra); 21 | a = a + 1000; 22 | b = b + 500; 23 | end 24 | c = c + 21; 25 | end 26 | 27 | %cambiar el 01 por el numero de sujeto y revisar si es T o E 28 | csvwrite('Ventaneo-A04E.csv',signals); 29 | 30 | function ventaneadas = ventaneo(una_muestra) 31 | ventaneadas = zeros(21, 500); 32 | contador = 1; 33 | for i=1:21 34 | ventaneadas(i, :) = una_muestra(contador:contador + 499); 35 | contador = contador + 25; 36 | end 37 | end -------------------------------------------------------------------------------- /FiltroLaplaciano.m: -------------------------------------------------------------------------------- 1 | %Edgar Moises Hernandez-Gonzalez 2 | %09/07/20 3 | %Filtro Laplaciano para usar solo dos canales (C3 y C4) 4 | %Input shape: 288000x22 5 | %Output shape: 288000x2 6 | %canal C3 = 8 7 | %canal C4 = 12 8 | %muestra 3 es derecha para el sujeto 1 9 | 10 | clear 11 | clc 12 | 13 | %cambiar el 01 por el numero de sujeto y revisar si es T o E 14 | load('LimpiosA09E.mat'); 15 | 16 | c3_vecinos = [signals_limpias(:, 2) signals_limpias(:, 7) ... 17 | signals_limpias(:, 9) signals_limpias(:, 14)]; 18 | c4_vecinos = [signals_limpias(:, 6) signals_limpias(:, 11) ... 19 | signals_limpias(:, 13) signals_limpias(:, 18)]; 20 | 21 | c3_laplace = signals_limpias(:, 8) - mean(c3_vecinos, 2); 22 | c4_laplace = signals_limpias(:, 12) - mean(c4_vecinos, 2); 23 | 24 | laplace_c3_c4 = [c3_laplace c4_laplace]; 25 | 26 | %cambiar el 01 por el numero de sujeto y revisar si es T o E 27 | %save('LaplaceA09E.mat','laplace_c3_c4'); 28 | 29 | % % Esto es para graficar la diferencia de la senal 30 | % c4 = signals_limpias(2000:3000,12); 31 | % plot(c4,'LineWidth',1); 32 | % hold on 33 | % c4_nuevo = c4_laplace(2000:3000); 34 | % plot(c4_nuevo,'LineWidth',1); 35 | % grid; 36 | % xlabel('Time'); 37 | % ylabel('Amplitude'); 38 | % legend('C4','C4 Filter Laplacian'); 39 | % hold off -------------------------------------------------------------------------------- /ReemplazarNaNFiltroMediana.m: -------------------------------------------------------------------------------- 1 | %Edgar Moises Hernandez-Gonzalez 2 | %05/11/19-28/06/20 3 | %Reemplazar NaN por mediana de todo el canal 4 | %Input Shape: 288000x22 5 | %Output Shape: 288000x22 6 | 7 | clear 8 | clc 9 | 10 | %cambiar el 01 por el numero de sujeto y revisar si es T o E 11 | load('MotorImageryA09E.mat'); 12 | 13 | signals_limpias = zeros(size(signals)); 14 | contador = 1; 15 | n_muestras_nan = 0; 16 | for i=1:288 17 | muestra = signals(contador:contador+999,:); 18 | % si hay un NaN 19 | if sum(sum(isnan(muestra))) > 0 20 | % filtro mediana 21 | y = medfilt1(muestra,255,'omitnan'); 22 | % figure; 23 | % plot(muestra); 24 | % grid; 25 | % reemplazar NaN por los valores del filtro mediana 26 | muestra(isnan(muestra)) = y(isnan(muestra)); 27 | % figure; 28 | % plot(muestra); 29 | % grid; 30 | signals_limpias(contador:contador+999, :) = muestra; 31 | n_muestras_nan = n_muestras_nan + 1; 32 | disp('Muestra numero'); 33 | disp(i); 34 | else 35 | signals_limpias(contador:contador+999, :) = signals(contador:contador+999, :); 36 | end 37 | contador = contador + 1000; 38 | end 39 | disp('Numero de muestras NaN'); 40 | disp(n_muestras_nan); 41 | %cambiar el 01 por el numero de sujeto y revisar si es T o E 42 | save('LimpiosA09E.mat','signals_limpias'); -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Preprocesamiento-BCI-IV-2a 2 | ## El preprocesamiento es el siguiente: 3 | Subconjunto4segMI.m --> ReemplazarNaNFiltroMediana.m --> CAR.m o FiltroLaplaciano.m --> FiltroPasaBanda.m --> AcomodarDatos.m 4 | 5 | ### Subconjunto4segMI.m 6 | Obtener el segmento de 4 segundos de imaginación motora en EEG (del 2 al 6) 7 | * Input: (AxxX.gdf) 8 | * Output: (MotorImageryAxxX.mat) donde estan los 4seg de MI-EEG, 288 muestras de 22 canales 4seg a 250Hz 9 | * Input Shape: todox25 10 | * Output Shape: 288000x22 11 | 12 | Se necesita ejecutar biosig_installer.m 13 | 14 | ### ReemplazarNaNFiltroMediana.m 15 | Reemplazar NaN por los valores obtenidos con el filtro mediana de orden 255 16 | * Input: (MotorImageryAxxX.mat) 17 | * Output: (LimpiosAxxX.mat) 18 | * Input Shape: 288000x22 19 | * Output Shape: 288000x22 20 | 21 | ### CAR.m 22 | Referencia CAR (common average reference) 23 | * Input: (LimpiosAxxX.mat) 24 | * Output: (CarAxxX.mat) 25 | * Input shape: 288000x22 26 | * Output shape: 288000x22 27 | 28 | ### FiltroLaplaciano.m 29 | Referenciar con filtro espacial laplaciano para los canales C3 y C4 30 | * Input: (LimpiosAxxX.mat) 31 | * Output: (LaplaceAxxX.mat) 32 | * Input shape: 288000x22 33 | * Output shape: 288000x2 34 | 35 | ### FiltroPasaBanda.m 36 | Filtro pasa banda de 8Hz-30Hz 37 | * Input: (CarAxxX.mat) 38 | * Output: (FiltradasAxxX.mat) 39 | * Input shape: 288000x22 40 | * Output shape: 288000x22 41 | 42 | ### AcomodarDatos.m 43 | Acomodar los datos para que queden concatenados los canales [n_muestras, n_canales] 44 | * Input: (FiltradasxxX.mat) 45 | * Output: (MI-EEG-AxxX.csv) es para el entrenamiento de los modelos 46 | * Output: (MI-EEG-AxxX.mat) es para DWT y para la clasificacion binaria 47 | * Input shape: 288000x22 48 | * Output shape: 288x22000 49 | 50 | Las filas son el numero de muestras (288) y las columnas son los 4 seg de los 22 canales concatenados (22000) 51 | 52 | ### AcomodarDatosLaplace.m 53 | Acomodar los datos para que queden concatenados los canales [n_muestras, n_canales] 54 | * Input: (FiltraLaplaceAxxX.mat) 55 | * Output: (MI-EEG-Laplace-AxxX.csv) es para el entrenamiento de los modelos 56 | * Output: (MI-EEG-Laplace-AxxX.mat) es para DWT y para la clasificacion binaria 57 | * Input shape: 288000x2 58 | * Output shape: 288x2000 59 | 60 | Las filas son el numero de muestras (288) y las columnas son los 4 seg de los 2 canales concatenados (2000) 61 | 62 | ### AcomodarDatosBinaria.m 63 | Acomodar los datos para que queden concatenados los canales [n_muestras, n_canales], solo se utilizaron las clases mano izquierda y mano derecha 64 | * Input: (MI-EEG-AxxX.mat), (AxxX.mat) 65 | * Output: (MI-EEG-ID-AxxX.csv) es para el entrenamiento de los modelos, (Etiquetas-ID-AxxX.csv) 66 | * Input shape: 288x22000 67 | * Output shape: 144x22000 68 | 69 | Las filas son el numero de muestras (144) y las columnas son los 4 seg de los 22 canales concatenados (22000) 70 | 71 | ### RWE_DWT_Multinivel.m 72 | RWE con DWT de dos niveles de descompisicion usando DWT-db4 73 | * Input: (MI-EEG-AxxX.mat) 74 | * Output: (MI-EEG-RWE-A01E.csv) 75 | * Input shape: 288x22000 76 | * Output shape: 288x66 77 | 78 | ### Alfa_DWT_C3_C4.m 79 | Alfa de C3 y C4 con DWT-db4 de dos niveles de descomposición 80 | * Input: (MI-EEG-AxxX.mat) 81 | * Output: (MI-EEG-Alfa-AxxX.csv) 82 | * Input shape: 288x22000 83 | * Output shape: 288x510 84 | 85 | ### DWTCoeficientes.m 86 | Obtener los coeficientes de aproximacion y de detalle con DWT-db4 con 2 niveles de descomposicion 87 | * Input: (MI-EEG-AxxX.mat) 88 | * Output: (MI-EEG-DWT-Coef-AxxX.csv) 89 | * Input shape: 288x22000 90 | * Output shape: 288x22286 91 | 92 | #### Otros archivos que no se utilizan 93 | * ContarNaN.m 94 | * Filtro32Hz.m 95 | * PruebasFFT.m 96 | * ReemplazarNaNPruebas.m 97 | * Ventaneo.m --------------------------------------------------------------------------------