classdef Porovnavani < handle

  properties
        File
        PathName
        baseFs
        baseY
        yT
        player
        axesA
        axesB
        axesC
        axesD
        axesE
        axesF
        axesG
        axesH
    end

   methods 
       function obj = Porovnavani(file, pathName)
                    obj.File = file;
                    obj.PathName = pathName;
                    [obj.baseY, obj.baseFs] = audioread(fullfile(pathName, file));
                    obj.setYT(obj.baseY);

                   disp(['User selected', fullfile(pathName, file)]);
        end
        
        function r = getFileName(obj)
                    [~, name, ext] = fileparts(fullfile(obj.PathName, obj.File));
                    r = strjoin({name, ext});
        end

        function obj = setFs(obj, Fs)
            obj.Fs = Fs;
        end

        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        % Porovnávání načteného záznamu s databází
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        function r = compareA(obj) 
         Audio1 = obj.baseY; % Pro přehlednost sjednocení názvu s názvem z databáze
         Fs1 = obj.baseFs;
         [Audio2, Fs2] = audioread('Database/Cello.wav'); % Výběr 1. nástroje z databáze
         
         % Převod na jednokanálové signály
         Audio1 = Audio1(:, 1);
         Audio2 = Audio2(:, 1);
         
         % Přizpůsobení vzorkovací frekvence
         desiredFs = 44100; % Požadovaná vzorkovací frekvence
         audio1_resampled = resample(Audio1, desiredFs, Fs1);
         audio2_resampled = resample(Audio2, desiredFs, Fs2);
         
         % Normalizace amplitudy
         audio1_normalized = audio1_resampled / max(abs(audio1_resampled));
         audio2_normalized = audio2_resampled / max(abs(audio2_resampled));
         
         % Časová osa
         duration = length(audio1_normalized) / desiredFs;
         t = 0:1/desiredFs:duration-1/desiredFs;
         
         % Výpočet kmitočtového spektra
         N = length(audio1_normalized);
         frequencies = (0:N-1)*(desiredFs/N);
         
         fft_audio1 = abs(fft(audio1_normalized)/N);
         fft_audio2 = abs(fft(audio2_normalized)/N);
         
                % Vykreslení kmitočtového spektra
                N = length(Audio2); % délka signálu
                f = (0:N-1)*(Fs2/N); % vypočtení kmitočtů pro každý vzorek signálu
                Y = fft(Audio2)/N; % Fourierova transformace
                
                % Výpočet amplitud a frekvencí
                amplitude = 2*abs(Y(1:N/2+1));
                frequency = f(1:N/2+1);
                
                % Zobrazení signálu v grafu
                plot(obj.axesA,frequency, amplitude);
                obj.axesA.XScale = 'log'; % Nastavení osy x na logaritmickou
                obj.axesA.XTick = [10 100 1000 10000]; % Hodnoty na ose x

         % Výpočet korelační funkce
         corr_result = xcorr(fft_audio1, fft_audio2);
         correlation = max(corr_result) / sqrt(sum(fft_audio1.^2) * sum(fft_audio2.^2));
         
         % Výpis podobnosti kmitočtových spekter porovnávaných signálů v procentech
         similarity = correlation * 100;
         r = similarity;
        end

        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        function r = compareB(obj)
         Audio1 = obj.baseY;
         Fs1 = obj.baseFs;
         [Audio2, Fs2] = audioread('Database/Crash.wav'); % Výběr 2. nástroje z databáze
         
         % Převod na jednokanálové signály
         Audio1 = Audio1(:, 1);
         Audio2 = Audio2(:, 1);
         
         % Přizpůsobení vzorkovací frekvence
         desiredFs = 44100; % Požadovaná vzorkovací frekvence
         audio1_resampled = resample(Audio1, desiredFs, Fs1);
         audio2_resampled = resample(Audio2, desiredFs, Fs2);
         
         % Normalizace amplitudy
         audio1_normalized = audio1_resampled / max(abs(audio1_resampled));
         audio2_normalized = audio2_resampled / max(abs(audio2_resampled));
         
         % Časová osa
         duration = length(audio1_normalized) / desiredFs;
         t = 0:1/desiredFs:duration-1/desiredFs;
         
         % Výpočet kmitočtového spektra
         N = length(audio1_normalized);
         frequencies = (0:N-1)*(desiredFs/N);
         
         fft_audio1 = abs(fft(audio1_normalized)/N);
         fft_audio2 = abs(fft(audio2_normalized)/N);
         
                % Vykreslení kmitočtového spektra
                N = length(Audio2); % délka signálu
                f = (0:N-1)*(Fs2/N); % vypočtení kmitočtů pro každý vzorek signálu
                Y = fft(Audio2)/N; % Fourierova transformace
                
                % Výpočet amplitud a frekvencí
                amplitude = 2*abs(Y(1:N/2+1));
                frequency = f(1:N/2+1);
                
                % Zobrazení signálu v grafu
                plot(obj.axesB,frequency, amplitude);
                obj.axesB.XScale = 'log';
                obj.axesB.XTick = [10 100 1000 10000];

         % Výpočet korelační funkce
         corr_result = xcorr(fft_audio1, fft_audio2);
         correlation = max(corr_result) / sqrt(sum(fft_audio1.^2) * sum(fft_audio2.^2));
         
         %Výpis podobnosti kmitočtových spekter porovnávaných signálů v procentech
         similarity = correlation * 100;
         r = similarity;
        end

        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        function r = compareC(obj)
         Audio1 = obj.baseY;
         Fs1 = obj.baseFs;
         [Audio2, Fs2] = audioread('Database/Klarinet.wav'); % Výběr 3. nástroje z databáze
         
         % Převod na jednokanálové signály
         Audio1 = Audio1(:, 1);
         Audio2 = Audio2(:, 1);
         
         % Přizpůsobení vzorkovací frekvence
         desiredFs = 44100; % Požadovaná vzorkovací frekvence
         audio1_resampled = resample(Audio1, desiredFs, Fs1);
         audio2_resampled = resample(Audio2, desiredFs, Fs2);
         
         % Normalizace amplitudy
         audio1_normalized = audio1_resampled / max(abs(audio1_resampled));
         audio2_normalized = audio2_resampled / max(abs(audio2_resampled));
         
         % Časová osa
         duration = length(audio1_normalized) / desiredFs;
         t = 0:1/desiredFs:duration-1/desiredFs;
         
         % Výpočet kmitočtového spektra
         N = length(audio1_normalized);
         frequencies = (0:N-1)*(desiredFs/N);
         
         fft_audio1 = abs(fft(audio1_normalized)/N);
         fft_audio2 = abs(fft(audio2_normalized)/N);

                % Vykreslení kmitočtového spektra
                N = length(Audio2); % délka signálu
                f = (0:N-1)*(Fs2/N); % vypočtení kmitočtů pro každý vzorek signálu
                Y = fft(Audio2)/N; % Fourierova transformace
                
                % Výpočet amplitud a frekvencí
                amplitude = 2*abs(Y(1:N/2+1));
                frequency = f(1:N/2+1);
                
                % Zobrazení signálu v grafu
                plot(obj.axesC,frequency, amplitude);
                obj.axesC.XScale = 'log';
                obj.axesC.XTick = [10 100 1000 10000];

         % Výpočet korelační funkce
         corr_result = xcorr(fft_audio1, fft_audio2);
         correlation = max(corr_result) / sqrt(sum(fft_audio1.^2) * sum(fft_audio2.^2));
         
         %Výpis podobnosti kmitočtových spekter porovnávaných signálů v procentech
         similarity = correlation * 100;
         r = similarity;
        end

        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        function r = compareD(obj)
         Audio1 = obj.baseY;
         Fs1 = obj.baseFs;
         [Audio2, Fs2] = audioread('Database/Kytara.wav'); % Výběr 4. nástroje z databáze
         
         % Převod na jednokanálové signály
         Audio1 = Audio1(:, 1);
         Audio2 = Audio2(:, 1);
         
         % Přizpůsobení vzorkovací frekvence
         desiredFs = 44100; % Požadovaná vzorkovací frekvence
         audio1_resampled = resample(Audio1, desiredFs, Fs1);
         audio2_resampled = resample(Audio2, desiredFs, Fs2);
         
         % Normalizace amplitudy
         audio1_normalized = audio1_resampled / max(abs(audio1_resampled));
         audio2_normalized = audio2_resampled / max(abs(audio2_resampled));
         
         % Časová osa
         duration = length(audio1_normalized) / desiredFs;
         t = 0:1/desiredFs:duration-1/desiredFs;
         
         % Výpočet kmitočtového spektra
         N = length(audio1_normalized);
         frequencies = (0:N-1)*(desiredFs/N);
         
         fft_audio1 = abs(fft(audio1_normalized)/N);
         fft_audio2 = abs(fft(audio2_normalized)/N);
         
                % Vykreslení kmitočtového spektra
                N = length(Audio2); % délka signálu
                f = (0:N-1)*(Fs2/N); % vypočtení kmitočtů pro každý vzorek signálu
                Y = fft(Audio2)/N; % Fourierova transformace
                
                % Výpočet amplitud a frekvencí
                amplitude = 2*abs(Y(1:N/2+1));
                frequency = f(1:N/2+1);
                
                % Zobrazení signálu v grafu
                plot(obj.axesD,frequency, amplitude);
                obj.axesD.XScale = 'log';
                obj.axesD.XTick = [10 100 1000 10000];


         % Výpočet korelační funkce
         corr_result = xcorr(fft_audio1, fft_audio2);
         correlation = max(corr_result) / sqrt(sum(fft_audio1.^2) * sum(fft_audio2.^2));
         
         % Výpis podobnosti kmitočtových spekter porovnávaných signálů v procentech
         similarity = correlation * 100;
         r = similarity;
        end

        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        function r = compareE(obj)
         Audio1 = obj.baseY;
         Fs1 = obj.baseFs;
         [Audio2, Fs2] = audioread('Database/Piano.wav'); % Výběr 5. nástroje z databáze
         
         % Převod na jednokanálové signály
         Audio1 = Audio1(:, 1);
         Audio2 = Audio2(:, 1);
         
         % Přizpůsobení vzorkovací frekvence
         desiredFs = 44100; % Požadovaná vzorkovací frekvence
         audio1_resampled = resample(Audio1, desiredFs, Fs1);
         audio2_resampled = resample(Audio2, desiredFs, Fs2);
         
         % Normalizace amplitudy
         audio1_normalized = audio1_resampled / max(abs(audio1_resampled));
         audio2_normalized = audio2_resampled / max(abs(audio2_resampled));
         
         % Časová osa
         duration = length(audio1_normalized) / desiredFs;
         t = 0:1/desiredFs:duration-1/desiredFs;
         
         % Výpočet kmitočtového spektra
         N = length(audio1_normalized);
         frequencies = (0:N-1)*(desiredFs/N);
         
         fft_audio1 = abs(fft(audio1_normalized)/N);
         fft_audio2 = abs(fft(audio2_normalized)/N);
         
                % Vykreslení kmitočtového spektra
                N = length(Audio2); % délka signálu
                f = (0:N-1)*(Fs2/N); % vypočtení kmitočtů pro každý vzorek signálu
                Y = fft(Audio2)/N; % Fourierova transformace
                
                % Výpočet amplitud a frekvencí
                amplitude = 2*abs(Y(1:N/2+1));
                frequency = f(1:N/2+1);
                
                % Zobrazení signálu v grafu
                plot(obj.axesE,frequency, amplitude);
                obj.axesE.XScale = 'log';
                obj.axesE.XTick = [10 100 1000 10000];


         % Výpočet korelační funkce
        corr_result = xcorr(fft_audio1, fft_audio2);
        correlation = max(corr_result) / sqrt(sum(fft_audio1.^2) * sum(fft_audio2.^2));
        
        % Výpis podobnosti kmitočtových spekter porovnávaných signálů v procentech
        similarity = correlation * 100;
        r = similarity;
        end

        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        function r = compareF(obj)
         Audio1 = obj.baseY;
         Fs1 = obj.baseFs;
         [Audio2, Fs2] = audioread('Database/Pikola.wav'); % Výběr 6. nástroje z databáze
         
         % Převod na jednokanálové signály
         Audio1 = Audio1(:, 1);
         Audio2 = Audio2(:, 1);
         
         % Přizpůsobení vzorkovací frekvence
         desiredFs = 44100; % Požadovaná vzorkovací frekvence
         audio1_resampled = resample(Audio1, desiredFs, Fs1);
         audio2_resampled = resample(Audio2, desiredFs, Fs2);
         
         % Normalizace amplitudy
         audio1_normalized = audio1_resampled / max(abs(audio1_resampled));
         audio2_normalized = audio2_resampled / max(abs(audio2_resampled));
         
         % Časová osa
         duration = length(audio1_normalized) / desiredFs;
         t = 0:1/desiredFs:duration-1/desiredFs;
         
         % Výpočet kmitočtového spektra
         N = length(audio1_normalized);
         frequencies = (0:N-1)*(desiredFs/N);
         
         fft_audio1 = abs(fft(audio1_normalized)/N);
         fft_audio2 = abs(fft(audio2_normalized)/N);
        
                % Vykreslení kmitočtového spektra
                N = length(Audio2); % délka signálu
                f = (0:N-1)*(Fs2/N); % vypočtení kmitočtů pro každý vzorek signálu
                Y = fft(Audio2)/N; % Fourierova transformace
                
                % Výpočet amplitud a frekvencí
                amplitude = 2*abs(Y(1:N/2+1));
                frequency = f(1:N/2+1);
                
                % Zobrazení signálu v grafu
                plot(obj.axesF,frequency, amplitude);
                obj.axesF.XScale = 'log';
                obj.axesF.XTick = [10 100 1000 10000];


         % Výpočet korelační funkce
        corr_result = xcorr(fft_audio1, fft_audio2);
        correlation = max(corr_result) / sqrt(sum(fft_audio1.^2) * sum(fft_audio2.^2));
        
        % Výpis podobnosti kmitočtových spekter porovnávaných signálů v procentech
        similarity = correlation * 100;
        r = similarity;
        end

        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        function r = compareG(obj)
         Audio1 = obj.baseY;
         Fs1 = obj.baseFs;
         [Audio2, Fs2] = audioread('Database/Trombon.wav'); % Výběr 7. nástroje z databáze
         
         % Převod na jednokanálové signály
         Audio1 = Audio1(:, 1);
         Audio2 = Audio2(:, 1);
         
         % Přizpůsobení vzorkovací frekvence
         desiredFs = 44100; % Požadovaná vzorkovací frekvence
         audio1_resampled = resample(Audio1, desiredFs, Fs1);
         audio2_resampled = resample(Audio2, desiredFs, Fs2);
         
         % Normalizace amplitudy
         audio1_normalized = audio1_resampled / max(abs(audio1_resampled));
         audio2_normalized = audio2_resampled / max(abs(audio2_resampled));
         
         % Časová osa
         duration = length(audio1_normalized) / desiredFs;
         t = 0:1/desiredFs:duration-1/desiredFs;
         
         % Výpočet kmitočtového spektra
         N = length(audio1_normalized);
         frequencies = (0:N-1)*(desiredFs/N);
         
         fft_audio1 = abs(fft(audio1_normalized)/N);
         fft_audio2 = abs(fft(audio2_normalized)/N);
         
                % Vykreslení kmitočtového spektra
                N = length(Audio2); % délka signálu
                f = (0:N-1)*(Fs2/N); % vypočtení kmitočtů pro každý vzorek signálu
                Y = fft(Audio2)/N; % Fourierova transformace
                
                % Výpočet amplitud a frekvencí
                amplitude = 2*abs(Y(1:N/2+1));
                frequency = f(1:N/2+1);
                
                % Zobrazení signálu v grafu
                plot(obj.axesG,frequency, amplitude);
                obj.axesG.XScale = 'log';
                obj.axesG.XTick = [10 100 1000 10000];


         % Výpočet korelační funkce
         corr_result = xcorr(fft_audio1, fft_audio2);
         correlation = max(corr_result) / sqrt(sum(fft_audio1.^2) * sum(fft_audio2.^2));
         
         % Výpis podobnosti kmitočtových spekter porovnávaných signálů v procentech
         similarity = correlation * 100;
         r = similarity;
        end

        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        function r = compareH(obj)
         Audio1 = obj.baseY;
         Fs1 = obj.baseFs;
         [Audio2, Fs2] = audioread('Database/Tympany.wav'); % Výběr 8. nástroje z databáze
         
         % Převod na jednokanálové signály
         Audio1 = Audio1(:, 1);
         Audio2 = Audio2(:, 1);
         
         % Přizpůsobení vzorkovací frekvence
         desiredFs = 44100; % Požadovaná vzorkovací frekvence
         audio1_resampled = resample(Audio1, desiredFs, Fs1);
         audio2_resampled = resample(Audio2, desiredFs, Fs2);
         
         % Normalizace amplitudy
         audio1_normalized = audio1_resampled / max(abs(audio1_resampled));
         audio2_normalized = audio2_resampled / max(abs(audio2_resampled));
         
         % Časová osa
         duration = length(audio1_normalized) / desiredFs;
         t = 0:1/desiredFs:duration-1/desiredFs;
         
         % Výpočet kmitočtového spektra
         N = length(audio1_normalized);
         frequencies = (0:N-1)*(desiredFs/N);
         
         fft_audio1 = abs(fft(audio1_normalized)/N);
         fft_audio2 = abs(fft(audio2_normalized)/N);
        
                % Vykreslení kmitočtového spektra
                N = length(Audio2); % délka signálu
                f = (0:N-1)*(Fs2/N); % vypočtení kmitočtů pro každý vzorek signálu
                Y = fft(Audio2)/N; % Fourierova transformace
                
                % Výpočet amplitud a frekvencí
                amplitude = 2*abs(Y(1:N/2+1));
                frequency = f(1:N/2+1);
                
                % Zobrazení signálu v grafu
                plot(obj.axesH,frequency, amplitude);
                obj.axesH.XScale = 'log';
                obj.axesH.XTick = [10 100 1000 10000];


         % Výpočet korelační funkce
         corr_result = xcorr(fft_audio1, fft_audio2);
         correlation = max(corr_result) / sqrt(sum(fft_audio1.^2) * sum(fft_audio2.^2));
         
         % Výpis podobnosti kmitočtových spekter porovnávaných signálů v procentech
         similarity = correlation * 100; % Převod na procenta
         r = similarity;
        end

        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        % Výběr nejpodobnějšího nástroje z databáze (v %)
        function r = getResult(obj)
           Xr = [compareA(obj), compareB(obj), compareC(obj), compareD(obj), compareE(obj), compareF(obj), compareG(obj), compareH(obj)];
           r = max(Xr);
        end

       % Výběr nejpodobnějšího nástroje z databáze (vypsání konkrétního nástroje)
        function r = getInstrument(obj)
            Xr = [compareA(obj), compareB(obj), compareC(obj), compareD(obj), compareE(obj), compareF(obj), compareG(obj), compareH(obj)];
            
            if compareA(obj) == max(Xr)
                r = 'Cello';
            elseif compareB(obj) == max(Xr)
                r = 'Crash';
            elseif compareC(obj) == max(Xr)
                r = 'Klarinet';
            elseif compareD(obj) == max(Xr)
                r = 'Kytara';
            elseif compareE(obj) == max(Xr)
                r = 'Piano';
            elseif compareF(obj) == max(Xr)
                r = 'Pikola';
            elseif compareG(obj) == max(Xr)
                r = 'Trombon';
            else
                r = 'Tympány';
            end
        end

        function obj = setYT(obj, yT)   
            obj.yT = yT;
            obj.player = audioplayer(obj.yT, obj.baseFs);
        end

        function obj = setAxesA(obj, axesA)
            obj.axesA = axesA;
        end
        function obj = setAxesB(obj, axesB)
            obj.axesB = axesB;
        end
        function obj = setAxesC(obj, axesC)
            obj.axesC = axesC;
        end
        function obj = setAxesD(obj, axesD)
            obj.axesD = axesD;
        end
        function obj = setAxesE(obj, axesE)
            obj.axesE = axesE;
        end
        function obj = setAxesF(obj, axesF)
            obj.axesF = axesF;
        end
        function obj = setAxesG(obj, axesG)
            obj.axesG = axesG;
        end
        function obj = setAxesH(obj, axesH)
            obj.axesH = axesH;
        end
    end
end