Matlab - MatLab AppDeveloper

 
Vista:

MatLab AppDeveloper

Publicado por Miguel A Rivera (3 intervenciones) el 22/02/2021 21:20:47
Hola a todos,
Estoy programando una GUI en MatLab para una clase mía. La intención es trazar los datos leídos y guardados previamente desde un sensor en los UIAxes. Tengo 3 UIAxes, cada uno de ellos para una variable (Aceleración, Campo Magnético y Tasas). En los 3, el eje X es el tiempo.
Los datos ruidosos se muestran en los UIAxes y cuando los fltro, se filtran pero los datos ruidosos desaparecen.
Me gustaría mostrar tanto los datos ruidosos como los filtrados en mis UIAxes para poder compararlos.
Ya lo probé usando un botón 'Filtro' o un Slider, pero no funciona. Los datos originales siempre se reemplazan por los filtrados.
¿Cómo puedo mostrar tanto los datos filtrados como los no filtrados a la vez, usando el botón 'Filtro' o el Slider? Realmente no tengo ni idea de cómo solucionarlo. A continuación encontrará los códigos que escribí y el archivo. Gracias de antemano.
El código del plot es :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
File =  evalin('base','File');
Directory2 = evalin('base','Directory2');
S = load([Directory2,File]);
app.Accel = [S.accel];
app.Time = [S.time];
plot(app.UIAxes, [S.time],[S.accel]);
 
S = load([Directory2,File]);
app.Mag_field = [S.mag_field];
app.Time = [S.time];
plot(app.UIAxes2, [S.time],[S.mag_field]);
app.Mag_field = S;
 
S = load([Directory2,File]);
app.Rates = [S.rates];
app.Time = [S.time];
plot(app.UIAxes3, [S.time],[S.rates]);
app.Rates = S;

El código del botón de Filtrar es:

1
2
3
4
5
6
windowSize = 5;
b = (1/windowSize)*ones(1,windowSize);
a = 1;
for i=1:numel(app.UIAxes.Children)
    app.UIAxes.Children(i).YData = filter(b, a, app.UIAxes.Children(i).YData);
end

Y el del Slider:

1
2
3
4
5
6
value = event.Value;
smoothingdata = smooth(app.Time, app.Accel, value);
plot(app.UIAxes, app.Accel, app.Time);
hold(app.UIAxes, "on");
plot(app.UIAxes, app.Accel, smoothingdata);
hold(app.UIAxes, "off");
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Jon
Val: 354
Ha aumentado 1 puesto en Matlab (en relación al último mes)
Gráfica de Matlab

MatLab AppDeveloper

Publicado por Jon (161 intervenciones) el 23/02/2021 08:43:29
Buenos días Miguel,

Yo haría algo así. Puedes mantener el gráfico de origen con el comando hold.

Activaría la variable global app.BotonFiltradoPulsado (poner a 1) en su correspondiente Callback cuando cambie de valor. Recuerda que dicha variable se debe declarar en "properties (Access = public)".

1
2
3
4
5
6
7
8
9
fig = app.UIAxes;
handle(fig);
plot(fig, t, y);
if (app.BotonFiltradoPulsado)
    hold(fig,'on');
    plot(fig, t, y_filtrado);
end
grid(fig,'on');
legend(fig,'Original','Filtrado');

Espero que te sirva de ayuda.

Un saludo,

Jon
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

MatLab AppDeveloper

Publicado por Miguel A Rivera (3 intervenciones) el 23/02/2021 15:02:42
Hola Jon,

Muchas gracias por tu ayuda. Al momento todo perfecto, pero cuando le doy click al botón de Filter, me dice que hay un en la parte de “if (app.FilterButton_3)

El error es:

“Conversion to logical from matlab.ui.control.Button is not possible”

Sabrás cómo resolverlo?

Saludos y gracias.

Miguel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jon
Val: 354
Ha aumentado 1 puesto en Matlab (en relación al último mes)
Gráfica de Matlab

MatLab AppDeveloper

Publicado por Jon (161 intervenciones) el 24/02/2021 08:48:53
Buenos días Miguel,

Veo que has utilizado la variable del propio botón para la condición. Yo lo que te proponía era utilizar una variable de proceso: una variable definida por ti, activada cuando el botón sea pulsado y consultada en la condición.

Para ello, debes seguir los siguientes pasos:

1) Crea una propiedad pública
PublicProperty

2) Declara la variable de proceso e inicialízala a 0
PublicProperty_VariableDeclaration

3) Activa la variable (poner a 1) de proceso cuando el botón sea pulsado (en su correspondiente Callback)
ActivateProcessVariable

4) Consulta la variable de proceso a la hora de graficar
1
2
3
4
5
6
7
8
9
fig = app.UIAxes;
handle(fig);
plot(fig, t, y);
if (app.BotonFiltradoPulsado)
    hold(fig,'on');
    plot(fig, t, y_filtrado);
end
grid(fig,'on');
legend(fig,'Original','Filtrado');

Espero que con los pasos previos puedas resolver el problema.

Un saludo,

Jon
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

MatLab AppDeveloper

Publicado por Miguel A Rivera (3 intervenciones) el 24/02/2021 14:15:35
Hola Jon,

Muchas gracias por tu ayuda!

Hasta ahora todo bien, parece que quiere funcionar.

En la línea: plot(app.UIAxes2, t, y);

aparece el siguiente error: Error using plot. There is no accel property on the Line class.

t la definí t = app.Time e y la definí y = app.Mag_field

Espero no sea molestia.

Saludos,

Miguel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jon
Val: 354
Ha aumentado 1 puesto en Matlab (en relación al último mes)
Gráfica de Matlab

MatLab AppDeveloper

Publicado por Jon (161 intervenciones) el 25/02/2021 08:36:27
Buenos días Miguel,

La verdad es que no sé porqué puede ser.

Repasa de dónde vienen app.Time y app.Mag_field por si hace falta poner app.Time.Value y app.Mag_field.Value.

Si no consigues solucionar el problema, envíame el archivo por correo y le echo un vistazo cuando pueda.

Un saludo,

Jon

[email protected]
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar