(defpackage matched-filterer (:nicknames mf) (:documentation " A group of us damgud cyberchatters are making a matched filter in common lisp. ") (in-package mf) (defclass pathed () ((path-of :type 'pathname :initarg :path-of :accessor path-of)) (:default-initargs :path-of #p"")) (defclass filed-list (pathed) ((retrieved :type 'list :initform '() :accessor retrieved))) (defmethod retrieve ((obj filed-list)) (with-open-file (in (path-of obj)) (setf (retrieved obj) (read in)))) (defmethod stow ((obj filed-list)) (with-open-file (out (path-of obj) :direction :output :if-exists :supersede :if-does-not-exist :create) (prin1 (retrieved obj) out))) (defclass discrete-signal (filed-list) ()) (defmethod transform (function (obj discrete-signal)) (funcall function (retrieved obj))) (defun naieve-dft (list) (loop for k from 0 below (length list) collecting (loop for x-n in list for n from 0 summing (* x-n (exp (* 2 pi k n #c(0 -1) (/ (length list)))))))) (defun naieve+dft (list) (loop for k from 0 below (length list) collecting (loop for x-n in list for n from 0 summing (* x-n (exp (* 2 pi #c(0 1) (/ (length list)) k n)))))) (defun eg-0 () (print "Set list, written to foo.txt") (let ((d-s (make-instance 'discrete-signal :path-of #p"foo.txt"))) (setf (retrieved d-s) '(1 2 3 4 5)) (stow d-s) (print (retrieved d-s))) (print "Read foo.txt, transformed and writter bar.txt") (let ((d-s (make-instance 'discrete-signal :path-of #p"foo.txt"))) (retrieve d-s) (let ((result (mf::transform #'mf::naieve-dft d-s)) (f-s (make-instance 'discrete-signal :path-of #p"bar.txt"))) (setf (retrieved f-s) result) (stow f-s) (print (retrieved f-s)) (terpri))) (print "read, +i transformed bar.txt (scaled by (length list) times)") (let ((f-s (make-instance 'discrete-signal :path-of #p"bar.txt"))) (retrieve f-s) (format t "~{~d~^ ~}~%" (mapcar 'round (mapcar 'realpart (transform 'naieve+dft f-s))))) (terpri))