DSPRelated.com
Forums

Spectral Shaping using a PLL Loop Filter

Started by Jon Mcleod February 3, 2008
Sorry to revisit this..

I'm trying (again) to directly generate an 930MHz FSK signal.  My 
"baseband" is a NRZ square wave switching the profile pin on a DDS.  I'm 
then multiplying the DSS output with a PLL/VCO to generate a 930MHz carrier.

For simplicity, I want to use the PLL loop filter for spectral shaping, 
to buff out the instantaneous frequency changes and get the final output 
within the FCC mask.

If this is possible, to make it work, I would need a loop filter that 
spectrally shaped the output to be the equivalent of what you'd get from 
a 10th order bessel baseband filter w/3.9kHz 3db bandwidth.

What I'm looking for is information on how to "translate" between a 
baseband filter with <x> performance specs to the equivalent loop filter 
with <y> performance specs.  Or -- is this possible, or am I just way 
out in left field?

[I got some other great suggestions here a few months ago about doing it 
digitally in the baseband, but that's beyond the scope of this project 
for now..]
On Sun, 03 Feb 2008 09:22:21 -0500, Jon Mcleod
<jonmcleod2003@yahoo.com> wrote:

>Sorry to revisit this.. > >I'm trying (again) to directly generate an 930MHz FSK signal. My >"baseband" is a NRZ square wave switching the profile pin on a DDS. I'm >then multiplying the DSS output with a PLL/VCO to generate a 930MHz carrier. > >For simplicity, I want to use the PLL loop filter for spectral shaping, >to buff out the instantaneous frequency changes and get the final output >within the FCC mask. > >If this is possible, to make it work, I would need a loop filter that >spectrally shaped the output to be the equivalent of what you'd get from >a 10th order bessel baseband filter w/3.9kHz 3db bandwidth.
Strictly speaking, you want to give the closed loop transfer function of the PLL a particular shape. The loop filter itself will not be a 10th order Bessel.
>What I'm looking for is information on how to "translate" between a >baseband filter with <x> performance specs to the equivalent loop filter >with <y> performance specs. Or -- is this possible, or am I just way >out in left field?
Close to possible, but not quite. You can draw the feedback loop yourself, and solve it for the transfer function (see below). The problem is that you won't be able to get your required 10th order lowpass shape in a practical PLL. What you *can* do is get some amount of lowpass filtering, which is good for removing the out of band spurious signals from your DDS. This will probably be needed to meet certain regulatory requirements.
>[I got some other great suggestions here a few months ago about doing it >digitally in the baseband, but that's beyond the scope of this project >for now..]
For me, 10th order anything screams digital, not analog. Note: Basic PLL block diagram (ignoring R (input) and N (feedback) dividers, because they don't change the argument) and also ignoring sampling effects (which is a reasonable assumption if the closed loop bw is much less than one tenth of the reference frequency): TH_in(s) +------+ +------+ +------+ --------->| PFD | | Loop | | VCO | TH_out(s) | |-->| Filt |---| |---+-------> +-->| | | | | | | | +------+ +------+ +------+ | | | +------------------------------------+ TH_in(s) and TH_out(s) represent the angles (i.e. phases) at the input and output. (Units: radian) PFD is the phase / frequency detector (although when it's locked, the frequency detector part doesn't come into play). It has the transfer function Kd. (Units: usually amp/radian for a current output phase detector (the most common type). Sometimes volt / radian.) Loop Filt is the loop filter that you design. It has the transfer function G(s). We will usually go for 0 frequency error, which means that we need a type II loop, and G(s) must contain a factor of 1/s. (Units: volt / amp if the phase detector has a current output) The VCO is the voltage controlled oscillator. It will have the transfer function Kv/s. (Units: (radian/second)/volt ) Add a minute of high school algebra, and you get the following PLL transfer function: TH_out Kd G(s) Kv/s ------(s) = ----------------------- TH_in (1 + Kd G(s) Kv/s) You want this to be an approximation of the transfer function of a 10th order low pass Bessel. Then solve for G(s), remembering that G(s) must contain the factor 1/s. If we assume that G(s) is a rational polynomial in s (i.e. we have a hope of making it from actual physical components), then it can have the form: N(s) G(s) = --------- s D(s) Where N and D are polynomials in s. (N, D stand for Numerator and Denominator, btw.) The PLL transfer function then simplifies to: TH_out Kd Kv N(s) ------(s) = ----------------------- TH_in s^2 D(s) + Kd Kv N(s) I haven't convinced myself that it is possible to find a solution here. I'm tempted to say it isn't possible, but I can't prove it (at half past two in the morning). Perhaps someone who knows what they are talking about might like to comment. I think the basic problem is that we can't position the roots of D(s) without having N a function of s. This means that the transfer function will have zeros spread across the s plane, and can never have an exact Bessel shape (which would have all ten zeros at the origin). Even it we can't get the desired Bessel shape, we still might be able to get some reasonable filtering. Regards, Allan

Jon Mcleod wrote:
> Sorry to revisit this.. > > I'm trying (again) to directly generate an 930MHz FSK signal. My > "baseband" is a NRZ square wave switching the profile pin on a DDS. I'm > then multiplying the DSS output with a PLL/VCO to generate a 930MHz > carrier. > > For simplicity, I want to use the PLL loop filter for spectral shaping, > to buff out the instantaneous frequency changes and get the final output > within the FCC mask. > > If this is possible, to make it work, I would need a loop filter that > spectrally shaped the output to be the equivalent of what you'd get from > a 10th order bessel baseband filter w/3.9kHz 3db bandwidth. > > What I'm looking for is information on how to "translate" between a > baseband filter with <x> performance specs to the equivalent loop filter > with <y> performance specs. Or -- is this possible, or am I just way > out in left field?
It is certainly possible to design the PLL transfer function so its frequency response will resemble that of the 9th order Bessel. However I would expect this to have a very complicated loop filter which would be highly sensitive to the loop gain and the values of the components. Besides, this filter is not going to be optimal for the minimum PLL noise requirement. So, I would avoid this because of the practical considerations. However, depending on your data rate and the required frequency deviation, you may fit into the FCC spectral template while using the filter of the lower order. That will simplify the task quite a bit.
> [I got some other great suggestions here a few months ago about doing it > digitally in the baseband, but that's beyond the scope of this project > for now..]
That's exaclty what I did for the paging transmitter many years ago. The digital FIR filter, then DDS, then PLL. Vladimir Vassilevsky DSP and Mixed Signal Design Consultant http://www.abvolt.com
On Mon, 04 Feb 2008 02:33:42 +1100, Allan Herriman
<allanherriman@hotmail.com> wrote:

>On Sun, 03 Feb 2008 09:22:21 -0500, Jon Mcleod ><jonmcleod2003@yahoo.com> wrote: > >>Sorry to revisit this.. >> >>I'm trying (again) to directly generate an 930MHz FSK signal. My >>"baseband" is a NRZ square wave switching the profile pin on a DDS. I'm >>then multiplying the DSS output with a PLL/VCO to generate a 930MHz carrier. >> >>For simplicity, I want to use the PLL loop filter for spectral shaping, >>to buff out the instantaneous frequency changes and get the final output >>within the FCC mask. >> >>If this is possible, to make it work, I would need a loop filter that >>spectrally shaped the output to be the equivalent of what you'd get from >>a 10th order bessel baseband filter w/3.9kHz 3db bandwidth. > >Strictly speaking, you want to give the closed loop transfer function >of the PLL a particular shape. The loop filter itself will not be a >10th order Bessel. > >>What I'm looking for is information on how to "translate" between a >>baseband filter with <x> performance specs to the equivalent loop filter >>with <y> performance specs. Or -- is this possible, or am I just way >>out in left field? > >Close to possible, but not quite. You can draw the feedback loop >yourself, and solve it for the transfer function (see below). The >problem is that you won't be able to get your required 10th order >lowpass shape in a practical PLL. > >What you *can* do is get some amount of lowpass filtering, which is >good for removing the out of band spurious signals from your DDS. This >will probably be needed to meet certain regulatory requirements. > >>[I got some other great suggestions here a few months ago about doing it >>digitally in the baseband, but that's beyond the scope of this project >>for now..] > >For me, 10th order anything screams digital, not analog. > > >Note: > >Basic PLL block diagram (ignoring R (input) and N (feedback) dividers, >because they don't change the argument) and also ignoring sampling >effects (which is a reasonable assumption if the closed loop bw is >much less than one tenth of the reference frequency): > >TH_in(s) +------+ +------+ +------+ >--------->| PFD | | Loop | | VCO | TH_out(s) > | |-->| Filt |---| |---+-------> > +-->| | | | | | | > | +------+ +------+ +------+ | > | | > +------------------------------------+ > > >TH_in(s) and TH_out(s) represent the angles (i.e. phases) at the input >and output. (Units: radian) > >PFD is the phase / frequency detector (although when it's locked, the >frequency detector part doesn't come into play). It has the transfer >function Kd. (Units: usually amp/radian for a current output phase >detector (the most common type). Sometimes volt / radian.) > >Loop Filt is the loop filter that you design. It has the transfer >function G(s). We will usually go for 0 frequency error, which means >that we need a type II loop, and G(s) must contain a factor of 1/s. >(Units: volt / amp if the phase detector has a current output) > >The VCO is the voltage controlled oscillator. It will have the >transfer function Kv/s. (Units: (radian/second)/volt ) > >Add a minute of high school algebra, and you get the following PLL >transfer function: > >TH_out Kd G(s) Kv/s >------(s) = ----------------------- >TH_in (1 + Kd G(s) Kv/s) > >You want this to be an approximation of the transfer function of a >10th order low pass Bessel. > >Then solve for G(s), remembering that G(s) must contain the factor >1/s. > >If we assume that G(s) is a rational polynomial in s (i.e. we have a >hope of making it from actual physical components), then it can have >the form: > N(s) >G(s) = --------- > s D(s) > >Where N and D are polynomials in s. (N, D stand for Numerator and >Denominator, btw.) > >The PLL transfer function then simplifies to: > >TH_out Kd Kv N(s) >------(s) = ----------------------- >TH_in s^2 D(s) + Kd Kv N(s) > > >I haven't convinced myself that it is possible to find a solution >here. I'm tempted to say it isn't possible, but I can't prove it (at >half past two in the morning). Perhaps someone who knows what they >are talking about might like to comment. >I think the basic problem is that we can't position the roots of D(s) >without having N a function of s. This means that the transfer >function will have zeros spread across the s plane, and can never have >an exact Bessel shape (which would have all ten zeros at the origin). > > >Even it we can't get the desired Bessel shape, we still might be able >to get some reasonable filtering. > >Regards, >Allan
It just (3am now) occured to me that the OP might be having problems with the concept of the transfer function of a PLL, and how that relates to the bandpass filtering effect of that PLL. The transfer function (from above) is equivalent to the baseband filter you would apply to your baseband modulating signal before upconversion. (I made some assumptions regarding linearity, but I think they hold in the OP's case.) Also, what I said earlier about the dependence of N(s) on D(s) only applies for passive loop filters. You can have much better control of the positions of the roots of D(s) with an active filter (or even passive filter stages with active buffers between them). Regards, Allan
Thanks to Allan and Vladimir for this info -- it's really a great help!

The discussion of the relationship between the two filter types is 
great.  I've never seen it presented in this way.

What you are describing jibes with what I saw poking around with this a 
few months ago.  I was just hobbying with it, but I basically couldn't 
get the final signal completely in the channel without starting to 
distort it.

And I 100% agree with both of you -- interpolating and filtering the 
"square wave" into a set of FM frequency offsets is the way to go.  But 
my setup is wrong.  The ARM7 eval board can't do enough taps in real 
time, the DDS isn't really quite right either because of the vast amount 
of work required to load frequency words.  Don't get me wrong -- it 
would be a great learning experience to have a go at a small transmitter 
like Vladimir describes.  But I'd have to change a lot of hardware and I 
don't they'll give me the flexibility here to do it  .. (and I'm too 
overloaded to sneak it in right now, despite the temptation!)
On Sun, 03 Feb 2008 09:22:21 -0500,
Jon Mcleod wrote:

>>> Sorry to revisit this.. >>> >>> I'm trying (again) to directly generate an 930MHz FSK signal. My >>> "baseband" is a NRZ square wave switching the profile pin on a DDS. I'm >>> then multiplying the DSS output with a PLL/VCO to generate a 930MHz carrier. >>> >>> For simplicity, I want to use the PLL loop filter for spectral shaping, >>> to buff out the instantaneous frequency changes and get the final output >>> within the FCC mask. >>>
On Mon, 04 Feb 2008 02:33:42 +1100 Allan Herriman replied: >> <..snip..> >>
>> I haven't convinced myself that it is possible to find a solution >> here. I'm tempted to say it isn't possible, but I can't prove it (at >> half past two in the morning). Perhaps someone who knows what they >> are talking about might like to comment. >> I think the basic problem is that we can't position the roots of D(s) >> without having N a function of s. This means that the transfer >> function will have zeros spread across the s plane, and can never have >> an exact Bessel shape (which would have all ten zeros at the origin). >> >> Even it we can't get the desired Bessel shape, we still might be able >> to get some reasonable filtering.
I forgot to mention that this is 4-level FSK, which makes the constant group delay very important. In playing around with this, it was possible to get the signal into the transmission mask, but it wound up being very distorted. As a follow-up, it looks to my like if I use the "linear sweep mode" of the DDS, and make the transition between each symbol take the same amount of time, the end result can look a lot like a high-order bessel premodulation filter. As long as the transition time is the same between each symbol (inner or outer), the group delay seems to be constant. The loop filter doesn't need to be tight. The worst-case transition time (outer symbol) seems to control the OOBE -- the faster the transition, the wider the bandwidth.. makes sense. This looks like it *might* work. The uC has enough bandwidth to load the sweep parameters in real time for each symbol transition. Any comments are welcome!!