% phase.m
% David Rowe August 2009
% experiments with phase for sinusoidal codecs

function phase(samname, F0, png)
  Wo=2*pi*F0/8000;
  P=2*pi/Wo;
  L = floor(pi/Wo);
  Nsam = 16000;
  N = 80;
  F = Nsam/N;
  A = 10000/L;
  phi = zeros(1,L);
  s = zeros(1,Nsam);
  
  for m=floor(L/2):L
    phi_off(m) = -m*Wo*8;
  end

  for f=1:F
    phi(1) = phi(1) + Wo*N;
    phi(1) = mod(phi(1),2*pi);
  
    for m=1:L
      phi(m) = m*phi(1);
    end

    x = zeros(1,N);
    for m=1:L
      x = x + A*cos(m*Wo*(0:(N-1)) + phi(m));
    endfor
    s((f-1)*N+1:f*N) = x;
  endfor

  figure(1);
  clf;
  plot(s(1:250));

  fs=fopen(samname,"wb");
  fwrite(fs,s,"short");
  fclose(fs);

  if (nargin == 3)
      % small image to fit blog

      __gnuplot_set__ terminal png size 450,300
      ss = sprintf("__gnuplot_set__ output \"%s.png\"", samname);
      eval(ss)
      replot;

      % for some reason I need this to stop large plot getting wiped
      __gnuplot_set__ output "/dev/null"
  endif

endfunction