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'); [y_sem2, Fs_sem2] = audioread('sem2.wav'); % Časové priebehy t1 = (0:length(y1)-1)/Fs1; t2 = (0:length(y2)-1)/Fs2; t_sem2 = (0:length(y_sem2)-1)/Fs_sem2; figPos = get(0, 'DefaultFigurePosition'); figPos(4) = figPos(4) / 2; % polovičná výška (4 = height element) figure('Position', figPos); % style defaults plot(t_sem2, y_sem2); xlabel('Čas [s]'); ylabel('Amplitúda'); title('sem2.wav – pôvodný (RAW) signál'); grid on; save_fig('orig_sem2'); fig_counter = fig_counter + 1; 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; % Detekcia dominantných frekvencií halfN2 = floor(N2 / 2); freq = (0:halfN2-1) * (Fs2 / N2); magX = abs(X2(1:halfN2)); [pks, locs] = findpeaks(magX, 'NPeaks', 3, 'SortStr', 'descend'); f_tonal = sort(freq(locs)); fprintf('\nDetekovane frekvencie z (flac2.wav):\n'); fprintf(' %.1f Hz\n', f_tonal); % SOS IIR filter r = 0.99; Fs = Fs1; sos = zeros(length(f_tonal), 6); for k = 1:length(f_tonal) theta = 2 * pi * (f_tonal(k) / Fs); b = [1, -2*cos(theta), 1]; a = [1, -2*r*cos(theta), r^2]; sos(k, :) = [b, a]; end % Nuly a póly figure; [z, p, k_gain] = sos2zp(sos); zplane(z, p); title('Nuly a póly notch filtrov'); xlabel('Reálna časť'); ylabel('Imaginárna časť'); save_fig('pz_notch'); fig_counter = fig_counter + 1; % Frekvenčná charakteristika figure; [h, w] = freqz(sos, 4096, Fs); freqz(sos, 4096, Fs); title('Frekvenčná charakteristika notch filtra'); subplot(2,1,1); xlim([0 0.5]); subplot(2,1,2); xlim([0 0.5]); save_fig('freqz_notch'); fig_counter = fig_counter + 1; % Filtrovanie flac.wav a flac2.wav y1_filtered = sosfilt(sos, double(y1)); y2_filtered = sosfilt(sos, double(y2)); figure; subplot(2,1,1); plot(y2); title('Pôvodný signál flac2.wav'); xlabel('Vzorky'); ylabel('Amplitúda'); ax1 = gca; grid on; subplot(2,1,2); plot(y2_filtered, 'r'); title('Filtrovaný signál flac2.wav'); xlabel('Vzorky'); ylabel('Amplitúda'); ax2 = gca; grid on; % spolocna y os pre oba grafy ylim_common = [min([ax1.YLim, ax2.YLim]), max([ax1.YLim, ax2.YLim])]; ax1.YLim = ylim_common; ax2.YLim = ylim_common; save_fig('orig_vs_filtered_flac2'); fig_counter = fig_counter + 1; % Aplikácia filtrov na sem2.wav y_sem2_filtered = sosfilt(sos, double(y_sem2)); figure; subplot(2,1,1); plot(t_sem2, y_sem2); xlabel('Čas [s]'); ylabel('Amplitúda'); title('sem2.wav – pôvodný signál'); grid on; subplot(2,1,2); plot(t_sem2, y_sem2_filtered, 'r'); xlabel('Čas [s]'); ylabel('Amplitúda'); title('sem2.wav – filtrovaný signál'); grid on; ylim_common = [min([min(y_sem2), min(y_sem2_filtered)]), ... max([max(y_sem2), max(y_sem2_filtered)])]; subplot(2,1,1); ylim(ylim_common); subplot(2,1,2); ylim(ylim_common); save_fig('orig_vs_filtered_sem2'); fig_counter = fig_counter + 1; audiowrite('filtered_sem2.wav', y_sem2_filtered, Fs_sem2); % Butterworth filter pre rozsah ľudskej reči [z_bp, p_bp, k_bp] = butter(4, [100 8000]/(Fs_sem2/2), 'bandpass'); [sos_bp, g_bp] = zp2sos(z_bp, p_bp, k_bp); y_sem2_final = filtfilt(sos_bp, g_bp, y_sem2_filtered); audiowrite('filtered_sem2_voiceband.wav', ... y_sem2_final / max(abs(y_sem2_final)), Fs_sem2); t_sem2 = (0:length(y_sem2_filtered)-1) / Fs_sem2; figure; subplot(2,1,1); plot(t_sem2, y_sem2_filtered); xlabel('Čas [s]'); ylabel('Amplitúda'); title('sem2.wav – notch filtrácia'); grid on; subplot(2,1,2); plot(t_sem2, y_sem2_final, 'r'); xlabel('Čas [s]'); ylabel('Amplitúda'); title('sem2.wav – notch + band-pass filtrácia'); grid on; ylim_common = [min([min(y_sem2_filtered), min(y_sem2_final)]), ... max([max(y_sem2_filtered), max(y_sem2_final)])]; subplot(2,1,1); ylim(ylim_common); subplot(2,1,2); ylim(ylim_common); save_fig('notch_vs_bandpass_sem2'); fig_counter = fig_counter + 1; % Percentuálny rozdiel band-pass filtrácie diff_signal = y_sem2_final - y_sem2_filtered; power_original = sum(y_sem2_filtered.^2); power_diff = sum(diff_signal.^2); percent_difference = (power_diff / power_original) * 100; fprintf('\nRozdiel medzi notch a notch+band‑pass signálom: %.2f %%\n', percent_difference);