Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;; This version is much like libFLAC expanded one.
- ;; The only difference is that we generate predictors of mostly useful orders first
- ;; and get them from hash table.
- (defparameter *lpc-predictors* (make-hash-table)
- "Precalculated FIR linear predictors")
- (defmacro gen-lpc-predictor (n)
- "Generate FIR linear predictor of order N"
- #+sbcl (declare (sb-ext:muffle-conditions sb-ext:compiler-note))
- (let ((func-name (intern (format nil "LPC-PREDICTOR-~D" n))))
- `(flet ((,func-name (subframe)
- (let ((out-buf (subframe-out-buf subframe))
- (shift (subframe-lpc-coeff-shift subframe))
- (coeff (subframe-lpc-predictor-coeff subframe)))
- (declare (type (simple-array (signed-byte 32)) out-buf coeff)
- (type (signed-byte 32) shift))
- (loop for i fixnum from ,n below (length out-buf)
- for sum fixnum = 0 do
- ,@(loop for j below n collect
- `(incf sum
- (* (aref coeff ,j)
- (aref out-buf (- i ,(1+ j))))))
- (incf (aref out-buf i)
- (the fixnum
- (ash sum (- shift))))))))
- #',func-name)))
- ;; Populate hash table with predictors of orders from 1 to 12
- ;; (These are most useful).
- (macrolet ((gen-lpc-predictors (n)
- `(progn
- ,@(loop for order from 1 to n collect
- `(setf (gethash ,order *lpc-predictors*)
- (gen-lpc-predictor ,order))))))
- (gen-lpc-predictors 12))
- (defmethod subframe-decode ((subframe subframe-lpc) frame)
- (declare (ignore frame))
- (let* ((order (subframe-order subframe))
- (predictor (gethash order *lpc-predictors*)))
- (if (not predictor)
- ;; Funny stuff. If there is no desired predictor in hash table,
- ;; generate it on the fly.
- (setf (gethash order *lpc-predictors*)
- (setq predictor
- (eval (list 'gen-lpc-predictor order)))))
- (funcall (the function predictor)
- subframe))
- (subframe-out-buf subframe))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement