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
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
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
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 <b...@cs.pdx.edu>:
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.
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
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
Anyone have any thoughts?
psas-avionics mailing list
psas-avionics mailing list