Files
css/semestralka2/final_cleaned_backup.m
2025-12-07 00:10:47 +01:00

252 lines
6.4 KiB
Matlab
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
% 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;
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, Fs_sem2] = audioread('sem2.wav');
y_sem2_filtered = sosfilt(sos, double(y_sem2));
t_sem2 = (0:length(y_sem2)-1) / Fs_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+bandpass signálom: %.2f %%\n', percent_difference);
figPos = get(0, 'DefaultFigurePosition');
figPos(4) = figPos(4) / 2; % polovičná výška (4 = height element)
figure('Position', figPos); % použije globálne defaulty štýlu
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;