GRAFICAR MATRIZ DE DATOS ACUSTICOS EN MATLAB

Download PDF

Trabajar con datos acústicos provenientes de ecogramas, sonogramas, modelaciones acústicas, mediciones de ruido, entre otras, usualmente implica graficar estos datos de forma ordenada, de modo que puedan proyectarse los valores sobre el espacio asociado los valores del sonido / ruido. Estos datos pueden representar valores expresados en decibeles o lineales de diversas magnitudes fisicas usadas en acustica, como Niveles de Presion Sonora (Acustica ambiental / Control de ruido), Coeficientes de dispersión volumétrica (Acústica pesquera / Hidroacústica), velocidad de partícula (Vibroacustica / Geoacustica), por citar algunas.

MATLAB ofrece algunas funciones para graficar que pueden ser útiles para los fines descritos como por ejemplo

1.- pcolor()
2.- surf()
3.- image()

si se intenta graficar una matriz de datos acusticos con las funciones pcolor o surf, el resultado graficado por algun motivo no incluye todos los datos. Si desea graficar una matriz A de dimensiones m x n solo se representaran datos A(1:(m-1),1:(n-1)). En contraposicion a lo anterior la funcion image grafica todos los datos correlacionando su posicion en las coordenadas de la matriz sobre un sistema cartesiano donde se representa con un rectangulo centrado en la posicion mencionada. Considerando que resulta de utilidad en algunas ocasiones ubicar el vertice del elemento m=1,n=1 con el origen del sistema cartesiano, en el siguiente codigo se utiliza la funcion image con algunos trucos para lograr esta correspondencia y asi facilitar la visualizacion de la data.

En el siguiente ejemplo se implementa un código en MATLAB para graficar una matriz de datos acusticos, que básicamente toma la matriz de datos y la superpone sobre una cuadricula. Se tiene especial cuidad en hacer coincidir los sistemas de referencia de la matriz y el de ejes cartesianos, como asi tambien la disposicion visual de la data para mejorar la didactica del tratamiento de la informacion de los acusticos.

%% LIMPIAR
clear;
clc;
close all;

%% GENERANDO MATRIZ ALEATORIA
dim_ale= 7; %dimension aleatoria
zq = floor(10*rand(dim_ale,dim_ale));


%% GRAFICANDO MATRIZ DE DATOS

extra=dim_ale+5;          % para que la visualizacion de los datos tenga un poco mas de espacio visual
axis([-1 extra -1 extra]) % los limites de la matriz

ax = gca;
ax.XTick = -1:1:extra;       % se define un dominio apropiado para el eje x
ax.YTick = -1:1:extra;       % se define un dominio apropiado para el eje y

title('GRAFICO DE DATOS ACUSTICOS')
xlabel('eje x')  % etiqueta para el nombre del eje x
ylabel('eje y')  % etiqueta para el nombre del eje x

hold on          % para que los elementos graficos se sobrepongan
grid on          % para mostrar la cuadricula
axis ij          % para dar vuelta los ejes (esto es util cuando los datos representan profundidad)
colorbar;        % para que aparezca la escala de colores
%shading faceted % para apagar los bordes sombreados de los datos

%% GRAFICANDO EL GRILLADO
[p q]=size(zq);

% para graficar los datos
desf=-0.5;          % para desplazar los datos a una posicion de correspondencia (m,n) en la matriz y (x,y) en el eje cartesiano mas apropiada
xx=[1+desf:dim_ale+desf];
yy=[1+desf:dim_ale+desf];
C=image(xx,yy,zq);
C.AlphaData = 1;    % segun la ayuda asi se grafica image(x,y,C)

xxx=[0:p];
yyy=[0:q];

[X,Y] = meshgrid(xxx,yyy)
grillado=[zeros(p+1,q+1)]
D=mesh(X,Y,grillado);
D.EdgeColor =[0 0 0]        % para definir el color del grillado
D.FaceColor = 'none';       % para que el grillado sea transparente


%% MEJORAS

%para definir una escala de colores personalizada
mymap = [1   1   1;
         0.5 0   0;
         1   0   0;
         0   0.5 0;
         0   1   0;
         0   0   0.5;
         0   0   1;
         0.5 0.5 0.5;
         0.8 0.8 0.8;
         0   0   0];
     
colormap(mymap);
 
daspect([1 1 1]); % para mantener la relacion 1:1 al ampliar la ventana

print(figure(1),'imagen_de_datos','-dpng') % para guardar una imagen png

%publish('genera_matriz.m'); % para guardar una version html del codigo (se debe ejecutar esta linea posterior a la ejecucion del codigo)

El resultado obtenido se muestra en el siguiente gráfico de datos acústicos

Trabajos futuros:

  • Definir una escala de colores que represente de mejor forma el comportamiento dinamico de la data acústica, expresada linealmente o en decibeles.
  • Superponer una imagen para poder crear mapas de ruido, correlacionando espacialmente los datos acústicos.
  • Superponer poligonos y separar los datos interiores y exteriores a este, creando así capas con la data acustica.
  • Generar datos acusticos basado en modelos de propagación de sonido en exteriores.

*ACTUALIZACION

%% LIMPIAR
clear;
clc;
close all;

%% GENERANDO LOS DATOS DE LA MATRIZ
dim_ale= 8; %dimension aleatoria
%zq = floor(10*rand(dim_ale,dim_ale));

