|
From: | Bob McGwier |
Subject: | Re: [Discuss-gnuradio] AGC loop |
Date: | Tue, 19 Sep 2006 13:36:55 -0400 |
User-agent: | Mozilla Thunderbird 1.0.8-1.4.1 (X11/20060420) |
Tom:A good agc has at least two time constants. One for attack and one for decay. Your attack is much too slow.
tmp = (reference - sqrt(real(y)^2 + imag(y)^2)); rate = rate1; if tmp > gain rate = rate2; gain += tmp*rate;rate2 is decay (where gain needs to be increased) and rate1 is attack where gain needs to be decreased. rate1 > rate2 and rate1 must be fast enough that you do not clip and destroy the first bits of information in a packet. If the packet has some idles, or other announcement data, then you want to recover fast enough to recover receiver parameters such as clock and carrier in addition to gain. Since you are doing dsp and have data in buffers, you can do noncausal agc as well. I do sense of the required signal level three time constants ahead of the place I apply the actual gain where time constant is determined by the attack rate. This works spectacularly well in DttSP. In addition to this, we actually complicate things a bit more much to our advantage by having two tracks of agc. One where rapids peaks and impulses flatten the gain but they release quickly. The other is a slower agc channel. The gain is the min of the two gains. Again, from all indications of the users of the SDR-1000, this is a spectacular agc. We allow for thresholded agc which does decrease the dynamic range but this is subject to user preference. Where you are doing data, and not listening to it, you probably don't care about thresholding.
Bob Tom Rondeau wrote:
Ok, so I've been working on the digital modulations, and everything works great except when I put in the AGC loop. It jumps up in gain when there is no signal applied and then takes too long to converge when the signal comes in. The result is that it almost always misses the first packet before converging to receive the rest of a burst of packets. Taking the AGC loops out will work when the transmitter amplitude and receiver gain are set within a reasonable range, but we're of course loosing dynamic range this way. I've played with the rate of the AGC to no avail, and we have a limiter in there to clamp the gain, but again, if we clamp too much, we'll loose dynamic range. The implementation is a straight-forward and simple AGC: gain += (reference - sqrt(real(y)^2 + imag(y)^2))*rate Where the reference is the value to converge to (+-1 usually) and the rate is the slew rate of the loop. I'm looking at Frerking's "Digital Signal Processing in Communications Systems" for a possible solution. His AGC circuit is a similar approach to the one above with a few more parts like a log(), integrator, blah blah blah. I'm concerned with adding too much more to the AGC loop for computational concerns, though, but will if it's the best way to go. Does anyone have any recommendations? Is it worth implementing a more complicated circuit to improve the acquisition time of the AGC? Or am I looking in the wrong direction? Thanks, Tom _______________________________________________ Discuss-gnuradio mailing list address@hidden http://lists.gnu.org/mailman/listinfo/discuss-gnuradio
-- Robert W. McGwier, Ph.D. Center for Communications Research 805 Bunn Drive Princeton, NJ 08540 (609)-924-4600 (sig required by employer)
[Prev in Thread] | Current Thread | [Next in Thread] |