%% Affichage du niveau moyen des micros acquis par le système d'acquisition Mµ256-Haikus
% février 2026
% On suppose que les données ont été acquises correctement (en terme de
% nombre d'octets), en format int32, avec éventuellement le compteur A
% Dans les affichages, la numérotation commence à 0
clear all
close all
%% VALEURS A ADAPTER
name = 'test1';
Sens_dB  = - 15.1;      % Sensibilité des micros (1 digit = -15.1dB)
aff_HAIKUS = true;      % affichage matriciel 16x16 pour système Haikus, par faisceaux sinon

%% Lecture de l'en-tête
name_en_tete = strcat(name, ".mu");
fid = fopen(name_en_tete,'rb');
header.annee = fread(fid,1,'uint16');
header.mois = fread(fid,1,'uint16');
header.jour_semaine = fread(fid,1,'uint16');
header.jour = fread(fid,1,'uint16');
header.heure = fread(fid,1,'uint16');
header.minute = fread(fid,1,'uint16');
header.seconde = fread(fid,1,'uint16');
header.ms = fread(fid,1,'uint16');
header.micros = fread(fid,1024,'uint8');
header.VA = fread(fid,16,'uint8');
header.compteurs = fread(fid,4,'uint8');
header.frequence = fread(fid,1,'single');
header.nb_ech = fread(fid,1,'uint32');
header.duree = fread(fid,1,'single');
header.type = fread(fid,1,'uint8');
header.commentaires = fread(fid,1024,'*char');
fclose(fid);
if (header.type ~= 0)
    disp('Les données ne sont pas en format Int32')
    return    
end
%%  Lecture données
nb_compteursBCD = sum(header.compteurs(2:4));
nb_VA = sum(header.VA);
nb_micros =  sum(header.micros);
nb_voies = nb_micros + nb_VA + header.compteurs(1);
%if (nb_micros ~= 256 )
%    disp('Nombre de micros acquis différent de 256 : utilisez Megamicros_niveau.m (' + string(nb_micros) + ' MEMS)');
%    return
%end
if (nb_compteursBCD > 0)
    disp('Présence de compteur(s) B, C, D. Enregistrement à refaire !');
    return
end
if (nb_micros == 0)
    disp('Pas de micro acquis. Enregistrement à refaire !');
    return
end

nb_ech = header.nb_ech;
name_dat = strcat(name,'.dat');
fid = fopen(name_dat,'rb');
mat=fread(fid,nb_ech*nb_voies,'*int32');
fclose(fid);
Fe = header.frequence;     % freq echant. en Hz
mat=reshape(mat,nb_voies,[]);
% Elimination du compteur A
if (header.compteurs(1) == 1)
    mat = mat(2:end,:);
    nb_voies = nb_voies - 1;
end
%% Détermination du niveau moyen sur chaque voie acquise
y_rms = zeros(1,nb_voies);  
for num=1:nb_voies
    y = mat(num,:);
    y_rms(num) = 10 * log10(1+mean(y.^2)) + Sens_dB;
end

%% Elimination des voies analogiques
% Construction du tableau de micros
%level = zeros(1,256);
level = y_rms(1:nb_micros);

%% Affichage des niveaux
scrsz = get(0,'ScreenSize');    %détermination de la taille de l'écran
fen_aff = [scrsz(3)/8 scrsz(4)/8 3*scrsz(3)/4 3*scrsz(4)/4];
figure('Position',fen_aff,'NumberTitle','off','Name','Niveau des micros','Color','White');
title(name)
plot(0:nb_micros-1,level(1:nb_micros));
set(gca,'FontName','Century Gothic','FontSize',14);
xlabel('Micro');
ylabel('Niveau (dB)');

if (aff_HAIKUS)
    %% Affichage bidim dans l'ordre des colonnes 16 MEMS
    % En partant d'en bas à gauche en suivant l'orientation flux 
    A = reshape(level,16,[]);
    nb_col = ceil(nb_micros/16);
    figure('Position',fen_aff,'NumberTitle','off','Name','Niveau des micros','Color','White');
    imagesc([0 nb_col-1],[0 15],A(:,1:nb_col));
    set(gca,'FontName','Century Gothic','FontSize',14);
    xlabel('Colonnes');
    ylabel('Micro (Lignes)');
    axis xy;
    c = colorbar;
    c.Label.String = 'dB';
else
    %% Affichage par faisceaux de 8 MEMS
    % Reshape and plot the data for 8 MEMS beams
    A = reshape(level, 8, []);
    nb_beams = ceil(nb_micros / 8);
    figure('Position', fen_aff, 'NumberTitle', 'off', 'Name', 'Niveau des faisceaux de MEMS', 'Color', 'White');
    imagesc([0 nb_beams-1], [0 7], A(:, 1:nb_beams));
    set(gca, 'FontName', 'Century Gothic', 'FontSize', 14);
    xlabel('Faisceaux');
    ylabel('Micro (Lignes)');
    axis xy;
    colorbar;
end
