%% Ez a program egy megadott hangmintát szennyez egy szinuszos jellel és 
%  bemutatja, hogy az hogyan jelenik meg a frekvenciatérben és hogyan lehet
%  kiszûrni

filename_readed = input('Kérem a fájl nevét!\n', 's');
if ~isempty(filename_readed)
    filename = filename_readed;
end
[y,Fs] = audioread(filename);

disp('Az eredeti hang');
sound(y, Fs);
pause;

disp('A keskenysávú zaj');
noise = sin(1:size(y, 1))'/20;
sound(noise, Fs);
pause;

disp('A két jel összege');
y_ = y+noise;
sound(y_, Fs);
pause;

% Szûrjük ki a zajt! Próbáljuk meg idõtartományban!

figure(1);
subplot(2,1,1);
plot(y);
title('Az eredeti jel');
subplot(2,1,2);
plot(y_);
title('A zajos jel');
pause;
close(1);
% Megcsináljuk a Fourier-transzformációt, mert a frekvenciatartományban
% könnyebb szûrni.

Y = fft(y);
NOISE = fft(noise);
Y_ = fft(y_);

figure(1);
subplot(3,1,1);
plot(abs(Y));
title('Az eredeti jel');
subplot(3,1,2);
plot(abs(Y_));
title('A zajos jel');
subplot(3,1,3);
plot(abs(NOISE));
title('A kiszûrendõ zaj');
disp('Látható, hogy a zaj és a hasznos jel elkülönül egymástól a frekvenciatartományban.');
disp('Egyszerûen vágjuk ki!');
disp('Csináljunk egy olyan függvényt, ami mindenhol 1, kivéve azokban a tartományokban,');
disp('ahol a zaj lényegesen nagyobb, mint 0.');
disp('Ezeket az értékeket le tudjuk olvasni az ábráról');
pause;
close(1);


FILTER = ones(size(Y));
FILTER(6900:7100) = 0;
FILTER((end-6900):-1:(end-7100)) = 0; % Ahhoz, hogy a szûrõ megvalósítható legyen a frekvenciatartományban is, szimmetrikusnak kell lennie.

FILTERED_Y = Y_ .* FILTER;

figure(1);
subplot(3,1,1);
plot(abs(Y_));
title('A zajos jel');
subplot(3,1,2);
plot(abs(FILTER));
title('A szûrõ');
subplot(3,1,3);
plot(abs(FILTERED_Y));
title('A kettõ szorzata');
pause;
close(1);

disp('Már csak vissza kell alakítani a szûrt jelet az idõtartományba');
disp('Ebben az ifft (inverz FFT) lesz a segítségünkre.');

filtered_y = real(ifft(FILTERED_Y));
% Az ifft eredménye ideális esetben csak valós értékeket tartalmaz
% a numerikus pontatlanságok miatt azonban lesznek kicsi képzetes tagjaink
% is. Azokat egyszerûen elhagyhatjuk. FONTOS, hogy ezt tényleg csak a
% számítógép numerikus hibái miatt kell megtenni, nem a matematika miatt.
disp('A hang lejátszásához nyomj ENTER-t!');
pause;
sound(filtered_y, Fs);

disp('A probléma az, hogy valós rendszerekben nehéz lenne mindig áttérnünk');
disp('frekvenciatartományba, ráadásul analóg technikánál ezt meg sem tehetjük.');
disp('Ezért szükségünk van a szûrõnek valami idõtartománybeli megfeleltetésére.');
disp('Ami a frekvenciatartományban szorzás, az az idõtartományban konvolúció');
disp('IFFT-zzük a szûrõt és meglesz az idõtartománybeli alakunk, amit csak');
disp('össze kell konvolválni a szûrendõ jellel.');
disp('Az idõtartományban szûrt jel lejátszásához nyomj ENTER-t!');
pause;

filter = real(ifft(FILTER)); % Az abs azért kell, mert numerikus hiba miatt az ifft-ben 0i-s komplex számok lesznek
original_filter = filter;
filter=[filter(floor(end/2)+1:end)', filter(1:floor(end/2))']; % Ez azért kell, mert a szûrõtervezésnél elkövettük azt az egyszerûsítést, hogy csak valós számokat használtunk. Érdemes összehasonlítani az újravágott jel FFT-jét az eredeti szûrõjével. Abszolútértékben ugyan az, de a valós és képzetes része teljesen más.
filtered_signal2 = conv(y_, filter);
sound(filtered_signal2, Fs);