* Fourier Series Function for SPICE
.control
  begin
   if ($argc lt 4)
 	 echo	Error: Too few arguments.
	 echo	'      'Spectrum produces a plot containing a fourier series transformation of 
	 echo   '      'the specified vectors
	 echo   usage: spectrum startfreq stop step vec [[vec] ...]
	 goto bottom
   end
   
   if ( time eq time ) 
      foreach vec $argv[4-len]
         if ( $vec eq $vec )
	     else
            goto bottom
	     end
      end
   else
      echo '       'Spectrum can not work without a time vector from a transient analysis.
      goto bottom
   end
   
   set dt=$curplot
   set title=$curplottitle
   set curplot=new
   set scratch=$curplot
   let span={$dt}.time[length({$dt}.time)-1]-{$dt}.time[0]
   if ($argv[3] gt 0.999/span)
       let fpoints= ( $argv[2] - $argv[1] ) / $argv[3] +1
	   if (fpoints < 2)
	       echo frequency start stop or step not correctly specified
		   goto cleanup
	   end
   else
       echo   Error: time span is not long enough for a step frequency of $argv[3] Hz
	   goto cleanup
   end
   let lent = length({$dt}.time)
   set lent = "$&lent"
   let nyquist = {$lent}/2/span
   if ($argv[2] gt nyquist)
       echo   Error: The nyquist limit is exceeded, try a frequency less than "$&nyquist" Hz
	   goto cleanup
   end
   set fpoints="$&fpoints"
   set curplot=new
   set spec=$curplot
   set curplottitle=$title
   set curplotname='Spectrum Analysis'
   let frequency=vector( $fpoints )*$argv[3]
   dowhile frequency[1] < ( $argv[1] + 1e-9 )
       let frequency = frequency + $argv[3]
   end
   foreach vec $argv[4-len]
       let $vec = vector( $fpoints ) + j(vector( $fpoints ))
	   reshape $vec [{$fpoints}]
   end
   set curplot=$scratch
   let npers=1
   let test = span-2/$argv[3] + 1e-9
   while test > 0
       let npers = npers + 1
       let test = test-1/$argv[3]
   end
   let ircle = 2*pi*max(-1,({$dt}.time-{$dt}.time[{$lent}-1])*{$argv[3]}/npers)
   let win = 1 - cos(ircle)
   let ircle = npers*ircle
   let circle = ircle * ({$spec}.frequency[0]/$argv[3] - 1)
   let k=vector( $fpoints ) 
   foreach k "$&k"
      let circle = circle + ircle 
      foreach vec $argv[4-len]
	  let tmp = win*{$dt}.{$vec}
          let {$spec}.{$vec}[{$k}] = 2*(mean(cos(circle)*tmp),mean(sin(circle)*tmp))
      end
   end
   
   label cleanup
   destroy $scratch
   unset fpoints dt scratch spec vec k title lent
   label bottom
 end
