summaryrefslogtreecommitdiff
path: root/lpc/src/allpoles.alg
diff options
context:
space:
mode:
Diffstat (limited to 'lpc/src/allpoles.alg')
-rw-r--r--lpc/src/allpoles.alg70
1 files changed, 70 insertions, 0 deletions
diff --git a/lpc/src/allpoles.alg b/lpc/src/allpoles.alg
new file mode 100644
index 0000000..ca03055
--- /dev/null
+++ b/lpc/src/allpoles.alg
@@ -0,0 +1,70 @@
+(ALLPOLES-ALG
+(NAME "allpoles")
+(ARGUMENTS ("sound_type" "x_snd")("LVAL" "ak_array")("double" "gain"))
+(START (MIN x_snd))
+(NOT-IN-INNER-LOOP "ak_array")
+(ALWAYS-SCALE x_snd)
+(TERMINATE (MIN x_snd))
+(LOGICAL-STOP (MIN x_snd))
+
+(STATE
+ ("long" "ak_len" "0") ; length of coefs ak array
+ ("LVAL" "ak_array" "ak_array")
+ ("double" "gain" "gain")
+ ("double *" "ak_coefs" "NULL") ; coefs array
+ ("double *" "zk_buf" "NULL") ; last values of output
+ ("long" "index" "0")
+)
+
+(OUTER-LOOP "
+ if (susp->ak_array == NULL) {
+out: togo = 0; /* indicate termination */
+ break; /* we're done */
+ }
+ else if (!vectorp(susp->ak_array))
+ xlerror(\"array expected\", susp->ak_array);
+ else if (susp->ak_coefs == NULL)
+ {
+ long i;
+ susp->ak_len = getsize(susp->ak_array);
+ if (susp->ak_len < 1) xlerror(\"array has not elements\", susp->ak_array);
+ susp->ak_coefs = (double *) calloc(susp->ak_len, sizeof(double));
+ susp->zk_buf = (double *) calloc(susp->ak_len, sizeof(double));
+
+ /* at this point we have a new array and a place to put ak coefs */
+ for(i=0; i < susp->ak_len; i++) {
+ LVAL elem = getelement(susp->ak_array,i);
+ if (ntype(elem) != FLONUM) {
+ xlerror(\"flonum expected\", elem);
+ }
+ susp->ak_coefs[i] = getflonum(elem);
+ }
+
+ }
+")
+
+
+(CONSTANT "ak_array" "ak_coefs" "ak_len" "gain")
+(SAMPLE-RATE "x_snd->sr")
+(INNER-LOOP-LOCALS "double z0; long xi; long xj;")
+
+(INNER-LOOP "
+ z0 = x_snd*gain;
+ for (xi=0; xi < ak_len ; xi++)
+ {
+ xj = index + xi; if (xj >= ak_len) xj -= ak_len;
+ z0 += ak_coefs[xi] * zk_buf[xj];
+ }
+ zk_buf[index] = z0;
+ index++; if (index == ak_len) index = 0;
+ output = (sample_type) z0;
+")
+
+(FINALIZATION "
+ free(susp->zk_buf);
+ free(susp->ak_coefs);
+ susp->ak_array = NULL; /* free array */
+")
+)
+
+