Thanks for the replies. I thought I would touch on all of them in one email to keep the reading shorter.

It was suggested off the list that I consider a decimation filter to downsample the sample rate. This sounds reasonable, but I implemented the iir filter at a 100 Hz sample rate and still saw a significant offset (500 lsb), with many of the same fixed point scaling problems (resolution less than 16 bits). I would guess that I could get close by cutting the sample rate to 10 Hz. I think that leads me to pre-warping the coefficients since 2*PI is not << 10Hz, but that's just math.

I 'think' the decimation filter needs to remove content above 5 Hz (nyquist), then cut the samples to 10 Hz. Wouldn't that be about a 1Hz filter anyway?

I think the FIR structure has the most promise, but I have no experience with those, especially on a fixed point machine.


I don't know much about this sort of thing.

But likely more than I know ;)

I'm guessing that a different implementation could have better numeric
stability properties.

Your key-phrase seems to be, "Series of first order difference
equations." Is that different than MAC-ing a polynomial equation?

That is exactly MAC-ing a polynomial equation:
y  = b1 * x + z1;
z1 = b2 * x + z2 - a2 * y;
z2 = b3 * x + 0  - a3 * y;

I've done similar type things with the latter without trouble, but never
as low as 1 Hz.

So have I, but the goal was usually a much higher cutoff frequency, and some DC offset and minor loss of resolution was not a problem. Here, the offset is a major issue.

Quoting Barton C Massey <>:

Caveat: I have no idea what I'm talking about.  Act

I have no idea how to interpret this response :) This could be sarcasm, and you *do* know what you are talking about, but I simply don't understand. This could be truth, and I should go another route.

You can't do a 1Hz cutoff against a 1000Hz sampling rate
with any sane single-stage design, AFAIK.

I'm not sure what you mean by a single stage... I think of a stage as a memory element when using an IIR filter, in which case I think I'm using 3 stages.

The usual plan
would be to downsample the signal in a series of stages;
maybe 5 downsample-by-four stages, which would get you to
about 1Hz very nicely.

Again I'm not up to speed on your terminology, and my googling is not clearing things up. I see some stuff on downsampling, but I've thought of this in the context of throwing out data, not combining it. Perhaps more akin to down-conversion.

(It also tells you that as a rule of thumb you'd
need about a 10-pole Butterworth to do this directly; ...

Did you mean 10 *tap* Butterworth? I was originally only trying to get 2 poles, so 10 poles would be overkill?!?!

still wouldn't recommend it, though, as the numerical
instability problems will be very real with such high-order

This is the problem I have now.

I'll have to show off (Tuesday) an integrating device I'm running now. It has zero offset, and filter-like response.

Hey All,
I'm looking for advice from someone who's DSP foo is stronger than
mine to help with a filter applied to the roll control system..

Implement a 2nd-order low-pass filter (butterworth would be fine)
with a 1Hz cutoff frequency and a sampling rate of 1000Hz. Input is
uint16, 0-65535 from an ADC.

My usual solution:
Create the appropriate transfer function, then use Matlab c2d
command to obtain the coefficients. Finally, build the filter as a
series of first order difference equations. This is working in
several products in production, but isn't quite right for our rocket

The reason this isn't working:
1) Matlab c2d gives only 4 significant figures, regardless of the
format setting.
2) Using only 4 significant figures propagates errors in the filter
which make it unstable.
3) When the coefficients are obtained by calculation
(float-doubles), the DC offset is too big to make the filter useful
when converted to fixed point math.
4) The fixed point data sizes get kind-of big for such a simple
filter (long long) if I want to keep my resolution.
5) Filter coefficients for a 1000Hz sample rate and a 1Hz cutoff are
so far apart in size (1 vs. 0.00000009808) that 64 bit math or
slower sampling are likely the only solutions.

A couple of questions:
1) Is there another way to realize a discrete fixed-point filter
that has little (1-2 LS bits) offset and full resolution on a 16 bit

2) Can another filter be designed more easily ( I had to derive the
filter using a bilinear transform. Frequency warping wasn't used
because the sampling frequency is much faster than the corner
frequency. )?

Anyone have any thoughts?

psas-avionics mailing list

psas-avionics mailing list

Reply via email to