%% Cyklická konvoluce - OLS, OLA
%% Úkoly:
%% Lineární konvoluce
% Vytvořte posloupnost reprezentující impulzní odezvu filtru klouzavého průměru (MA = Moving Average filtru) řádu M=100, tj. impulsní odezvu délky N_1 =M+1=101.
% Vytvořte posloupnost délky N_2 =4000 vzorků reprezentující signál x\left\lbrack n\right\rbrack, která bude obsahovat součet:
% Sinusového signálu s nulovým fázovým posuvem (\varphi =0) a parametry A=1,f=12\mathrm{Hz},\mathrm{fs}=8000\mathrm{Hz}
% Bílého šumu s normálním rozdělením s nulovou střední hodnotou a jednotkovým rozptylem, tj. \mu =0,\sigma^2 =1.
% Realizujte filtraci na bázi lineární konvoluce (funkce conv) výše uvedeným MA-filtrem pro potlačení přítomného náhodného šumu ve směsi těchto dvou signálů.

% help conv
% Definice signálů:
M = 100;
N1 = M+1; % = 101
N2 = 4000;

A = 1;
f = 12; % Hz
fs = 8000; % Hz

% Filtrace lineární konvolucí:



% Zobrazte:
% Frekvenční charakteristiku v dB filtru klouzavých průměrů h\left\lbrack n\right\rbrack
% Impulzní odezvu filtru klouzavých průměrů h\left\lbrack n\right\rbrack
% Vstupní signál x\left\lbrack n\right\rbrack
% Výstupní signál y\left\lbrack n\right\rbrack, tj. výsledek lineární konvoluce y\left\lbrack n\right\rbrack =x\left\lbrack n\right\rbrack *h\left\lbrack n\right\rbrack

% Zobrazení charakteristik:



%% VE VOLNÉM ČASE nebo DOMA:
% Zvažte, jak by se realizovala výše uvedená filtrace pomocí IIR filtru na bázi exponenciálního zapomínání (y\left\lbrack n\right\rbrack =p\cdot y\left\lbrack n-1\right\rbrack +\left(1-p\right)\cdot x\left\lbrack n\right\rbrack, parametr zapomínání volte p=0\ldotp 98). Opakujte s filtrem aproximujícím exponenciální zapomínání na bázi FIR filtru s exponenciální impulzovou odezvou konečné délky N_1 =101 vzorků.
%
%% Cyklická konvoluce
% Vypočítejte cyklickou konvoluci mezi posloupnostmi x\left\lbrack n\right\rbrack a h\left\lbrack n\right\rbrack pomocí DFT o těchto řádech:
% \mathrm{NDFT}=N_1 +N_2 -1
% \mathrm{NDFT}=N_2
% \textrm{NDFT}=512 (případně kratším, např. 256)
% \mathrm{NDFT}>N_1 +N_2 -1
% Vykreslete dosažené výsledky na bázi lineární a cyklické konvoluce do jednoho obrázku a vysvětlete pozorované rozdíly.

% Výpočet cyklické konvoluce:
NDFT1 = 512; % Popř. 256
NDFT2 = N2;
NDFT3 = N1+N2-1;
% NDFT4 = 



%
%% Realizace cyklické konvoluce pro dlouhé signály (on-line zpracování)
% Proveďte filtraci na bázi cyklické konvoluce nezávislým zpracováním v krátkodobých segmentech délky \mathrm{NDFT}=512  vzorků. Segmentaci realizujte bez překryvu a srovnejte opět dosažené výsledky na bázi lineární a cyklické konvoluce.

% Cyklická konvoluce po segmentech bez překryvu


% Proveďte filtraci na bázi cyklické konvoluce nezávislým zpracováním v krátkodobých segmentech s překryvem na bázi metody OLS  (Overlap-And-Save, tj. metoda uschování přesahu). Řád FFT volte opět \mathrm{NDFT}=512 vzorků a srovnejte opět dosažené výsledky na bázi lineární a cyklické konvoluce.

% Cyklická konvoluce po segmentech s překryvem metodou OLA


% Proveďte filtraci na bázi cyklické konvoluce nezávislým zpracováním v krátkodobých segmentech s překryvem na bázi metody OLA  (Overlap-And-Add, tj. metoda přičtení přesahu). Řád FFT volte opět \mathrm{NDFT}=512 vzorků a srovnejte opět dosažené výsledky na bázi lineární a cyklické konvoluce.

% Cyklická konvoluce po segmentech s překryvem metodou OLS


% Zobrazte a srovnejte výstupní signály vypočtené na bázi lineární konvoluce a cyklické konvoluce po segmentech s využitím metody OLS i OLA.

% Srovnání


%
%% Modelování dozvuku
% Na bázi cyklické konvoluce a metody OLA nebo OLS realizujte filtraci modelující signál snímaný v místnosti s větším dozvukem. Níže odkazované wav-soubory načtěte pomocí funkce audioread, pro případný poslech uchovejte při načtení informaci o vzorkovacím kmitočtu.
% Pro naměřenou impulsní odezvu ir_iim03.wav (vhodně zkrácenou) a vstupní signál guitar_dry.wav zobrazte a srovnejte výstupní signály vypočtené na bázi:
% Lineární konvoluce
% Cyklické konvoluce po segmentech s využitím metody OLA
% Cyklické konvoluce bez překryvu
% Srovnejte počítačový čas potřebný pro výpočet lineární a cyklické konvoluce na bázi OLA.
% Vstupní a výstupní signály srovnejte poslechem.

% Modelování dozvuku
% Signál pro filtraci
[sig1, fs] = audioread("guitar_dry.wav");

% Naměřená impulzová odezva
h1 = audioread("ir_iim03.wav");

% Lineární konvoluce


% Cyklická konvoluce OLA


% Cyklická konvoluce bez překryvu


% Srovnání


% Vyzkoušejte také pro následující signály:
% Impulzní odezvy: ir_iim01.wav, ir_iim02.wav, ir_betlem.wav
% Zpracovávané signály: voice_dry.wav