// convert discrete z/p/k form to transfer function form // _zd : digital zeros (length: _n) // _pd : digital poles (length: _n) // _n : filter order // _k : digital gain // _b : output numerator (length: _n+1) // _a : output denominator (length: _n+1) void iirdes_dzpk2tff(float complex * _zd, float complex * _pd, unsigned int _n, float complex _k, float * _b, float * _a) { unsigned int i; float complex q[_n+1]; // expand poles polycf_expandroots(_pd,_n,q); for (i=0; i<=_n; i++) _a[i] = crealf(q[_n-i]); // expand zeros polycf_expandroots(_zd, _n, q); for (i=0; i<=_n; i++) _b[i] = crealf(q[_n-i]*_k); }
// // AUTOTEST: polycf_findroots (random roots) // void xautotest_polycf_findroots_rand() { unsigned int n=5; float tol=1e-4f; float complex p[n]; float complex roots[n-1]; float complex p_hat[n]; unsigned int i; for (i=0; i<n; i++) p[i] = i == n-1 ? 1 : 3.0f * randnf(); polycf_findroots(p,n,roots); float complex roots_hat[n-1]; // convert form... for (i=0; i<n-1; i++) roots_hat[i] = -roots[i]; polycf_expandroots(roots_hat,n-1,p_hat); if (liquid_autotest_verbose) { printf("poly:\n"); for (i=0; i<n; i++) printf(" p[%3u] = %12.8f + j*%12.8f\n", i, crealf(p[i]), cimagf(p[i])); printf("roots:\n"); for (i=0; i<n-1; i++) printf(" r[%3u] = %12.8f + j*%12.8f\n", i, crealf(roots[i]), cimagf(roots[i])); printf("poly (expanded roots):\n"); for (i=0; i<n; i++) printf(" p[%3u] = %12.8f + j*%12.8f\n", i, crealf(p_hat[i]), cimagf(p_hat[i])); } for (i=0; i<n; i++) { CONTEND_DELTA(crealf(p[i]), crealf(p_hat[i]), tol); CONTEND_DELTA(cimagf(p[i]), cimagf(p_hat[i]), tol); } }