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

253 lines
6.4 KiB
Matlab
Raw 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');
[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+bandpass signálom: %.2f %%\n', percent_difference);