[CM] make-bandpass xcoeffs
James Hearon
j_hearon at hotmail.com
Wed Jun 29 10:51:48 PDT 2022
Hi,
It seems make-bandpass doesn't have the mus-xcoeffs feature as general make-filter does, but I was trying to get the numbers to do some comparisons all in one definstrument, define, or let. It seems calling the make-bandpass function as a generator and trying to place the output into a vector is the wrong approach, or maybe I have the inp variable wrong? Also it seems one can use a bandpass or fir-filter call interchangeably?
How can I best get accurate xcoeffs numbers in-line, so to speak, from the make-bandpass gen?
(define (gentest amp flo1 fhi1 order)
(let ((flt1 (make-bandpass (hz->radians flo1) (hz->radians fhi1) order)) ;flow, fhigh, order
(v (make-float-vector order))
)
(do ((l 0 (+ l 1)))
((= l order))
(float-vector-set! v l (bandpass flt1 l)) ;or (fir-filter flt1 l)
(format #t "~%l: ~F bandpass: ~0,6F v: ~0,6F" l (bandpass flt1 l) (v l))
) ))
(with-sound (:srate 48000 :channels 2 :header-type mus-riff )
(gentest .5 200 400 3 )
)
As a test, I modified make-bandpass from dsp.scm to be able to print the coeffs which makes me believe the float-vector-set! approach above doesn't give the coeffs I was hoping to see.
(define (mymake-bandpass flo fhi order)
(let* (
(len order)
(arrlen (+ 1 (* 2 len)))
(arr (make-float-vector arrlen))
)
(do ((i (- len) (+ i 1))) ;-len to +len
((= i len)
(make-fir-filter arrlen arr)) ;order xcoeffs
(let* ((k (+ i len))
(denom (* pi i))
(num (- (sin (* fhi i)) (sin (* flo i)))))
(set! (arr k)
(if (= i 0)
(/ (- fhi flo) pi)
(* (/ num denom)
(+ .54 (* .46 (cos (/ (* i pi) len)))))))))
(do ((l 0 (+ l 1)))
((= l arrlen))
(format #t "~%l: ~F xcoeffs: ~0,6F" l (arr l))
)) )
(mymake-bandpass (hz->radians 200) (hz->radians 400) 3)
Thank you for any suggestions,
Jim
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://cm-mail.stanford.edu/pipermail/cmdist/attachments/20220629/56f11366/attachment.html>
More information about the Cmdist
mailing list