Function: gga
GGA Generalized Goertzel algorithm
  Usage:  c = gga(x,fvec)
          c = gga(x,fvec,fs)

  Input parameters:
        x      : Input data.
        fvec   : Indices to calculate. 
        fs     : Sampling frequency.

  Output parameters:
        c      : Coefficient vector.

  c=GGA(f,fvec) computes the discrete-time fourier transform DTFT of
  f at frequencies in fvec as c(k)=F(2pi f_{vec}(k)) where
  F=DTFT(f), k=1,dots K and K=length(fvec) using the generalized
  second-order Goertzel algorithm. Thanks to the generalization, values
  in fvec can be arbitrary numbers in range 0-1 and not restricted to
  l/Ls, l=0,dots Ls-1 (usual DFT samples) as the original Goertzel 
  algorithm is. Ls is the length of the first non-singleton dimension
  of f. If fvec is empty or ommited, fvec is assumed to be
  (0:Ls-1)/Ls and results in the same output as fft.

  c=GGA(f,fvec,fs) computes the same with fvec in Hz relative to fs.

  The input f is processed along the first non-singleton dimension or
  along dimension dim if specified.

  *Remark:**
  Besides the generalization the algorithm is also shortened by one
  iteration compared to the conventional Goertzel.

  Examples:
  ---------
  
  Calculating DTFT samples of interest:

    % Generate input signal
    fs = 8000;
    L = 2^10;
    k = (0:L-1).';
    freq = [400,510,620,680,825];
    phase = [pi/4,-pi/4,-pi/8,pi/4,-pi/3];
    amp = [5,3,4,1,2];
    f = arrayfun(@(a,f,p) a*sin(2*pi*k*f/fs+p),...
                 amp,freq,phase,'UniformOutput',0);
    f = sum(cell2mat(f),2);

    % This is equal to fft(f)
    ck = gga(f);

    %GGA to FFT error:
    norm(ck-fft(f))

    % DTFT samples at 400,510,620,680,825 Hz
    ckgga = gga(f,freq,fs);

    % Plot modulus of coefficients
    figure(1);clf;hold on;
    stem(k/L*fs,2*abs(ck)/L,'k');
    stem(freq,2*abs(ckgga)/L,'r:');
    set(gca,'XLim',[freq(1)-50,freq(end)+50]);
    set(gca,'YLim',[0 6]);
    xlabel('f[Hz]');
    ylabel('|c(k)|');
    hold off;

    % Plot phase of coefficients
    figure(2);clf;hold on;
    stem(k/L*fs,angle(ck),'k');
    stem(freq,angle(ckgga),'r:');
    set(gca,'XLim',[freq(1)-50,freq(end)+50]);
    set(gca,'YLim',[-pi pi]);
    xlabel('f[Hz]');
    ylabel('angle(c(k))');
    hold off;


  References:
    P. Sysel and P. Rajmic. Goertzel algorithm generalized to non-integer
    multiples of fundamental frequency. EURASIP Journal on Advances in
    Signal Processing, 2012(1):56, 2012.
    

Url: http://ltfat.github.io/doc/fourier/gga.html

See also: chirpzt.

Package: ltfat