Reply by April 30, 20092009-04-30
On Apr 30, 3:43&#4294967295;pm, "Fred Marshall" <fmarshallx@remove_the_x.acm.org>
wrote:
> bellda2...@cox.net wrote: > > Hi Fred, > > > I meant the a half-band with f(0)=1.0, if the code to generate on is > > readily available. > > > Thanks, > > > Dirk > > Here is a quickie but the transition bands have bumps in them which is > unecessary. &#4294967295;This means it was an early version of my code. &#4294967295;I don't know if > the 1.0 at f=0 constraint is built into a later version. I can keep looking. > Anyway, you can look at the passband to see how it looks. &#4294967295;You can also look > in the stopband to see that there's a double zero at fs/2. > > This works out because: > > A halfband filter response is made up of a constant = 0.5 and an > antisymmetric component that is 0.5 in the passband and -0.5 in the > stopband. &#4294967295;When added together, the components yield 1.0 in the passband and > zero in the stopband (+/- the ripples of course). &#4294967295;If the frequency response > has a constant term, in this case 0.5, then the temporal response must be > 0.5 at "DC" or, really, at time zero. > So, we can design the antisymmetric filter and then just add the center > coefficient of 0.5. &#4294967295;That's a way to look at it. > > The approximation only needs to be done in the passband because the > structure guarantees that fs/4=0.5 (or zero) and guarantees the response > from fs/4 to fs/2 is antisymmetric. > > Thinking of it this way, if the frequency response is 1.0 at f=0 and the > components are as described above, then the frequency response at fs/2 must > be zero. &#4294967295;Indeed, you see a double zero there. > > Anyway, here is that imperfect (if not interesting) filter set of coeff's: > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; -0.318178627640009E-02 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.624465197324753E-02 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; -0.656183436512947E-02 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.963471177965403E-02 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; -0.100250272080302E-01 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.103756394237280E-01 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; -0.913409423083067E-02 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.710289599373937E-02 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; -0.520208990201354E-02 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.379590759985149E-02 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; -0.529637048020959E-02 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.101068196818233E-01 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; -0.219537038356066E-01 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.439153611660004E-01 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; -0.934268832206726E-01 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.313605815172195E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.500000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.313605815172195E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; -0.934268832206726E-01 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.439153611660004E-01 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; -0.219537038356066E-01 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.101068196818233E-01 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; -0.529637048020959E-02 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.379590759985149E-02 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; -0.520208990201354E-02 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.710289599373937E-02 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; -0.913409423083067E-02 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.103756394237280E-01 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; -0.100250272080302E-01 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.963471177965403E-02 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; -0.656183436512947E-02 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.624465197324753E-02 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295;0.000000000000000E+00 > &#4294967295; &#4294967295; &#4294967295; &#4294967295; &#4294967295; -0.318178627640009E-02 > > I'll see if I can't find better code than what created this example. > > Fred
Thanks Fred, It does just what you advertised (not that I doubted you, I just wanted to see the response). Very interesting, I will have to reread your method. Thanks again, Dirk
Reply by Fred Marshall April 30, 20092009-04-30
bellda2005@cox.net wrote:
> Hi Fred, > > I meant the a half-band with f(0)=1.0, if the code to generate on is > readily available. > > Thanks, > > Dirk
Here is a quickie but the transition bands have bumps in them which is unecessary. This means it was an early version of my code. I don't know if the 1.0 at f=0 constraint is built into a later version. I can keep looking. Anyway, you can look at the passband to see how it looks. You can also look in the stopband to see that there's a double zero at fs/2. This works out because: A halfband filter response is made up of a constant = 0.5 and an antisymmetric component that is 0.5 in the passband and -0.5 in the stopband. When added together, the components yield 1.0 in the passband and zero in the stopband (+/- the ripples of course). If the frequency response has a constant term, in this case 0.5, then the temporal response must be 0.5 at "DC" or, really, at time zero. So, we can design the antisymmetric filter and then just add the center coefficient of 0.5. That's a way to look at it. The approximation only needs to be done in the passband because the structure guarantees that fs/4=0.5 (or zero) and guarantees the response from fs/4 to fs/2 is antisymmetric. Thinking of it this way, if the frequency response is 1.0 at f=0 and the components are as described above, then the frequency response at fs/2 must be zero. Indeed, you see a double zero there. Anyway, here is that imperfect (if not interesting) filter set of coeff's: -0.318178627640009E-02 0.000000000000000E+00 0.624465197324753E-02 0.000000000000000E+00 -0.656183436512947E-02 0.000000000000000E+00 0.963471177965403E-02 0.000000000000000E+00 -0.100250272080302E-01 0.000000000000000E+00 0.103756394237280E-01 0.000000000000000E+00 -0.913409423083067E-02 0.000000000000000E+00 0.710289599373937E-02 0.000000000000000E+00 -0.520208990201354E-02 0.000000000000000E+00 0.379590759985149E-02 0.000000000000000E+00 -0.529637048020959E-02 0.000000000000000E+00 0.101068196818233E-01 0.000000000000000E+00 -0.219537038356066E-01 0.000000000000000E+00 0.439153611660004E-01 0.000000000000000E+00 -0.934268832206726E-01 0.000000000000000E+00 0.313605815172195E+00 0.500000000000000E+00 0.313605815172195E+00 0.000000000000000E+00 -0.934268832206726E-01 0.000000000000000E+00 0.439153611660004E-01 0.000000000000000E+00 -0.219537038356066E-01 0.000000000000000E+00 0.101068196818233E-01 0.000000000000000E+00 -0.529637048020959E-02 0.000000000000000E+00 0.379590759985149E-02 0.000000000000000E+00 -0.520208990201354E-02 0.000000000000000E+00 0.710289599373937E-02 0.000000000000000E+00 -0.913409423083067E-02 0.000000000000000E+00 0.103756394237280E-01 0.000000000000000E+00 -0.100250272080302E-01 0.000000000000000E+00 0.963471177965403E-02 0.000000000000000E+00 -0.656183436512947E-02 0.000000000000000E+00 0.624465197324753E-02 0.000000000000000E+00 -0.318178627640009E-02 I'll see if I can't find better code than what created this example. Fred
Reply by April 30, 20092009-04-30
On Apr 30, 3:03&#4294967295;am, "Fred Marshall" <fmarshallx@remove_the_x.acm.org>
wrote:
> bellda2...@cox.net wrote: > > > Interesting, Fred. &#4294967295;Could you post the coefficients of an example > > filter? > > > Thanks, > > > Dirk > > Dirk, > > Actually, it really does depend on which type so if you're a bit more > specific then I could see if I still have the code that will generate it. > The Hermann-Schussler work was done quite long ago. > > Do you mean a half-band with f(0)=1.0 ??? or something else? > > Fred
Hi Fred, I meant the a half-band with f(0)=1.0, if the code to generate on is readily available. Thanks, Dirk
Reply by Fred Marshall April 30, 20092009-04-30
Fred Marshall wrote:
> bellda2005@cox.net wrote: >> >> Interesting, Fred. Could you post the coefficients of an example >> filter? >> >> Thanks, >> >> Dirk > > Dirk, > > Actually, it really does depend on which type so if you're a bit more > specific then I could see if I still have the code that will generate > it. The Hermann-Schussler work was done quite long ago. > > Do you mean a half-band with f(0)=1.0 ??? or something else? > > Fred
In the mean time, here is some insight into equality constraints: In the standard Remez algorithm (and this would be true of any approach reaching minimax criteria), the ripple peaks alternate in sign and there are generally N+1 such peaks where N is the number of variables (e.g. filter coefficients). On rare occasions there are N+2. If you impose an equality constraint (such as 1.0 at f=0), then you might visualize this as "pushing" the function toward that value. And, you might think of this point as having infinite weight re: the error .. thus forcing the error to zero. So, if the weight is infinite at that point it's as if there's a peak in the error (even though it's very small in magnitude due to the weighting - or even zero .. which is fine). The function "pushes back" in some direction. As it turns out then, each such equality point takes up the place of an error peak and, although you can't readily "see" it, the sign of this error is as any of the others - that is, it's in the set of peaks whose signs alternate. Accordingly, since there's no perceptible error at this point, it appears that the adjacent error peaks "skip" an alternation - the adjacent error peaks have the same sign and the point of equality "uses up" the "missing" alternating peak. All this leads to a modified Remez algorithm .. with proofs, etc. which takes into consideration the "modified sign alternation property". Since the equality constraint must be represented in the set of equations that are being solved at each step, and because this equation has no error value to be equalized along with the others (it has zero error value), it uses up one degree of freedom. And, because of this, the equalized error (the ripple peaks) go up relative to not having imposed the constraint. From ripple magnitude perspective, it's like having a FIR filter with one less coefficient. Fred
Reply by Fred Marshall April 30, 20092009-04-30
bellda2005@cox.net wrote:
> > Interesting, Fred. Could you post the coefficients of an example > filter? > > Thanks, > > Dirk
Dirk, Actually, it really does depend on which type so if you're a bit more specific then I could see if I still have the code that will generate it. The Hermann-Schussler work was done quite long ago. Do you mean a half-band with f(0)=1.0 ??? or something else? Fred
Reply by April 26, 20092009-04-26
On Apr 23, 11:44&#4294967295;pm, "Fred Marshall" <fmarshallx@remove_the_x.acm.org>
wrote:
> bellda2...@cox.net wrote: > > On Apr 22, 10:53 pm, dbd <d...@ieee.org> wrote: > >> On Apr 22, 3:20 pm, bellda2...@cox.net wrote: > > >>> ... > > >>> Just curious, why do want to constrain the gain at DC to be exactly > >>> 1.0? > > .................................... > > > > > I was actually interested in Fred's response, since he brought it up; > > I thought he might have a different reason. > > > Thanks for your input. > > > Dirk > > Oh, I didn't mean to suggest there was (or wasn't) a good reason for doing > it, just that it could be done. &#4294967295;If you do a minimax design and constrain > the DC value to be 1.0 while the mid-point between the ripple peaks is also > 1.0 then you use up one degree of freedom and the ripple magnitude is larger > than it needs to be otherwise. > > In a typical halfband filter this also forces the response at fs/2 to be > zero. > > One of my "things" is equality-constrained minimax design so I find things > like this interesting. &#4294967295;And, I had done exactly this for a while in my > halfband design program. > > In general, the DC value (well all the band edges) will be a ripple peak. > And, you can force that value to be 1.0 by scaling. &#4294967295;Here's a trick I've > used in minimax design to get all-positive stopband ripple leading up to > Hermann-Schussler equiripple minimum phase FIR designs: > > Start with the stopband desired gain at zero. > At the next iteration of the Remez algorithm, increase the desired stopband > gain to be the same as the equalized error (which is not yet the peak > ripple). &#4294967295;The equalized error grows at each iteration so you continue to do > this until you reach convergence. &#4294967295;(The error peaks decrease with each > iteration at the same time). &#4294967295;When it's converged, the stopband value will > be equal to the ripple peak magnitude and the negative going peaks will be > zero-valued. > > [I've done this successfully and worked on a convergence proof but didn't > quite finish it. &#4294967295;It seems a useful extension to the Remez algorithm and > could stand having that proof. &#4294967295;Good grad student exercise I should think.] > > You could do the same in the passband but it's not quite as cool: > Start with the passband desired value at 1.0. > Then, in the next iteration, make the passband desired value equal to 1.0 > minus (or plus) the equalized error. > If the DC value is going to be at a positive peak then it will end up at > 1.0. > If the DC value is going to be at a negative peak then it will end up at 1.0 > minus 2x the peak ripple. > You could always run it twice: one with 1.0 minus... and one with 1.0 > plus... > Of course, all this does is scale the result but there's no loss of degrees > of freedom. &#4294967295;You might just as well divide all the coefficients by (1.0 + > peak) after the filter is designed to get the DC value to be 1.0 AND not > lose degrees of freedom. > But then, the ripple is all one-sided and deviates 2x if a passband of 1.0 > is what you wanted. &#4294967295;You may well be better off losing one degree of freedom > and having slightly larger peaks but not 2x peaks!! > > Fred
Interesting, Fred. Could you post the coefficients of an example filter? Thanks, Dirk
Reply by Fred Marshall April 24, 20092009-04-24
bellda2005@cox.net wrote:
> On Apr 22, 10:53 pm, dbd <d...@ieee.org> wrote: >> On Apr 22, 3:20 pm, bellda2...@cox.net wrote: >> >>> ... >> >>> Just curious, why do want to constrain the gain at DC to be exactly >>> 1.0?
....................................
> > I was actually interested in Fred's response, since he brought it up; > I thought he might have a different reason. > > Thanks for your input. > > Dirk
Oh, I didn't mean to suggest there was (or wasn't) a good reason for doing it, just that it could be done. If you do a minimax design and constrain the DC value to be 1.0 while the mid-point between the ripple peaks is also 1.0 then you use up one degree of freedom and the ripple magnitude is larger than it needs to be otherwise. In a typical halfband filter this also forces the response at fs/2 to be zero. One of my "things" is equality-constrained minimax design so I find things like this interesting. And, I had done exactly this for a while in my halfband design program. In general, the DC value (well all the band edges) will be a ripple peak. And, you can force that value to be 1.0 by scaling. Here's a trick I've used in minimax design to get all-positive stopband ripple leading up to Hermann-Schussler equiripple minimum phase FIR designs: Start with the stopband desired gain at zero. At the next iteration of the Remez algorithm, increase the desired stopband gain to be the same as the equalized error (which is not yet the peak ripple). The equalized error grows at each iteration so you continue to do this until you reach convergence. (The error peaks decrease with each iteration at the same time). When it's converged, the stopband value will be equal to the ripple peak magnitude and the negative going peaks will be zero-valued. [I've done this successfully and worked on a convergence proof but didn't quite finish it. It seems a useful extension to the Remez algorithm and could stand having that proof. Good grad student exercise I should think.] You could do the same in the passband but it's not quite as cool: Start with the passband desired value at 1.0. Then, in the next iteration, make the passband desired value equal to 1.0 minus (or plus) the equalized error. If the DC value is going to be at a positive peak then it will end up at 1.0. If the DC value is going to be at a negative peak then it will end up at 1.0 minus 2x the peak ripple. You could always run it twice: one with 1.0 minus... and one with 1.0 plus... Of course, all this does is scale the result but there's no loss of degrees of freedom. You might just as well divide all the coefficients by (1.0 + peak) after the filter is designed to get the DC value to be 1.0 AND not lose degrees of freedom. But then, the ripple is all one-sided and deviates 2x if a passband of 1.0 is what you wanted. You may well be better off losing one degree of freedom and having slightly larger peaks but not 2x peaks!! Fred
Reply by April 23, 20092009-04-23
On Apr 22, 10:53&#4294967295;pm, dbd <d...@ieee.org> wrote:
> On Apr 22, 3:20 pm, bellda2...@cox.net wrote: > > > ... > > > Just curious, why do want to constrain the gain at DC to be exactly > > 1.0? > > > Dirk > > ... > > In anti-aliasing filters that are going to be used in multiple passes > of filter/desample it is desirable to use a reduced or zero ripple at > DC design so that error doesn't accumulate with each application of > the filter. That's why I've done it. > > Dale B. Dalrymple
Hi Dale, I have used halfband filters for longer than I care to say; almost every 'permanent'/contract/consulting position I have ever had has had applications for them for rate changing or multi-rate applications. Making DC gain EXACTLY 1.0 is not a problem I have ever encountered in my designs, I am usually worried about the entire passband ripple and the corresponding stopband ripple. If you use the middle coefficient as 0.5 or 1.0 as is commonly mentioned in texts (it used to be important to save the multiply) you don't get exactly 1.0 at DC. For interpolation with a series of halfband filters if you want a gain of ~1.0 from each interpolating filter, the filters won't have a nominal passband gain of 1.0 (of course you could use a passband gain of ~1.0 and adjust the scaling elsewhere to get the desired end result). I was actually interested in Fred's response, since he brought it up; I thought he might have a different reason. Thanks for your input. Dirk
Reply by dbd April 22, 20092009-04-22
On Apr 22, 3:20 pm, bellda2...@cox.net wrote:
> ... > > Just curious, why do want to constrain the gain at DC to be exactly > 1.0? > > Dirk > ...
In anti-aliasing filters that are going to be used in multiple passes of filter/desample it is desirable to use a reduced or zero ripple at DC design so that error doesn't accumulate with each application of the filter. That's why I've done it. Dale B. Dalrymple
Reply by April 22, 20092009-04-22
On Apr 22, 11:05&#4294967295;am, "Fred Marshall" <fmarshallx@remove_the_x.acm.org>
wrote:
> bellda2...@cox.net wrote: > > If you shift the halfband filter to remove the delay and look at the > > frequency response (real and signed, linear scale) you find that the > > response is symmetric about the point at fs/4. &#4294967295;So the ripple at fs/2 > > will be the same magnitude but opposite sign of the ripple at DC. > > > Dirk > > I agree but don't quite get the point.... > And, this is only correct if you don't constrain the gain at DC to be > exactly 1.0 - which can be done.
Fred, The ripples around the center of the ripples will still be the same for real and signed frequency response on a linear scale. The symmetry displayed this way around the point at fs/4 is not dependent on the filter scaling or what you set the center tap to. However, if you scale the filter and set the center tap to something other than half the distance between the two ripples' centers (like other than 0.5 for ripple center of gains 1 and 0), then the MAGNITUDE response will not be symmetric about the fs/4 point, because you will have more ripple in the stopband than is necessary (i.e. could be reduced at no cost, so why wouldn't you?). If the design was an equiripple design, setting the center tap in this way would make alternating stopband peaks have different magnitudes, the larger stopband peaks larger than they need to be. Just curious, why do want to constrain the gain at DC to be exactly 1.0? Dirk
> > If you shift the halfband filter unit sample response to be centered at zero > delay it doesn't change the frequency magnitude response - except the > function becomes purely real. &#4294967295;The magnitude response in any case is > symmetrical around zero and fs/2. > > I have seen cases where the purely real response flips sign at fs/2 relative > to zero but don't recall the details. &#4294967295;Probably an x4 case because of what I > just said above. > > Fred