On Mon, Feb 13, 2012 at 9:39 PM, Nick Foster <address@hidden>
I've been doing some stuff with the pfb clock sync for GMSK (my AIS app again) and had a couple questions. First, a sanity check so you can tell me if I'm just nuts:
BT = 0.35
self.filtersections = 32
self.tapspersection = 20
self.clockrec_sps = 1
gain_mu = 0.03
self._samples_per_symbol = 250.0e3 / 9600.0
self.datafiltertaps = gr.firdes.gaussian(1, self._samples_per_symbol*self.filtersections, BT, self.tapspersection*self.filtersections)
self.clockrec = gr.pfb_clock_sync_ccf(self._samples_per_symbol, gain_mu, self.datafiltertaps, self.filtersections, 0, 1.15, self.clockrec_sps)
Am I constructing the filter correctly? If not, don't bother reading further, just tell me I'm a rube and move on. =)
If not, increasing the output samples per symbol (self.clockrec_sps above) to 2 seems to cause the clock recovery to go off into the weeds. Any reason for this? Does the filter construction need to change when using multiple osps?
I actually tried using this block for GMSK when we transitioned to 3.5 but ended up using it incorrectly and had to revert back to the old way. I think I might now see what I did wrong, and I think it's in the naming of the second input to the firdes.gaussian design function. It's called "spb," but it really looks like it's supposed to take the inverse number of samples/baud.
There is a program called gr_filter_design.py that is installed into $prefix/bin that you can use to see what a filter looks like when you design it. You can plug your numbers in there and see what the freq and time domain plots will look like. What you want is a massively oversampled filter in the frequency domain, so something with a small passband and lots of stopband rippling. In the time domain, this looks like a single cycle of a Guassian pulse (which is good, since the derivative will have a minimum right at the peak -- exactly what we want).
So see if the numbers you want to use make a filter that looks reasonable in this program, first. But otherwise, the basic approach you have above seems correct.