clear all, close all, clc

TotSeconds = 15; % Quanti secondi voglio registrare
StartSecond = 10;
SampleBits = 8;
NChannels = 1; % 1 for mono, 2 for stereo
% Fs = 44100;
SongName = 'Carols.mp3';
flagSave = 1;
flagRecord = 0;

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

FilterOrder = 5;

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

FrequencyBand = [100 3000];%[85 3e3];%[2000 4e3];%[85 3e3];

[x, Fs] = audioread(SongName);

% MonoChannel

x = mean(x, 2);

x = x(StartSecond*Fs:Fs*(TotSeconds + StartSecond));

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

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

NormBandPass = FrequencyBand/Fs;

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

FilteredX = filter(Num, Den, x);

% 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)) * Fs/2 / (FrequencyBand(2) - FrequencyBand(1));

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