clear all, close all, clc

TotSeconds = 5; % Quanti secondi voglio registrare
SampleBits = 8;
NChannels = 1; % 1 for mono, 2 for stereo
Fs = 44100;
DBName = 'Canto.mat';
flagSave = 1;
flagRecord = 0;

flagReproduceInput = 1;
flagReproduceFiltered = 1;
flagReproduceNoisy = 1;
flagReproduceNoisyFiltered = 1;

FilterOrder = 5;

SNRdB = 0; % 10*log10(SignalPower/NoisePower)

FrequencyBand = [1300 2500];%[85 3e3];%[2000 4e3];%[85 3e3];

RecordObj = audiorecorder(Fs, SampleBits, NChannels);

if(flagRecord)

%     RecordObj = audiorecorder(Fs, SampleBits, NChannels);

    disp('Schiaccia quando vuoi partire a registrare')
    pause
    recordblocking(RecordObj, 3);
    disp('Registrato!!!')
    disp('Schiaccia per risentire')
    pause
    disp('Riproduzione in corso dell''originale')
    RecordObj.play;

    if(flagSave)
        
        save(DBName, 'RecordObj')
        
    end

else
    
    load(DBName)

end
if(flagReproduceInput)
    disp('Sto per riprodurre il Segnale di partenza!')
    pause
    disp('Riproduzione Segnale di partenza')
    RecordObj.play;
end

x = RecordObj.getaudiodata;

NormBandPass = FrequencyBand/Fs;

[Num, Den] = butter(FilterOrder, 2*NormBandPass);
% Num = fir1(FilterOrder, NormBandPass);
% Den = 1;

FilteredX = filter(Num, Den, x);
% FilteredX = FilteredX(1:end);

% stem(FilteredX)

if(flagReproduceFiltered)
    disp('Sto per riprodurre il Segnale Filtrato!')
    pause
    disp('Riproduzione del Segnale Filtrato!')

    FilteredXAudio = audioplayer(FilteredX, Fs);
    FilteredXAudio.play;
end

%% Noisy Signal

SignalPower = var(x);
NoisePower = SignalPower/(10^(SNRdB/10));

Noise = sqrt(NoisePower)*randn(size(x));

y = x + Noise;
if(flagReproduceNoisy)
    disp('Sto per riprodurre il Segnale Rumoroso!')
    pause
    disp('Riproduzione del Segnale Rumoroso!')

    NoisyAudio = audioplayer(y, Fs);
    NoisyAudio.play;
end

FilteredY = filter(Num, Den, y);
if(flagReproduceNoisyFiltered)
    disp('Sto per riprodurre il Segnale Rumoroso Filtrato!')
    pause
    disp('Riproduzione del Segnale Rumoroso Filtrato!')

    NoisyAudio = audioplayer(FilteredY, Fs);
    NoisyAudio.play;
end