Advertisement
Guest User

Untitled

a guest
Jan 19th, 2014
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 2.26 KB | None | 0 0
  1. ;; This version is much like libFLAC expanded one.
  2. ;; The only difference is that we generate predictors of mostly useful orders first
  3. ;; and get them from hash table.
  4.  
  5. (defparameter *lpc-predictors* (make-hash-table)
  6.   "Precalculated FIR linear predictors")
  7.  
  8. (defmacro gen-lpc-predictor (n)
  9.   "Generate FIR linear predictor of order N"
  10.   #+sbcl (declare (sb-ext:muffle-conditions sb-ext:compiler-note))
  11.   (let ((func-name (intern (format nil "LPC-PREDICTOR-~D" n))))
  12.     `(flet ((,func-name (subframe)
  13.               (let ((out-buf (subframe-out-buf subframe))
  14.                     (shift (subframe-lpc-coeff-shift subframe))
  15.                     (coeff (subframe-lpc-predictor-coeff subframe)))
  16.                 (declare (type (simple-array (signed-byte 32)) out-buf coeff)
  17.                          (type (signed-byte 32) shift))
  18.                
  19.                 (loop for i fixnum from ,n below (length out-buf)
  20.                    for sum fixnum = 0 do
  21.                      ,@(loop for j below n collect
  22.                             `(incf sum
  23.                                    (* (aref coeff ,j)
  24.                                       (aref out-buf (- i ,(1+ j))))))
  25.                      (incf (aref out-buf i)
  26.                            (the fixnum
  27.                                 (ash sum (- shift))))))))
  28.        #',func-name)))
  29.  
  30. ;; Populate hash table with predictors of orders from 1 to 12
  31. ;; (These are most useful).
  32. (macrolet ((gen-lpc-predictors (n)
  33.              `(progn
  34.                 ,@(loop for order from 1 to n collect
  35.                         `(setf (gethash ,order *lpc-predictors*)
  36.                                (gen-lpc-predictor ,order))))))
  37.  
  38.   (gen-lpc-predictors 12))
  39.  
  40. (defmethod subframe-decode ((subframe subframe-lpc) frame)
  41.   (declare (ignore frame))
  42.   (let* ((order (subframe-order subframe))
  43.          (predictor (gethash order *lpc-predictors*)))
  44.    
  45.     (if (not predictor)
  46.         ;; Funny stuff. If there is no desired predictor in hash table,
  47.         ;; generate it on the fly.
  48.         (setf (gethash order *lpc-predictors*)
  49.               (setq predictor
  50.                     (eval (list 'gen-lpc-predictor order)))))
  51.    
  52.     (funcall (the function predictor)
  53.              subframe))
  54.              
  55.   (subframe-out-buf subframe))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement