Praat's f0 estimates are based on autocorrelation. At each time point in a signal, an autocorrelation looks back in time over a range of lags. The lag that achieves the highest correlation is the wavelength of the fundamental frequency. You have to specify how far back you are willing to look; these provide hard bounds on the highest and the lowest fundamental frequency you can find. This is why Praat requires you to provide the pitch range.
This description looks very interesting - but I'm not sure what an "autocorrelation" is and what it means for f0 to estimates to be based on them. If you have a moment, I'd be so grateful if you could elaborate on this. I looked online and through several other linguistic resources, but to no avail. Perhaps its a technical term unfamiliar to my old dictionaries.
The place to look for more information on this is not linguistics but digital signal processing, or, for a more cognitive/artificial intelligence perspective, computational audition. To understand autocorrelation, we first need to define a few terms, the most important of which are
discrete-time signal and
cross-correlation. A discrete-time signal is a sequence of numbers, called
samples, that encodes a signal. For speech, each number expresses the air pressure at a particular time, and the discrete-time signal is a discrete approximation to the continuous speech signal. The
sampling rate is the number of samples per second. The sampling rate is usually set fairly high to provide a good discrete approximation to the continuous signal. So, ultimately, a discrete-time signal is just a very long sequence of numbers.
The cross-correlation of a signal [latex]x[/latex] with a signal [latex]y[/latex] at a lag of [latex]\tau[/latex] is defined as:
[latex](x\star y)( \tau ) = \sum_{t=0}^{\infty} x(t) y(t-\tau) [/latex]
Remember that [latex]x[/latex] and [latex]y[/latex] are just sequences of numbers, and [latex]x(t)[/latex] is just the [latex]t^{\mbox{\scriptsize th}}[/latex] number in the sequence of numbers called [latex]x[/latex]. Because we are multiplying the signals together, this sum will be large when [latex]x[/latex] and [latex]y[/latex] are similar at a particular time lag. (if you are comfortable with linear algebra, note the similarity between this definition and the definition of a dot product.)
An autocorrelation is a cross-correlation where [latex]x[/latex] and [latex]y[/latex] are both the same signal, call it [latex]h[/latex]. An autocorrelation asks how similar a signal is to itself, at a particular time lag. If [latex]h[/latex] is perfectly periodic, with fundamental frequency [latex]f[/latex], then we have:
[latex]h(t) = h\left(t + \frac{1}{f} \right) = h\left(t - \frac{1}{f} \right) [/latex]
for all [latex]t[/latex]. (remember that frequency is the inverse of period). So a periodic signal is maximally similar, maximally correlated, to itself at a lag corresponding to the wavelength of the signal's fundamental frequency. Real speech is not perfectly periodic, because it changes over time, and the vocal folds don't maintain perfectly constant tension, but the same basic principle applies. We can get a pretty reliable estimate of the f0 by searching for the lag that produces the highest correlation over a restricted range of wavelengths corresponding to feasible f0.
I said Praat's approach was based on autocorrelation because Praat does more work to get more reliable estimates. The method just described assumes the signal is periodic (i.e. it never says that there is no f0), and is not specialized to the characteristics of human speech. For the first point, Praat incorporates a system of heuristics to decide when the correlation is too weak to have an f0. For the second point, Praat uses the autocorrelation to return multiple f0 candidates at each time, and then finds a smooth
sequence of estimates to avoid implausibly large and jagged jumps in the f0 trace.
So the overall approach is something like this:
- Decide to estimate the f0 at time [latex]t[/latex].
- Extract a window of the signal around time [latex]t[/latex], producing windowed signal [latex]h[/latex].
- Find a series of f0 candidates [latex]\tau[/latex] that are local maxima in [latex](h \star h)(\tau).[/latex].
- Decide whether there is any f0 at time [latex]t[/latex], and compare the f0 candidates to the f0 candidates of nearby time points.
For the complete algorithm, have a look at
Boersma (1993). It's a pretty old paper (by technology standards) but it doesn't look like much has changed, based on the options in the To Pitch (ac) window.