clear all

%===================================%the Encoder
[d,r] = wavread('C:\Documents and Settings\bruce land\My Documents\Matlab\Speech\SineSynth\test4small.WAV'); %4
%scale to about unity
res = 1/(max(max(d),abs(min(d)) ));
dd = diff(d * res);
%init the code vector
ddcode = zeros(1,length(dd));

% brkpt1=-0.5; brkpt2=0 ; brkpt3=0.5;
% value = [-.75, -.25 .25 .75];
%breakpoints are changeable
brkpt1=-0.05; brkpt2=0 ; brkpt3=0.05;
%quantize the first derivative
ddcode(find(dd<brkpt1))=0;
ddcode(find(dd>=brkpt1 & dd<brkpt2))=1;
ddcode(find(dd>=brkpt2 & dd<brkpt3))=2;
ddcode(find(dd>=brkpt3))=3;

%make the length of ddcode a multiple of 4
ddcode = [ddcode,zeros(1,4-mod(length(ddcode),4))];
length(ddcode)
index=1;
for i=1:4:length(ddcode)
    packed(index)=ddcode(i)*64 + ddcode(i+1)*16 + ...
        ddcode(i+2)*4 + ddcode(i+3) ;
    index=index+1;
end
%make a textfile with Codevision source code in it.
fname='DPCMcode.h';
fid = fopen(fname,'w');
fprintf(fid,'flash char dpcmtable[%d]={\r',length(packed));
for i=1:length(packed)-1
    fprintf(fid,' %5d,\r',packed(i));
end
fprintf(fid,' %5d};\r',packed(end));
fclose(fid);

%===================================%the Decoder
%value based on quantizer
value = [-.16, -.026 .026 .16];
dl(1)=0;
j=2;
for i=1:length(packed)
    p1 = fix(bitand(packed(i),192)/64);
    p2 = fix(bitand(packed(i),48)/16);
    p3 = fix(bitand(packed(i), 12)/4);
    p4 = fix(bitand(packed(i),3));
    %note that a bit of highpass has been added to reduce drift
    dl(j) = dl(j-1)+ value(p1+1) - .125*dl(j-1);
    j=j+1;
    dl(j) = dl(j-1)+ value(p2+1) - .125*dl(j-1);
    j=j+1;
    dl(j) = dl(j-1)+ value(p3+1) - .125*dl(j-1);
    j=j+1;
    dl(j) = dl(j-1)+ value(p4+1) - .125*dl(j-1);
    j=j+1;
end
% dl(1)=0;
% for i=1:length(ddcode)
%     dl(i) = dl(i-1)+ value(ddcode(i)+1) - .125*dl(i-1); % .* w';
% end

%====================================%playback and graphing
soundsc(dl,r);
% Compare the spectrograms
figure(1);clf
subplot(211)
specgram(d,256,r);
title('Original');
subplot(212)
specgram(dl,256,r);
title('synth');