clc; close all; clear; % === Global figure styling (light mode defaults) === set(0, 'DefaultFigureColor', 'w'); % white figure background set(0, 'DefaultAxesColor', 'w'); % white plotting area set(0, 'DefaultAxesXColor', 'k'); % black x-axis lines and text set(0, 'DefaultAxesYColor', 'k'); % black y-axis lines and text set(0, 'DefaultTextColor', 'k'); % black text for titles, labels set(0, 'DefaultLineColor', 'b'); % blue lines by default clear saveFigure % === Automatic figure export counter === fig_counter = 1; save_fig = @saveFigure; function saveFigure(name) persistent counter if isempty(counter) counter = 1; end % Force painters renderer and white backgrounds set(gcf, 'Renderer', 'painters'); set(gcf, 'Color', [1 1 1]); axesHandles = findall(gcf, 'Type', 'axes'); for ax = axesHandles' set(ax, 'Color', [1 1 1]); end % Export clean EPS with no transparency problems print(gcf, '-depsc2', '-r300', '-painters', sprintf('%d_%s.eps', counter, name)); counter = counter + 1; end [y1, Fs1] = audioread('flac.wav'); [y2, Fs2] = audioread('flac2.wav'); % Časové priebehy t1 = (0:length(y1)-1)/Fs1; t2 = (0:length(y2)-1)/Fs2; figure; subplot(2,1,1); plot(t1, y1); xlabel('Čas [s]'); ylabel('Amplitúda'); title('flac.wav'); grid on; subplot(2,1,2); plot(t2, y2, 'r'); xlabel('Čas [s]'); ylabel('Amplitúda'); title('flac2.wav'); grid on; save_fig('time'); fig_counter = fig_counter + 1; % Fourierova transformácia N1 = length(y1); N2 = length(y2); X1 = fft(y1); X2 = fft(y2); freq_shift1 = (-N1/2 : N1/2 - 1) * (Fs1 / N1); freq_shift2 = (-N2/2 : N2/2 - 1) * (Fs2 / N2); % Real a imag časť spektra figure; subplot(2,1,1); plot(freq_shift2, real(fftshift(X2))); xlabel('Frekvencia [Hz]'); ylabel('Amplitúda'); title('flac2.wav – Reálna časť spektra'); xlim([-550 550]); grid on; subplot(2,1,2); plot(freq_shift2, imag(fftshift(X2)), 'r'); xlabel('Frekvencia [Hz]'); ylabel('Amplitúda'); title('flac2.wav – Imaginárna časť spektra'); xlim([-550 550]); grid on; save_fig('spectrum'); fig_counter = fig_counter + 1; % Real a imag časť spektra figure; subplot(2,1,1); plot(freq_shift1, real(fftshift(X1))); xlabel('Frekvencia [Hz]'); ylabel('Amplitúda'); title('flac.wav – Reálna časť spektra'); xlim([-3500 3500]); grid on; subplot(2,1,2); plot(freq_shift1, imag(fftshift(X1)), 'r'); xlabel('Frekvencia [Hz]'); ylabel('Amplitúda'); title('flac.wav – Imaginárna časť spektra'); xlim([-3500 3500]); grid on; save_fig('spectrum2'); fig_counter = fig_counter + 1; % Určenie typu šumu na základe spektrálneho sklonu [PSD, f] = pwelch(y1, hamming(4096), [], [], Fs1, 'onesided'); % PSD mask = f > 10 & f < Fs1/2; logf = log10(f(mask)); logP = log10(PSD(mask)); p = polyfit(logf, logP, 1); slope = p(1); intercept = p(2); fprintf('Spektrálny sklon (alfa) = %.2f\n', slope); % Vizualizácia figure; loglog(f, PSD); hold on; loglog(f(mask), 10.^(polyval(p, logf)), 'r', 'LineWidth', 1.5); xlabel('Frekvencia [Hz]'); ylabel('Výkonová spektrálna hustota (PSD)'); title(sprintf('Spektrálny sklon = %.2f', slope)); lgd = legend('Meraná PSD', 'Lineárna aproximácia (log-log)', 'Location', 'best'); set(lgd, 'Color', 'w', 'TextColor', 'k'); grid on; save_fig('spectral_slope'); fig_counter = fig_counter + 1; % === IIR Notch filtering flac2.wav and noise type analysis === fprintf('\n=== IIR Notch Filtering of flac2.wav ===\n'); % Detekcia dominantných frekvencií v flac2.wav pre notch filtráciu halfN = floor(N2 / 2); freq_pos = (0:halfN - 1) * (Fs2 / N2); magX2 = abs(X2(1:halfN)); [pks2, locs2] = findpeaks(magX2, 'NPeaks', 3, 'SortStr', 'descend'); f_notch = sort(freq_pos(locs2)); fprintf('\nDetekované dominantné frekvencie vo flac2.wav:\n'); fprintf(' %.1f Hz\n', f_notch); % === Konštrukcia a aplikácia IIR notch filtra === r = 0.98; % ostrosť zárezu (0.98 až 0.995) Fs = Fs2; sos_notch = zeros(length(f_notch), 6); for k = 1:length(f_notch) theta = 2 * pi * (f_notch(k) / Fs); b = [1, -2*cos(theta), 1]; a = [1, -2*r*cos(theta), r^2]; sos_notch(k, :) = [b, a]; end % Aplikácia filtra na flac2.wav y2_notched = sosfilt(sos_notch, double(y2)); % Uloženie výsledného signálu audiowrite('flac2_notched.wav', y2_notched / max(abs(y2_notched)), Fs2); % Zobrazenie pred/po filtrácii figure; subplot(2,1,1); plot(y2); xlabel('Vzorky'); ylabel('Amplitúda'); title('Pôvodný signál flac2.wav'); grid on; subplot(2,1,2); plot(y2_notched, 'r'); xlabel('Vzorky'); ylabel('Amplitúda'); title('Filtrovaný signál – flac2.wav (IIR Notch)'); grid on; save_fig('flac2_notched'); fig_counter = fig_counter + 1; % === Analýza zvyškového šumu po IIR filtri === [PSD_res, f_res] = pwelch(y2_notched, hamming(4096), [], [], Fs2, 'onesided'); mask_res = f_res > 10 & f_res < Fs2/2; logf_res = log10(f_res(mask_res)); logP_res = log10(PSD_res(mask_res)); p_res = polyfit(logf_res, logP_res, 1); slope_res = p_res(1); fprintf('\nSpektrálny sklon po IIR filtrácii (alfa) = %.2f\n', slope_res); % Vizualizácia figure; loglog(f_res, PSD_res); hold on; loglog(f_res(mask_res), 10.^(polyval(p_res, logf_res)), 'r', 'LineWidth', 1.5); xlabel('Frekvencia [Hz]'); ylabel('Výkonová spektrálna hustota (PSD)'); title(sprintf('Zvyškový šum po IIR notch filtrácii (α = %.2f)', slope_res)); legend('PSD po IIR filtri', 'Lineárna aproximácia', 'Location', 'best'); grid on; save_fig('residual_noise_flac2'); fig_counter = fig_counter + 1; % Interpretácia typu šumu podľa alfa if slope_res > -0.5 noise_type = 'biely šum'; elseif slope_res > -1.5 noise_type = 'ružový šum'; else noise_type = 'hnedý šum'; end fprintf('Typ zostávajúceho šumu po notch filtrácii: %s\n', noise_type);