On Fri, 2008-01-11 at 18:30 +0100, Matteo Sisti Sette wrote:
With the default fiddle~ settings, it seems to output 0 about 15% of the time, which seems quite a lot to me.
With pure noise as an input? Quite a lot????? IF it is supposed to output 0 when it can't find a pitch, I would expect to output 0 about 90% of the time with pure noise as input!!
The thing is that fiddle~'s Maximum Liklihood pitch detector, like most other PDAs takes a relatively small 'window' of sample data and tries to find periodicity in it. It doesn't care about anything else.
Most small 'windows' taken from noise generators have some discernable periodicity. There are two important things about this i) the very fact of windowing the signal imposes an artificial periodicity on it, ii) any PDA based on an FFT/STFT assumes that the windowed signal is periodic, because the FFT assumes this. You can try this as an experiment: take a 1024 sample of a noise wave form, and play it back with tabosc~. It will have a disernable sense of pitch.
I said that 15% seems like quite a lot because generally speaking noise tolerance is generally considered to be a good quality in PDAs. Given the same test conditions as I used above, The 'f0' function in libxtract failed to find a fundamental less than 0.5% of the time and over 5000 frames 'failsafe_f0' failed 0% of the time. However, these functions are a _lot_ less efficient than fiddle~ and have different design goals.
Anyhow, I think this is a case of using the wrong tool for the job. Pitch/f0 estimators (PDAs) are designed to find pitch in a signal, not to measure noisiness. There are other tools to measure this
Maybe. The fact is that I do want to find a pitch, but I consider "none" as a possible value, i.e. I want to find the pitch if the signal reasonably has one, and ignore it when it is most probably garbage.
I think that's reasonable. Both 'f0' and 'failsafe_f0' give their output on a block-by-block basis, and will give '0' if they can't find a pitch. In addition the function have a return code that indicates whether the function has failed or succeeded, but this isn't accessible from the Pd extern.
I thought there were two kinds of pitch trackers: those which do have a "none" value, and those which assume a pitch must exist and output their best estimation always. (well and a "fuzzy" third type, which always give both a pitch value and an estimated reliability value).
I think the estimated reliability is quite difficult. But should be possible if another metric is used in combination with f0.
How do you measure (or define) spectral irregularity?
There are two definitions, one by Krimphoff (1994), and one by Jensen (1999).
In Latex maths code:
Krimphoff:
Irregularity = \sum_{k=2}^{N-1} |a_k - \frac{a_{k-1} + a_k + a_{k+1}} {3}|
Jensen:
Irregularity = \frac{\sum_{k=1}^{N} (a_k - a_{k+1})} {\sum_{k=1}^N a_k^2}
I may want to use spectral irregularity to estimate whether the signal is non-noisy and then use fiddle to get the pitch when it is supposed to exist; I just thought that nobody better than the pitchtracker itself could tell me how difficult it is for it to find the pitch!
You might want to look at some other features as well, there is quite a good Noisiness measure based on (I think) the spectral flatness measure (SFM) of Bark coefficients.
Jamie