253 lines
6.4 KiB
Matlab
253 lines
6.4 KiB
Matlab
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);
|
||
|
||
|