[<<][staapl][>>][..]
Tue Dec 4 12:03:34 CET 2007
data filter implementation
the easiest way to keep precision is to never loose any bits. the data
filter has the form:
x += (1 - a) x + a u
where x is state and u is input, and a = 1 - 2^(-p)
the current settings give t = 512 (5kHz sample rate and 9Hz symbol
rate). which means p = log_2 (1024) = 10 as the approximation of the
bound. speeding up the filter by a factor of 2 gives p = 9.
it might be worth relaxing it even further to 8, so shifts are
eliminated.
( so, just out of curiosity.. is it possible to use unsigned
multiplication? just doing this without thinking introduces a scaled
copy of the original modulated signal in the output. if the lowpass
filter allows, this might be not a problem: requirements are just 2x
as strict. )
problem with signs: it might be simpler to work completely with
unsigned values since signs make multi-byte arithmetic more
complicated (need sign extension). a simple solution is to run the
multiplication as signed (to get rid of the component at the carrier
frequency) but run the filter accumulation as unsigned. the DC
component in the result is completely predictable and can be
subtracted later.
first experiment i measure something: noise is at around 5 and maximal
measured signal is around 150. that's a significant difference. now
it's time to map the 24bit range to something more managable.
now to be careful not to overflow the filter input: it seems
reasonable to ignore the lower byte.
looks like i have a bug in the signed 16bit multiplication
routine. EDIT: yep.. type TOSL replaced with TOSH
[Reply][About]
[<<][staapl][>>][..]