%Program 11.1 Audio codec
%input: vector x of input signal
%output: vector out of output signal
%Example usage: out=simplecodec(cos((1:2^(12))*2*pi*256/2^(13)),2^13,2,1);
%               example signal is 1/2 sec. pure tone of frequency f = 256
function out=simplecodecW(z,b,c)
if c == 1
    [y,Fs] = wavread(z);
    xx = y';
    x = xx(1:4096*7);
else
    x = z;
    Fs = 2^13;
end
len=length(x);
n=2^5;                                % length of window
nw=floor(len/n);                      % number of length n windows in x
x=x(1:n*nw);                          % cut x to integer number of n windows
%Fs=2^(13);                            % Fs=sampling rate
L=0.3;                           % b = quantization bits, [-L,L] amplitude range
q=2*L/(2^b-1);                        % q used for b bits on interval [-L, L]
for i=1:n                             % form the MDCT matrix
  for j=1:2*n
    M(i,j)= cos((i-1+1/2)*(j-1+1/2+n/2)*pi/n);
  end
end
M=sqrt(2/n)*M;
N=M';                                  % inverse MDCT

x=0.3*x/max(abs(x));                   % normalize signal to max amplitude = 0.3
sound(x,Fs);                            % Matlab's sound command
h = (sqrt(2)*sin(((1:2*n)-1/2)*pi/(2*n)))';
out=[];
for k=1:nw-1                           % loop over length 2n windows
  x0=x(1+(k-1)*n:2*n+(k-1)*n)';
  x0 = x0.*h;
  y0=M*x0;
  y1=round(y0/q);                      % transform components quantized
% Storage/transmission of file occurs here
  y2=y1*q;                             % transform components dequantized
  w(:,k)=N*y2;                         % invert the MDCT
  if(k>1)
      w2=w(n+1:2*n,k-1).*h(n+1:2*n);
      w3=w(1:n,k).*h(1:n);
      out=[out;(w2+w3)/2];             % collect the reconstructed signal
  end                                  % (of length 2n less than length of x)
end
if c ==1
    pause(4)
end
pause(1)
sound(out,Fs)                           % play the reconstructed tone
DIFF = [];

for i=1:len-64                            %this needs to be changed based on the size of the wav file coming in
    DIFF=[DIFF;x(i+32)-out(i)];
end

%Create small intervals to graph/analyze
new_out = [];
new_x = [];
new_DIFF = [];
for i=1:150
    new_out = [new_out;out(i)];
    new_x = [new_x;x(i+32)];
    new_DIFF = [new_DIFF;DIFF(i)];
end

RMSE = rms(DIFF')

subplot(2,2,3);
plot((1:150),new_DIFF);
title('Difference')
xlabel('Steps')
ylabel('Amplitude')


subplot(2,2,1);
plot((1:150),new_x);
title('Normalized Input Signal')
xlabel('Steps')
ylabel('Amplitude')


subplot(2,2,2)
plot((1:150),new_out);
title('Output Signal')
xlabel('Steps')
ylabel('Amplitude')


%subplot(2,2,4)
%plot(1:len,x);
%title('Original Difference')
%xlabel('Steps')
%ylabel('Amplitude')
Error using simplecodecW (line 7)
Not enough input arguments.