zq=repmat([-32 -35 -38 -41 -44 -47 -50 -53],dim_ale,1);
zq(1,1)=-2;
zq(2,1)=-1;
zq(3,1)=0;
zq(4,1)=-2.5;
zq(5,1)=9;
zq(6,1)=10;
zq(7,1)=11;
zq(8,1)=-70;

%% GRAFICANDO MATRIZ DE DATOS

extra=dim_ale+5;          % para que la visualizacion de los datos tenga un poco mas de espacio visual
axis([-1 extra -1 extra]) % los limites de la matriz

ax = gca;
ax.XTick = -1:1:extra;       % se define un dominio apropiado para el eje x
ax.YTick = -1:1:extra;       % se define un dominio apropiado para el eje y

title('GRAFICO DE DATOS ACUSTICOS')
xlabel('eje x')  % etiqueta para el nombre del eje x
ylabel('eje y')  % etiqueta para el nombre del eje x

hold on          % para que los elementos graficos se sobrepongan
grid on          % para mostrar la cuadricula
axis ij          % para dar vuelta los ejes (esto es util cuando los datos representan profundidad)
cbr=colorbar;        % para que aparezca la escala de colores
%colorbar('Ticks',[-5,-2,1,4,7],...
%         'TickLabels',{'Cold','Cool','Neutral','Warm','Hot
%set(cbr,'YTickLabel',{'20','22','24','26',[...],'50'}) % NOTESE esta nomenclatura [...]
%shading faceted % para apagar los bordes sombreados de los datos

%colorbar('Ticks',[-5,-2,1,4,7],...

% set(cbr,'YTickLabel',{[1:2:14]}) % para poner una etiquetas correlativas

[p q]=size(zq);

% para graficar los datos
desf=-0.5;                        % para desplazar los datos a una posicion de correspondencia (m,n) en la matriz y (x,y) en el eje cartesiano mas apropiada
xx=[1+desf:dim_ale+desf];
yy=[1+desf:dim_ale+desf];

C=imagesc(xx,yy,zq);
%lims=[min(min(zq))-1 max(max(zq))+1]; % se definenen los limites para que todos los graficos queden con la misma asignacion de colores
% como son 13 los colores la longitud del intervalo definido por los
% limites debe ser multiplo de 13

colores_definidos=13; % fijo 13 segun paleta de colores deseada
razon=3; %fijo 3
longitud_intervalo=colores_definidos*razon;
limite_referencia=-65;
lim_inf=limite_referencia-3; % se fija en este valor por el tipo de dato acustico
lim_sup=longitud_intervalo + lim_inf;

%% SETEANDO LA ESCALA DE COLORES CADA 3 UNIDADES
%numero_de_etiquetas=colores_definidos+1; % forma alternativa de setear colores
%set(cbr, 'YTick', linspace(lim_inf, lim_sup, numero_de_etiquetas));
set(cbr,'YTick',[lim_inf:3:lim_sup])

lims=[lim_inf lim_sup]; % se definenen los limites para que todos los graficos queden con la misma asignacion de colores
caxis(lims);
C.AlphaData = 1;                  % segun la ayuda asi se grafica image(x,y,C)

%% CAMBIANDO EL COLOR DE FONDO
fig = gcf;
fig.Color = [1 1 1]

%% GRAFICANDO EL GRILLADO
xxx=[0:p];
yyy=[0:q];

[X,Y] = meshgrid(xxx,yyy)
grillado=[zeros(p+1,q+1)]
D=mesh(X,Y,grillado);
D.EdgeColor =[0 0 0];             % para definir el color del grillado
D.FaceColor = 'none';             % para que el grillado sea transparente


%% MEJORAS

%para definir una escala de colores personalizada
mymap = [
        1   1   1       % color 1
        0.6	0.6	0.6     % color 2
        0.4	0.4	0.4     % color 3
        0	0	1       % color 4
        0	0	0.5     % color 5
        0	0.7	0       % color 6
        0	0.5	0       % color 7
        1	1	0       % color 8
        1	0.5	0       % color 9
        1	0	0.7     % color 10
        1	0	0       % color 11
        0.7	0.3	0.2     % color 12
        0.5	0.2	0.2     % color 13
        ];
     
colormap(mymap);
daspect([1 1 1]);                          % para mantener la relacion 1:1 al ampliar la ventana
print(figure(1),'imagen_de_datos','-dpng') % para guardar una imagen png

[xq yq]=meshgrid([0:dim_ale],[0:dim_ale]); %MATRIZ DE PUNTOS CORRELACIONADOS COMO PARES ORDENADOS DESDE 1,1 HASTA 10,10

%% ESCRIBIENDO TEXTO SOBRE LAS CELDAS DE LA MATRIZ
desfx=-0.9;
desfy=-0.5;
        
for j=1:dim_ale
    for k=1:dim_ale
    %palabra=[num2str(k) num2str(j)];
    palabra=[num2str(zq(k,j))];
    texto=text(j+desfx,k+desfy,palabra);
    texto.FontSize = 8;
    end
end

The following two tabs change content below.

LEONARDO PARADA VALENCIA

INGENIERO ACÚSTICO EXPERTO EN DISEÑO SONORO Y MÚSICA PARA VIDEOJUEGOS