↑ arvau

Wikipedia / Goertzel algorithm

The Goertzel algorithm is a technique in digital signal processing (DSP) for efficient evaluation of the individual terms of the discrete Fourier transform (DFT). It is useful in certain practical applications, such as recognition of dual-tone multi-frequency signaling (DTMF) tones produced by the push buttons of the keypad of a traditional analog telephone. The algorithm was first described by Gerald Goertzel in 1958.

Like the DFT, the Goertzel algorithm analyses one selectable frequency component from a discrete signal. Unlike direct DFT calculations, the Goertzel algorithm applies a single real-valued coefficient at each iteration, using real-valued arithmetic for real-valued input sequences. For covering a full spectrum (except when using for continuous stream of data where coefficients are reused for subsequent calculations, which has computational complexity equivalent of sliding DFT), the Goertzel algorithm has a higher order of complexity than fast Fourier transform (FFT) algorithms, but for computing a small number of selected frequency components, it is more numerically efficient. The simple structure of the Goertzel algorithm makes it well suited to small processors and embedded applications.

The Goertzel algorithm can also be used "in reverse" as a sinusoid synthesis function, which requires only 1 multiplication and 1 subtraction per generated sample.

The algorithm

The main calculation in the Goertzel algorithm has the form of a digital filter, and for this reason the algorithm is often called a Goertzel filter, giving the frequency to be analysed, normalised to radians per sample.

: :

The first filter stage can be observed to be a second-order IIR filter with a direct-form. To avoid aliasing is often restricted to the range 0 to π (see Nyquist–Shannon sampling theorem); using a value outside this range is not meaningless, but is equivalent to using an aliased frequency inside this range, since the exponential function.

The second-stage filter can be observed to be a FIR filter, since its calculations do not use any of its past outputs.

Z-transform methods can be applied to study the properties of the filter cascade. The Z transform of the first filter stage given in equation (1) is The Z transform of the second filter stage given in equation (2) is The combined transfer function of the cascade of the two filter stages is then :

Numerical stability

It can be observed that the poles of the filter's Z transform, on a circle of unit radius centered on the origin of the complex Z-transform plane. This property indicates that the filter process is marginally stable and vulnerable to numerical-error accumulation when computed using low-precision arithmetic and long input sequences. A numerically stable version was proposed by Christian Reinsch.

DFT computations

For the important case of computing a DFT term, the following special restrictions are applied.

  • is the number of terms in the input sequence of the DFT.

  • The frequencies chosen for the Goertzel analysis are restricted to the special form

  • indicating the "frequency bin" of the DFT is selected from the set of index numbers

, equation (6) then takes the following form:

. from the summation, thus delivering the intended DFT value.

is used in the final step, Thus, the algorithm can be completed as follows:

  • ,

  • ,

  • produced by the final direct calculation of the filter.

The last two mathematical operations are simplified by combining them algebraically:

and immediately applying equation (2) rather than equation (11) misses the final filter state updates, yielding a result with incorrect phase.

, etc. can be discarded immediately after updating the first stage's internal state.

This seems to leave a paradox: to complete the algorithm, the FIR filter stage must be evaluated once using the final two outputs from the IIR filter stage, while for computational efficiency the IIR filter iteration discards its output values. This is where the properties of the direct-form filter structure are applied. The two internal state variables of the IIR filter provide the last two values of the IIR filter output, which are the terms required to evaluate the FIR filter stage.

Applications

Power-spectrum terms

:

In the pseudocode below, the complex-valued input data is stored in the array x and the variables sprev and sprev2 temporarily store output history from the IIR filter. Nterms is the number of samples in the array, and Kterm corresponds to the frequency of interest, multiplied by the sampling period.

Nterms defined here
Kterm selected here
ω = 2 × π × Kterm / Nterms;
coeff := 2 × cos(ω)

sprev := 0
sprev2 := 0
for each index n in range 0 to Nterms-1 do
    s := x[n] + coeff × sprev - sprev2
    sprev2 := sprev
    sprev := s
end

power := sprev2 + sprev22 - (coeff × sprev × sprev2)

It is possible to organise the computations so that incoming samples are delivered singly to a software object that maintains the filter state between updates, with the final power result accessed after the other processing is done.

Single DFT term with real-valued arithmetic

The case of real-valued input data arises frequently, especially in embedded systems where the input streams result from direct measurements of physical processes. When the input data are real-valued, the filter internal state variables sprev and sprev2 can be observed also to be real-valued, consequently, no complex arithmetic is required in the first IIR stage. Optimizing for real-valued arithmetic typically is as simple as applying appropriate real-valued data types for the variables.

, and filter iterations are terminated, equation (11) must be applied to evaluate the DFT term. The final calculation uses complex-valued arithmetic, but this can be converted into real-valued arithmetic by separating real and imaginary terms:

Comparing to the power-spectrum application, the only difference are the calculation used to finish:

(Same IIR filter calculations as in the signal power implementation) XKreal = sprev * cr - sprev2; XKimag = sprev * ci;

Phase detection

, as discussed in the previous section, using a real-valued or complex-valued input stream. Then the signal phase can be evaluated as taking appropriate precautions for singularities, quadrant, and so forth when computing the inverse tangent function.

Complex signals in real arithmetic

. After that, the two complex-valued partial results can be recombined:

Computational complexity

.

, and the Goertzel algorithm is likely to be faster if

FFT implementations and processing platforms have a significant impact on the relative performance. Some FFT implementations perform internal complex-number calculations to generate coefficients on-the-fly, significantly increasing their "cost K per unit of work." FFT and DFT algorithms can use tables of pre-computed coefficient values for better numerical efficiency, but this requires more accesses to coefficient values buffered in external memory, which can lead to increased cache contention that counters some of the numerical advantage.

Both algorithms gain approximately a factor of 2 efficiency when using real-valued rather than complex-valued input data. However, these gains are natural for the Goertzel algorithm but will not be achieved for the FFT without using certain algorithm variants specialised for transforming real-valued data.

See also

References

Further reading