[openfirmware] r1269 - cpu/x86

svn at openfirmware.info svn at openfirmware.info
Sat Aug 1 22:30:45 CEST 2009


Author: wmb
Date: 2009-08-01 22:30:45 +0200 (Sat, 01 Aug 2009)
New Revision: 1269

Modified:
   cpu/x86/iirfilter.fth
Log:
iirfilter.fth - this version seems to work.


Modified: cpu/x86/iirfilter.fth
===================================================================
--- cpu/x86/iirfilter.fth	2009-08-01 18:16:45 UTC (rev 1268)
+++ cpu/x86/iirfilter.fth	2009-08-01 20:30:45 UTC (rev 1269)
@@ -18,25 +18,30 @@
    begin
       ax       bx  mov   \ Save last value
       4 [bp]   ax  sub   \ last - M[i+1]
-      0 [si]   ax  imul  \ alpha[i] * (last - M[i+1])  (kills DX)
+      0 [si]       imul  \ alpha[i] * (last - M[i+1])  (kills DX)
       4 [si]   si  lea   \ Increment alpha pointer
-      d# 14 #  ax  shr   \ Scale down by multiplier scale factor
+      d# 16 #  ax  sar   \ Scale down by multiplier scale factor
       0 [bp]   ax  add   \ M[i] + alpha[i] * (last - M[i+1])
       bx   0 [bp]  mov   \ Update M[i]
       4 [bp]   bp  lea   \ Point to next M[i]
    loopa
-
    bp pop     \ Restore BP
    si pop     \ Restore SI
    ax push    \ Return value
 c;
 
+: mul16:  ( "coef" -- )
+   safe-parse-word  push-decimal $number drop pop-base  ( n )
+   d# 65536 d# 1,000,000,000 */                         ( n' )
+   ,
+;
+
 \ upsample by 4
 
 2 constant #coefs
 
-create weights0 mul14: .101467517  mul14: .612422841
-create weights1 mul14: .342095596  mul14: .867647439
+create weights0 mul16: .101467517  mul16: .612422841
+create weights1 mul16: .342095596  mul16: .867647439
 
 #coefs 1+ /n* constant buflen
 buflen buffer: z0
@@ -53,11 +58,40 @@
 
 0 [if]
 for each input sample
-   sample weights0 z0 #coefs iir-cascade  dup to int0  ( out0 )  int1 +
+sample weights0 z0 #coefs iir-cascade
+  dup  weights0 z2 #coefs iir-cascade  ,next-output
+       weights1 z3 #coefs iir-cascade  ,next-output
+
+sample weights1 z1 #coefs iir-cascade
+   dup weights0 z2 #coefs iir-cascade  ,next-output
+       weights1 z3 #coefs iir-cascade  ,next-output
+[then]
+0 [if]
+for each input sample
+sample weights0 z0 #coefs iir-cascade  dup to int0  ( out0 )  int1 +
    dup weights0 z2 #coefs iir-cascade  dup to out0  out1 + ,next-output
        weights1 z3 #coefs iir-cascade  dup to out1  out0 + ,next-output
 
-   sample weights0 z1 #coefs iir-cascade  dup to int1  ( out1 )  int0 +
+sample weights1 z1 #coefs iir-cascade  dup to int1  ( out1 )  int0 +
    dup weights0 z2 #coefs iir-cascade  dup to out0  out1 + ,next-output
        weights1 z3 #coefs iir-cascade  dup to out1  out0 + ,next-output
 [then]
+init-upsample
+: up2  ( sample -- out1 out0 )
+   dup weights0 z0 #coefs iir-cascade >r
+   weights1 z1 #coefs iir-cascade r>
+;
+: up4  ( in -- out3 out2 out1 out0 )
+   dup weights0 z0 #coefs iir-cascade      ( in intermed0 )
+
+   dup weights0 z2 #coefs iir-cascade  >r  ( in intermed0 r: out0 )
+       weights1 z3 #coefs iir-cascade  >r  ( in r: out0 out1 )
+
+   weights1 z1 #coefs iir-cascade          ( intermed1 r: out0 out1 )
+
+   dup weights0 z2 #coefs iir-cascade  >r  ( intermed1 r: out0 out1 out2 )
+       weights1 z3 #coefs iir-cascade      ( out3  r: out0 out1 out2 )
+
+   r> r> r>
+;
+




More information about the openfirmware mailing list