% DPCM.m
% Neste script é mostrado o efeito do erro de quantização na qualidade do sinal
% com digitalização DPCM.
%
% Com base numa amostra de som (.wav, não comprimida) digitalizada,
% preferencialmente a 16 bits/amostra, é feita a digitalização com 2 e 4 bits
% usando PCM e DPCM, e os resultados são comparados visualmente e por meio de
% amostras de áudio gravadas.


% André Noll Barreto, 09 ago 2010
% código do DPCM contribuído por Juliana Müller e Pedro Borges Costa

%%%%%%%%%%%%%%%%
% parâmetros
arquivoSom = 'female1.wav';
razao_dp_mp = 1/4; % razão entre o nível máximo de quantização da diferença e do sinal

%%%%%%%%%%%%%%%%


close all;

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

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

mp = max(abs(som));

% quantizar sinal em 4 bits/amostra
nbits = 4;
L = 2^nbits;
som_4bits =  round(som / mp * L / 2) * mp / L * 2;

% quantizar sinal em 4 bits/amostra
nbits = 2;
L = 2^nbits;
som_2bits =  round(som / mp * L / 2) * mp / L * 2;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%555
% DPCM

nbits = 4;
L = 2^nbits;

som_pred_quant = zeros(1,length(som));
som_quant =  zeros(1,length(som));
d_quant =  zeros(1,length(som));
d =  zeros(1,length(som));
som_quant (1:2) = som(1:2);

dp = .01 * mp * razao_dp_mp; % chute para nÃ­veis de quantizaÃ§Ã£o

for k = 3 : length(som)
  som_pred_quant(k)  = 2 * som_quant(k-1) - som_quant(k-2); % preditor
  d(k) = som(k) - som_pred_quant(k);
  d_quant(k) = round(d(k) / dp * L / 2) * dp / L * 2;
  som_quant(k) = som_pred_quant(k) + d_quant(k);
end;


wavwrite(som_quant, fs, bits, 'teste_aula_dpcm_4bits');

figure(1);
plot( t,som, t,som_quant, t,som_4bits);
legend('Original', 'DPCM - 4bits', 'PCM - 4bits');




nbits = 2;
L = 2^nbits;

som_pred_quant = zeros(1,length(som));
som_quant =  zeros(1,length(som));
d_quant =  zeros(1,length(som));
d =  zeros(1,length(som));
som_quant (1:2) = som(1:2);

for k = 3 : length(som)
  som_pred_quant(k)  = 2 * som_quant(k-1) - som_quant(k-2); % preditor
  d(k) = som(k) - som_pred_quant(k);
  d_quant(k) = round(d(k) / dp * L / 2) * dp / L * 2;
  som_quant(k) = som_pred_quant(k) + d_quant(k);
end;


wavwrite(som_quant, fs, bits, 'teste_aula_dpcm_2bits');

figure(2);
plot( t,som, t,som_quant, t,som_2bits);
legend('Original', 'DPCM - 2bits', 'PCM - 2bits');
