function sd = adpcm_decode(l) %-------------------------------------------------------------- % % name: adpcm_decode.m % description: This function decompresses a given voice signal % using the adpcm algorithm. The input is assumed % to be 8 bit mu-law encoded voice signal sampled % at 8 Khz. The input is assumed to be a row matrix. % %--------------------------------------------------------------- PRED_ZERO_ORDER = 6; PRED_POLE_ORDER = 2; dq = zeros(size(l,1)+PRED_ZERO_ORDER,1); %quantization difference for predictor sd = zeros(size(l,1),1); %decoded signal sp = zeros(size(l,1),1); %log compressed signal reconstruction dln = zeros(size(l,1),1); %log2 scaled difference signal calculation sr = zeros(size(l,1)+PRED_POLE_ORDER,1); %reconstructed signal states Se = zeros(size(l,1)+PRED_POLE_ORDER,1); %signal estimate Sez = zeros(size(l,1),1); %signal zeros estimate bi = zeros(size(l,1)+1,PRED_ZERO_ORDER); %predictor zero bi(k) ai = zeros(size(l,1)+1,PRED_POLE_ORDER); %predictor pole coefficients ai(k) pk = zeros(size(l,1)+3,1); %sum of difference quantization and zeros prediction filter estimate p(k) Dms = zeros(size(l,1)+1,1); %short term average adaptation Dml = zeros(size(l,1)+1,1); %long term average adaptation ap = zeros(size(l,1)+1,1); %speed control parameter coefficient al = zeros(size(l,1),1); %speed control parameter coefficient y = zeros(size(l,1),1); %scale factor adaptation yl = zeros(size(l,1)+1,1); %locked scale factor adaptation yu = zeros(size(l,1)+1,1); %unlocked scale factor adaptation i = 0; td = 0; tr = 0; sign = 0; PCM_LEVEL = 1; for k=1:size(l,1) %prediction filter for i = 1:PRED_ZERO_ORDER %calculate MA equation for predictor product = bi((k+1)-1,i)*dq((k+PRED_ZERO_ORDER)-i); Sez(k) = Sez(k) + product; end for i = 1:PRED_POLE_ORDER %calculate AR equation for predictor product = ai((k+1)-1,i)*sr((k+PRED_POLE_ORDER)-i); Se(k+PRED_POLE_ORDER) = Se(k+PRED_POLE_ORDER) + product; end Se(k+PRED_POLE_ORDER) = Se(k+PRED_POLE_ORDER) + Sez(k); %limit speed control parameter if (ap((k+1)-1) > 1) al(k) = 1; elseif (ap((k+1)-1)<=1) al(k) = ap((k+1)-1); end %compute scale factor y(k) = al(k)*yu((k+1)-1) + (1-al(k))*yl((k+1)-1); %inverse adaptive quantization if (abs(l(k)) == 7) sign = l(k)/abs(l(k)); dqln(k) = 3.32; elseif (abs(l(k)) == 6) sign = l(k)/abs(l(k)); dqln(k) = 2.91; elseif (abs(l(k)) == 5) sign = l(k)/abs(l(k)); dqln(k) = 2.52; elseif (abs(l(k)) == 4) sign = l(k)/abs(l(k)); dqln(k) = 2.13; elseif (abs(l(k)) == 3) sign = l(k)/abs(l(k)); dqln(k) = 1.66; elseif (abs(l(k)) == 2) sign = l(k)/abs(l(k)); dqln(k) = 1.05; elseif (abs(l(k)) == 1) sign = l(k)/abs(l(k)); dqln(k) = .031; elseif (abs(l(k)) == 0) sign = 1; dqln(k) = -16; end dql(k) = dqln(k) + y(k); %multiply scale factor (adding in log is %like multiplying in linear) dq(k+PRED_ZERO_ORDER) = sign*(2^(dql(k))); %convert to linear %tone transition detection if (td == 1) if (abs(dq(k+PRED_ZERO_ORDER)) > 24*(2^yl(k+1))) tr = 1; else tr = 0; end else tr = 0; end %compute reconstructed signal sr(k+PRED_POLE_ORDER) = Se(k+PRED_POLE_ORDER)+dq(k+PRED_ZERO_ORDER); %Predictor Adaptation (Pole Zero update equations) pk((k+3)) = dq(k+PRED_ZERO_ORDER) + Sez(k); ai((k+1),1) = (1-2^-8)*ai((k+1)-1,1)+(3*2^-8)*adpcm_sgn(pk(k+3),0)*adpcm_sgn(pk((k+3)-1),1); ai((k+1),2) = (1-2^-7)*ai((k+1)-1,2)+(2^-7)*(adpcm_sgn(pk((k+3)),0)*adpcm_sgn(pk((k+3)-2),1)-adpcm_f(ai(((k+1)-1),1))*adpcm_sgn(pk((k+3)),0)*adpcm_sgn(pk((k+3)-1),1)); for r = 1:PRED_ZERO_ORDER bi((k+1),r) = (1-2^-8)*bi((k+1)-1,r)+(2^-7)*adpcm_sgn(dq(k+PRED_ZERO_ORDER),0)*adpcm_sgn(dq((k+PRED_ZERO_ORDER)-r),1); end %constrain pole coefficients if necessary if (abs(ai((k+1),2)) > .75) if (ai((k+1),2) >= 0) ai((k+1),2) = .75; %limit a2 else ai((k+1),2) = -.75; end end if (abs(ai((k+1),1)) > (1-(2^-4)-ai(k+1,2))) ; if (ai((k+1),1) >= 0) ai(k+1,1) = (1-(2^-4)-ai((k+1),2)); %limit a1 else ai(k+1,1) = -(1-(2^-4)-ai((k+1),2)); %limit a1 end end %prediction trigger if tr == 1 %if transition detected reset predictor coefficients for r = 1:PRED_POLE_ORDER ai((k+1),r) = 0; end for r = 1:PRED_ZERO_ORDER bi((k+1),r) = 0; end td = 0; %if tone transition is detected clear tone detect flag end %tone detection if ai((k+1),2) < -.71875 td = 1; else td = 0; end %prediction trigger if tr == 1 %if transition detected reset predictor coefficients for r = 1:PRED_POLE_ORDER ai((k+1),r) = 0; end for r = 1:PRED_ZERO_ORDER bi((k+1),r) = 0; end td = 0; %if tone transition is detected clear tone detect flag end %Speed control parameter adaptation switch (abs(l(k))) case 7 Flk = 7; case 6 Flk = 3; case 5 Flk = 1; case 4 Flk = 1; case 3 Flk = 1; case 2 Flk = 0; case 1 Flk = 0; case 0 Flk = 0; end %calculate short and long term average adaptation Dms(k+1) = (1-2^-5)*Dms((k+1)-1)+(2^-5)*Flk; Dml(k+1) = (1-2^-7)*Dml((k+1)-1)+(2^-7)*Flk; %calculate speed control parameter if (abs(Dms((k+1))-Dml((k+1))) >= (2^-3)*Dml((k+1))) ap(k+1) = (1-2^-4)*ap((k+1)-1)+2^-3; elseif (y(k) < 3) ap(k+1) = (1-2^-4)*ap((k+1)-1)+2^-3; elseif (td == 1) ap(k+1) = (1-2^-4)*ap((k+1)-1)+2^-3; elseif (tr == 1) ap((k+1)) = 1; else ap(k+1) = (1-2^-4)*ap((k+1)-1); end %scale factor adaptation switch(abs(l(k))) case 7 W(k) = 70.13; case 6 W(k) = 22.19; case 5 W(k) = 12.38; case 4 W(k) = 7.00; case 3 W(k) = 4.00; case 2 W(k) = 2.56; case 1 W(k) = 1.13; case 0 W(k) = -.75; end yu(k+1) = (1-2^-5)*y(k)+(2^-5)*W(k); %calculate (unlocked) scale factor if yu(k+1) < 1.06 %limit yu(k+1) yu(k+1) = 1.06; elseif yu(k+1) > 10.00 yu(k+1) = 10.00; end yl(k+1) = (1-2^-6)*yl((k+1)-1)+(2^-6)*yu(k+1); %calculate locked scaled factor %synchronous coding adjustment sr_unquantized(k) = sr(k) / 2^14; sp(k) = lin2mu(sr_unquantized(k)); %convert to log pcm slx(k) = mu2lin(sp(k)); %convert to linear pcm dx(k) = slx(k)-Se(k); %calculate the difference signal if (dx(k) == 0) dlx(k) = -30; sign = -1; else sign = dx(k)/abs(dx(k)); dlx(k) = log2(abs(dx(k))); end dlnx(k) = dlx(k) - y(k); if (dlnx(k) >= 3.12) %quantize scaled difference signal sd(k) = sign*7; elseif (dln(k) >= 2.72) sd(k) = sign*6; elseif (dln(k) >= 2.34) sd(k) = sign*5; elseif (dln(k) >= 1.91) sd(k) = sign*4; elseif (dln(k) >= 1.38) sd(k) = sign*3; elseif (dln(k) >= .62) sd(k) = sign*2; elseif (dln(k) >= -.98) sd(k) = sign*1; else sd(k) = sign*0; end switch(abs(sd(k))) case 7 if ((dx(k)/2^14) < 3.12) sd(k) = sp(k)+PCM_LEVEL; else sd(k) = sp(k); end case 6 if ((dx(k)/2^14) < 2.72) sd(k) = sp(k)+ PCM_LEVEL; elseif ((dx(k)/2^14) >= 3.12) sd(k) = sp(k) - PCM_LEVEL; else sd(k) = sp(k); end case 5 if ((dx(k)/2^14) < 2.34) sd(k) = sp(k)+PCM_LEVEL; elseif ((dx(k)/2^14) >= 3.72) sd(k) = sp(k) - PCM_LEVEL; else sd(k) = sp(k); end case 4 if ((dx(k)/2^14) < 1.91) sd(k) = sp(k)+PCM_LEVEL; elseif ((dx(k)/2^14) >= 2.34) sd(k) = sp(k) - PCM_LEVEL; else sd(k) = sp(k); end case 3 if ((dx(k)/2^14) < 1.38) sd(k) = sp(k)+PCM_LEVEL; elseif ((dx(k)/2^14) >= 1.91) sd(k) = sp(k) - PCM_LEVEL; else sd(k) = sp(k); end case 2 if ((dx(k)/2^14) < .62) sd(k) = sp(k)+PCM_LEVEL; elseif ((dx(k)/2^14) >= 1.38) sd(k) = sp(k) - PCM_LEVEL; else sd(k) = sp(k); end case 1 if ((dx(k)/2^14) < -.98) sd(k) = sp(k)+PCM_LEVEL; elseif ((dx(k)/2^14) >= .62) sd(k) = sp(k) - PCM_LEVEL; else sd(k) = sp(k); end case 0 if ((dx(k)/2^14) >= -.98) sd(k) = sp(k) - PCM_LEVEL; else sd(k) = sp(k); end end end figure(8), subplot(2,1,1),plot(sr),title('decoder signal reconstruction sr'); subplot(2,1,2),plot(sd),title('decoder mu law encoded output sd');