This is probably a good example of Guido's observation about the
readability of reduce on non-associative arguments: almost always, an
explicit loop would be easier to read.

My bad.

I think this is the kind of PLL that Massalin, around p.99 of her
dissertation, calls a "FLL", for "frequency-locked loop".

Definitely failed to communicate then. It tracks the difference between leading edges of the local oscillator and the signal, so even with matched frequencies, the phase difference gets integrated. (if the frequencies differ enough that there are multiple leading edges for each lagging, then they should sum linearly so the feedback signal is even stronger)

If I understand properly, the dot product style of phase detector has a region where it produces the wrong sign for a stable lock, whereas this detection will lock properly for all phase differences.

-Dave

# odelta: calculate the adjustment by comparing lead/lag of cycle starts
# oprime: scan-update the local oscillator value
odelta  = lambda osc, sig: compare(wav(osc),wav(sig))/4096.0

This looks like a bit of cheating --- for every "sample", you generate a whole new signal as if that oscillation were continued for 1024 samples?
Maybe I didn't understand.


That was an artifact of my tracing output; I was trying to simulate a signal that changed relatively slowly (sig is not the sample, the 1024 elements of wav(sig) are), and because I'm not sure how to express an actual FM signal (product of sines?), it's doing step- function frequency changes. (might be interesting to try with just phase, to see how well this would track phase-shift keying?)

zeroph  = lambda w:   [(i<0 and j>0) for i,j in zip(w[:-1],w[1:])]


 I wonder, would this work
better with (i<0 and j>=0)? With < and > it ought to miss the
zero-crossing occasionally.


True, but in general it's not very robust; you'd probably want to loosen the logic, and look for something that went from significantly below zero to significantly above within a small number of samples, rather than tightening it.

The page I found about LIAs makes them sound like they're just
what I'm doing in the longer C pitch-detection program: taking a
low-pass-filtered "dot product" between the input and a second
90°-offset waveform generated by the oscillator.

The cool thing about LIAs is that they introduce an artificial switching into a signal (the example H&H gives is a telescope that physically switches the mirror back and forth from the subject to a control). This way, stuff that correlates well with the switched condition is highly likely to be signal, and instrument noise will likely be the same no matter which way the switch is pointing. (and 1/f noise should be lower at a high f than at dc) Maybe I haven't understood what you're describing, but it sounds to me more like AM demodulation via PLL.

--
To unsubscribe: http://lists.canonical.org/mailman/listinfo/kragen-discuss

Reply via email to