%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Neste script é mostrada qualidade de digitalização usando modulação delta.
%
% Com base numa amostra de som (.wav, não comprimida) digitalizada,
% preferencialmente a 16 bits/amostra, é feita a digitalização com modulação
% delta, considerando-se dois valores diferentes de passos de quantização.

% André Noll Barreto, 10 ago 2010

%%%%%%%%%%%%%%%
% parâmetros
arquivoSom = 'female1.wav';
os = 4; % fator de superamostragem



[som, fs, bits] = wavread(arquivoSom);

t = (0:length(som)-1) / fs;
mp = max(abs(som));


t_os = (0 : 1/os : (length(som)-1)) / fs; % instantes de amostra
t_s = 1 / fs / os;

% definir filtro passa baixa
ffil = fs / 2;
lfil = 100;
h= fir1 ( lfil, ffil / (fs*os) * 2 );

som_os = interp1(t, som, t_os);  % som super-amostrado

sigma = mp/10;

som_pred_quant = zeros(1, length(som_os));
som_pred_quant(1) = som_os(1);
som_quant = zeros(1, length(som_os));
d = zeros(1, length(som_os));

for k = 2 : length(som_os)
  som_pred_quant(k)  = som_quant(k-1); % preditor
  d(k) = sign (som_os(k) - som_pred_quant(k)) * sigma;
  som_quant(k) = som_pred_quant(k) + d(k);
end

wavwrite(som_quant, fs * os, bits, 'teste_aula_delta01.wav');

som_delta01_fil = filter(h, 1, som_quant );
%som_delta01_fil = som_delta01_fil(lfil:length(som_delta01_fil));
wavwrite(som_delta01_fil, fs * os, bits, 'teste_aula_delta01_fil.wav');

figure(1)
plot(t_os, som_os, t_os, d, t_os, som_quant, t_os, som_delta01_fil);

legend('som original', 'delta', 'mod. delta (sigma = mp/10)', 'mod delta filtrada')

sigma = mp/100;

som_pred_quant = zeros(1, length(som_os));
som_pred_quant(1) = som_os(1);
som_quant = zeros(1, length(som_os));
d = zeros(1, length(som_os));

for k = 2 : length(som_os)
  som_pred_quant(k)  = som_quant(k-1); % preditor
  d(k) = sign (som_os(k) - som_pred_quant(k)) * sigma;
  som_quant(k) = som_pred_quant(k) + d(k);
end

wavwrite(som_quant, fs * os, bits, 'teste_aula_delta001.wav');

som_delta001_fil = filter( h, 1, som_quant );
%som_delta001_fil = som_delta001_fil(lfil:length(som_delta001_fil));
wavwrite(som_delta001_fil, fs * os, bits, 'teste_aula_delta001_fil.wav');

figure(2)
plot(t_os, som_os, t_os, d, t_os, som_quant, t_os, som_delta001_fil);

legend('som original', 'delta', 'mod. delta (sigma = mp/100)', 'mod delta filtrada')
