--_003_295571202161551340432429squirrelruckusbrouhahacom_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable > Here's another one, using the same rounding principle. > Would you care to have a look at this one too ? > > By the way, doesn't the rounding make this IIR filter effectively an FIR > filter ? No... Look at the step response. The final value in the step response of an FIR filter depends on the number of taps whereas for an IIR filter it depends on the poles. Back to your filter. In addition to settling errors, the IIR quantization errors can also produce something called 'limit cycles' which are small output oscillations for DC inputs. Attached is an IIR C-implementation that handles limit cycles and settling errors. It supports poles other than 1/2^N. A simple unit-test framework tests a few of the corner cases. Scott= --_003_295571202161551340432429squirrelruckusbrouhahacom_ Content-Type: text/plain; name="IIRQuantization.cpp" Content-Description: IIRQuantization.cpp Content-Disposition: attachment; filename="IIRQuantization.cpp"; size=3868; creation-date="Sat, 23 Jun 2012 06:25:07 GMT"; modification-date="Sat, 23 Jun 2012 06:25:07 GMT" Content-Transfer-Encoding: base64 DQojaW5jbHVkZSA8c3RkaW8uaD4NCiNpbmNsdWRlIDxzdGRsaWIuaD4NCg0KdHlwZWRlZiBzaWdu ZWQgIHMzMjsNCg0KY29uc3QgaW50IE09MjQ7ICAvLyBGUCBNYW50aXNzYSBiaXRzDQpjb25zdCBp bnQgTj04OyAgIC8vIEZQIGZyYWN0aW9uYWwgYml0cw0KY29uc3QgaW50IEs9Mzc7ICAgLy8gYWxw aGEgPSBLLzJeTg0KDQpjb25zdCBpbnQgZnJhY01hc2sgPSAoMTw8TiktMTsNCg0KczMyIHk7ICAg IC8vIEZpbHRlcmVkIFN0YXRlIC0tIE0uTiBmaXhlZCBwb2ludA0KDQovLy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vIGlpckZpbHRlciAtIHNpbmdsZSBwb2xlIGlpciBm aWx0ZXINCi8vDQovLyAgaW5wdXQ6ICAgeCAtLSBpbnB1dCB2YWx1ZQ0KLy8gIG91dHB1dDogIHkg LS0gZmlsdGVyZWQgc3RhdGUNCi8vDQovLyAgVGhlIHNpbmdsZSBwb2xlIElJUiBkaWdpdGFsIGZp bHRlciBpczoNCi8vICAgIHkgPSAoMS1hbHBoYSkqeSArIGFscGhhKngNCi8vDQovLyAgQXMgcHJl c2VudGVkLCB0aGlzIGZvcm0gb2YgdGhlIElJUiBmaWx0ZXIgc3VmZmVycyBmcm9tIHF1YW50aXph dGlvbg0KLy8gZXJyb3JzIGFuZCBtYXkgbm90IHJlYWNoIGFsbCB2YWx1ZXMgZm9yIHRoZSBpbnB1 dCBvciBtYXkgbWFuaWZlc3QgDQovLyBvc2NpbGxhdGlvbnMgKGxpbWl0IGN5Y2xlcykuDQovLyBU aGUgaW1wbGVtZW50YXRpb24gIGhlcmUgdXRpbGl6ZXMgdGhyZWUgYXBwcm9hY2hlcyB0byByZWR1 Y2UgdGhlIA0KLy8gcXVhbnRpemF0aW9uIGVycm9yIHRvIHRoZSB0aGVvcmV0Y2FsIG1pbmltdW0u IFRoZSBmaWx0ZXIgaGFzIHplcm8NCi8vIHN0ZXAgcmVzcG9uc2UgZXJyb3IgYW5kIGV4aGliaXRz IG5vIGxpbWl0IGN5Y2xlcy4NCi8vDQovLyBEeW5hbWljIHJhbmdlIGNvbnRyb2w6DQovLyAgIFRo ZSBmaWx0ZXJlZCBzdGF0ZSwgeSwgaXMgYW4gTS5OIGZpeGVkIHBvaW50IG51bWJlciwgd2hpY2gg aXMgdG8NCi8vICAgc2F5LCB0aGVyZSBhcmUgTSBiaXRzIGZvciB0aGUgbWFudGlzc2EgYW5kIE4g Yml0cyBmb3IgdGhlIGZyYWN0aW9uLg0KLy8gICBUaGUgaW5wdXQgaXMgbGltaXRlZCB0byBhbiBN LWJpdCBpbnRlZ2VyLg0KLy8NCi8vIFBvbGUgUXVhbnRpemF0aW9uOg0KLy8gICBUaGUgcG9sZSBh bHBoYSBpcyBjaG9zZW4gdG8gYmUgYSBmcmFjdGlvbiBvZiB0aGUgZm9ybSBLLzJeTiwgd2hlcmUg Tg0KLy8gICBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGZyYWN0aW9uYWwgcG9ydGlvbiBv ZiB0aGUgZmlsdGVyZWQgc3RhdGUNCi8vICAgYW5kIEsgaXMgYW4gaW50ZWdlciBsZXNzIHRoYW4g Ml5OLiBJZiBLIGlzIG9uZSwgdGhlbiB0aGUgSUlSIGZpbHRlcg0KLy8gICB3aWxsIG5vdCBtYW5p ZmVzdCBsaW1pdCBjeWNsZSBvc2NpbGxhdGlvbnMuDQovLw0KLy8gVW5kZXJmbG93IGFuZCBvdmVy ZmxvdyBjb250cm9sOg0KLy8gICBJZiB0aGUgZmlsdGVyIGlzIHJlLXdyaXR0ZW4gYXM6DQovLyAg ICAgICB5ID0geSArIGFscGhhKih4LXkpDQovLyAgIHRoZW4gdGhlIHVuZGVyZmxvdyBhbmQgb3Zl cmZsb3cgY2FuIGJlIGFkZHJlc3NlZCBpbiB0aGUgZGlmZmVyZW5jZQ0KLy8gICAoeC15KS4gSWYg dGhlIGRpZmZlcmVuY2UgaXMgcG9zaXRpdmUsIHRoZW4gdGhlIGZpbHRlciB3aWxsIGNvbnZlcmdl DQovLyAgIHRvIHRoZSBpbnB1dC4gSWYgdGhlIGRpZmZlcmVuY2UgaXMgbmVnYXRpdmUsIHF1YW50 aXphdGlvbiBlcnJvcnMgd2lsbA0KLy8gICBmaWx0ZXIgd2lsbCBpbmhpYml0IGNvbnZlcmdlbmNl Lg0KLy8NCi8vIA0KDQojZGVmaW5lIEFWT0lEX1FVQU5USVpBVElPTl9FUlJPUlMgMQ0KI2RlZmlu ZSBBVk9JRF9MSU1JVF9DWUNMRVMgKChBVk9JRF9RVUFOVElaQVRJT05fRVJST1JTICYmIDEpICYm IChLICE9IDEpKQ0KDQoNCnMzMiBpaXJGaWx0ZXIoczMyIHgpDQp7DQogIHMzMiBkOyAgICAvLyBX b3JraW5nIHZhcmlhYmxlDQoNCiAgZCA9ICh4IC0gKHk+Pk4pKTsNCg0KICAjaWYgQVZPSURfUVVB TlRJWkFUSU9OX0VSUk9SUw0KICAgIGlmIChkIDw9MCAmJiB5JmZyYWNNYXNrKQ0KICAgICAgZCA9 IGQtMTsNCiAgI2VuZGlmDQoNCiAgeSA9IHkgKyBLKmQ7DQoNCiAgI2lmIEFWT0lEX0xJTUlUX0NZ Q0xFUw0KICAgIGlmIChkPDApDQogICAgew0KICAgICAgaWYgKHkgPCB4PDxOKQ0KICAgICAgICB5 ID0geDw8TjsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIGlmICh5ID4geDw8TikNCiAg ICAgICAgeSA9IHg8PE47DQogICAgfQ0KICAjZW5kaWYNCg0KICByZXR1cm4geTsNCn0NCg0Kdm9p ZCBpbml0RmlsdGVyKHMzMiBpbml0aWFsKQ0Kew0KICB5ID0gaW5pdGlhbDsNCn0NCg0KDQoNCi8v PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0NCi8vDQovLyB1bml0IHRlc3RzIGZvciB0aGUgaWlyRmlsdGVyDQppbnQgZmFpbHVyZXM9 MDsNCg0Kdm9pZCBkb0Fzc2VydChpbnQgY29uZGl0aW9uLCBjb25zdCBjaGFyICpwU3RyKQ0Kew0K ICBpZiAoIWNvbmRpdGlvbikNCiAgew0KICAgIHByaW50ZigiRkFJTEVEOiVzXG4iLCBwU3RyKTsN CiAgICBmYWlsdXJlcysrOw0KICB9DQp9DQoNCg0KaW50IG1haW4oaW50LCBjaGFyICoqKQ0Kew0K ICBpbnQgaTsNCg0KICBzMzIgeDsgICAgLy8gSW5wdXQgLS0gbm8gZnJhY3Rpb25hbA0KICBzMzIg djsNCg0KICBpbml0RmlsdGVyKDApOw0KDQogIHggPSAxMDsNCiAgaSA9IDA7DQogIGRvDQogIHsN CiAgICBpKys7DQogICAgaWlyRmlsdGVyKHgpOw0KICB9IHdoaWxlIChpPDEwMDApOw0KDQogIGRv QXNzZXJ0KCAoKHg8PE4pID09IHkpLCAiU2V0dGxlZCIpOw0KDQoNCiAgdiA9IHk7DQogIGlpckZp bHRlcih4KTsNCiAgaWlyRmlsdGVyKHgpOw0KICBpaXJGaWx0ZXIoeCk7DQogIGRvQXNzZXJ0KCB2 ID09IHksICJSZW1haW4gc3RlYWR5IGFmdGVyIHNldHRsZWQiKTsNCg0KICB4Kys7DQogIGlpckZp bHRlcih4KTsNCiAgZG9Bc3NlcnQoIHYgIT0geSwgIkNoYW5nZWQgYWZ0ZXIgc2luZ2xlIHVuaXQg c3RlcCIpOw0KICB4LS07DQogIGlpckZpbHRlcih4KTsNCiAgZG9Bc3NlcnQoIHYgPT0geSwgIlJl dHVybmVkIGFmdGVyIHNpbmdsZSB1bml0IHN0ZXAiKTsNCg0KDQogIC8vIFN5bW1ldHJ5IHRlc3Qu DQogIHMzMiBkZWx0YTsNCiAgZm9yKGRlbHRhPTE7IGRlbHRhPDB4NDA7IGRlbHRhKyspDQogIHsN CiAgICBpbml0RmlsdGVyKDApOw0KICAgIHggPSAwOw0KICAgIGRvDQogICAgew0KDQogICAgICB2 ID0geTsNCg0KICAgICAgeCs9ZGVsdGE7DQogICAgICBpID0gMDsNCiAgICAgIGRvIHsNCiAgICAg ICAgaSsrOw0KICAgICAgICBpaXJGaWx0ZXIoeCk7DQogICAgICB9IHdoaWxlICgoeCAhPSAoeT4+ TikpICYmIGk8MTAwMDApOw0KDQogICAgICBkb0Fzc2VydChpPDEwMDAwLCAiT3ZlciBydW4gaW4g U3ltbWV0cnkgdGVzdCIpOw0KICAgICAgeC09ZGVsdGE7DQogICAgICBkbyB7DQogICAgICAgIGkt LTsNCiAgICAgICAgaWlyRmlsdGVyKHgpOw0KICAgICAgfSB3aGlsZSAoaSk7DQoNCiAgICAgIGRv QXNzZXJ0KHkgPT0gdiwgIlN5bW1ldHJ5IHRlc3QiKTsNCg0KICAgICAgeCs9ZGVsdGE7DQogICAg ICBkbyB7DQogICAgICAgIGkrKzsNCiAgICAgICAgaWlyRmlsdGVyKHgpOw0KICAgICAgfSB3aGls ZSAoeCAhPSAoeT4+TikpOw0KDQogICAgfSB3aGlsZSAoKHgrZGVsdGEpIDwgKDE8PChNLTEpKSAp Ow0KICB9DQoNCiAgaWYgKGZhaWx1cmVzID09IDApDQogICAgcHJpbnRmICgiUEFTU0VEIGFsbCBy ZWdyZXNzaW9uIHRlc3RzXG4iKTsNCiAgDQoNCiAgcmV0dXJuIDA7DQp9 --_003_295571202161551340432429squirrelruckusbrouhahacom_ Content-Type: text/plain; name="ATT00001.txt" Content-Description: ATT00001.txt Content-Disposition: attachment; filename="ATT00001.txt"; size=208; creation-date="Sat, 23 Jun 2012 06:25:07 GMT"; modification-date="Sat, 23 Jun 2012 06:25:07 GMT" Content-Transfer-Encoding: base64 LS0gDQpodHRwOi8vd3d3LnBpY2xpc3QuY29tIFBJQy9TWCBGQVEgJiBsaXN0IGFyY2hpdmUNClZp ZXcvY2hhbmdlIHlvdXIgbWVtYmVyc2hpcCBvcHRpb25zIGF0DQpodHRwOi8vbWFpbG1hbi5taXQu ZWR1L21haWxtYW4vbGlzdGluZm8vcGljbGlzdA0K --_003_295571202161551340432429squirrelruckusbrouhahacom_-- .