Mercurial > hg > may
changeset 399:ac828725aeae resample
Update for Kaiser parameters changes; ensure Kaiser window is generated odd-length so with exactly 1 at the "centre"
author | Chris Cannam |
---|---|
date | Thu, 26 Sep 2013 15:04:45 +0100 |
parents | 3b44bfd23352 |
children | fe47d9e8f596 |
files | src/may/stream/filter.yeti |
diffstat | 1 files changed, 18 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/may/stream/filter.yeti Thu Sep 26 14:47:27 2013 +0100 +++ b/src/may/stream/filter.yeti Thu Sep 26 15:04:45 2013 +0100 @@ -441,12 +441,20 @@ * and transition bandwidth Hz at the given sampleRate. The filter * will contain an odd number of samples. */ -kaiserSincFilterFor { n, alpha, bandwidth, sampleRate } = - (kw = win.kaiserForBandwidth alpha bandwidth sampleRate; - kw = if (vec.length kw) % 2 == 0 then vec.concat [vec.zeros 1, kw] else kw fi; - sw = win.sinc (n*2) (vec.length kw); +kaiserSincFilterFor { n, attenuation, bandwidth, samplerate } = + (pp = win.kaiserParameters (ByFrequency { attenuation, bandwidth, samplerate }); + length = if pp.length % 2 == 0 then pp.length + 1 else pp.length fi; + kw = win.kaiser (pp with { length }); + sw = win.sinc (n*2) length; println "kaiserSincFilterFor: filter length is \(vec.length sw)"; - bf.multiply sw kw); + + f = bf.multiply sw kw; + + println "sinc peak is \(bf.max sw) at index \(bf.maxindex sw)"; + println "kaiser peak is \(bf.max kw) at index \(bf.maxindex kw)"; + println "filter peak is \(bf.max f) at index \(bf.maxindex f)"; + + f); bandpassed f0 f1 attenuation bandwidth s = (rate = s.sampleRate; @@ -517,6 +525,7 @@ nzc = 13; attenuation = 80; filter = kaiserSincWindow nzc factor attenuation; +// println "interpolated: filter length \(vec.length filter)"; out = delayedBy (- (nzc * factor)) (convolvedWith [Framesize 1024] (mat.newMatrix (RowMajor ()) (map \filter [1..s.channels])) @@ -595,7 +604,7 @@ //!!! ponder // filt = kaiserSincFilterFor { n, alpha = 80, bandwidth = 10, sampleRate = lower }; - filt = kaiserSincFilterFor { n, alpha = 80, bandwidth = 1, sampleRate = n }; + filt = kaiserSincFilterFor { n, attenuation = 80, bandwidth = 1, samplerate = higher }; //\() ( plot.plot [Vector filt] ); @@ -646,7 +655,7 @@ reconstructOne ch = (var out = 0; - var series = mat.getRow ch buffer; + var series = mat.getRow ch buffer; //!!! check this has length flen for [0..(vec.length series)-1] do i: x = vec.at series i; if x != 0 then @@ -658,6 +667,8 @@ readOne () = (result = mat.newColumnVector (vec.fromList (map reconstructOne [0 .. s.channels-1])); +// println "result = \(result)"; +//print "."; m = sourceRate / g; buffer := mat.concat (Horizontal ()) [mat.columnSlice buffer m (flen - m),