# HG changeset patch # User Chris Cannam # Date 1384889208 0 # Node ID 295b66046da32a5324841c28d6b925cec34cc216 # Parent 2202e40f375a97a47a99c5c669c3275fd80e95b0 Toward a more flexible framer interface diff -r 2202e40f375a -r 295b66046da3 src/may/feature/specdiff.yeti --- a/src/may/feature/specdiff.yeti Tue Nov 19 19:26:15 2013 +0000 +++ b/src/may/feature/specdiff.yeti Tue Nov 19 19:26:48 2013 +0000 @@ -9,8 +9,9 @@ specdiff frames = features magdiff (map cplx.magnitudes frames); -specdiffOfFile parameters filename = - specdiff (fr.frequencyDomainFramesOfFile parameters filename); +specdiffOfFile framesize w filename = + specdiff + (fr.framesOfFile framesize [ FrequencyDomain true, Window w ] filename); { specdiff, diff -r 2202e40f375a -r 295b66046da3 src/may/matrix.yeti --- a/src/may/matrix.yeti Tue Nov 19 19:26:15 2013 +0000 +++ b/src/may/matrix.yeti Tue Nov 19 19:26:48 2013 +0000 @@ -799,6 +799,12 @@ maxv (map (.v) (enumerate m)); fi; +transformRows rf m = + newMatrix (RowMajor ()) (map rf (asRows m)); + +transformColumns cf m = + newMatrix (ColumnMajor ()) (map cf (asColumns m)); + format m = strJoin "\n" (chunk = 8; @@ -811,8 +817,8 @@ map do v: n = mm.round (v * 10000); strPad ' ' 10 "\(n / 10000)"; - done (vec.list row); - done (asRows (columnSlice m c0 (c1 + 1))) |> concat |> strJoin "") + done (vec.list row) |> strJoin ""; + done (asRows (columnSlice m c0 (c1 + 1))) |> strJoin "\n") ]; done [0..width m / chunk - 1] |> concat); @@ -869,6 +875,8 @@ concatVertical, rowSlice, columnSlice, + transformRows, + transformColumns, newMatrix, newRowVector, newColumnVector, @@ -924,6 +932,8 @@ concatVertical is list -> matrix_t, rowSlice is matrix_t -> number -> number -> matrix_t, columnSlice is matrix_t -> number -> number -> matrix_t, + transformRows is (vec.vector_t -> vec.vector_t) -> matrix_t -> matrix_t, + transformColumns is (vec.vector_t -> vec.vector_t) -> matrix_t -> matrix_t, newMatrix is (ColumnMajor () | RowMajor ()) -> list -> matrix_t, newRowVector is vec.vector_t -> matrix_t, newColumnVector is vec.vector_t -> matrix_t, diff -r 2202e40f375a -r 295b66046da3 src/may/matrix/test/test_matrix.yeti --- a/src/may/matrix/test/test_matrix.yeti Tue Nov 19 19:26:15 2013 +0000 +++ b/src/may/matrix/test/test_matrix.yeti Tue Nov 19 19:26:48 2013 +0000 @@ -202,6 +202,22 @@ (constMatrix 5 { rows = 0, columns = 0 }) ), +"transformRows-\(name)": \( + m = newMatrix (RowMajor ()) [[1,4],[0,5],[3,6]]; + m' = newMatrix (ColumnMajor ()) [[1,0,3],[4,5,6]]; + m'' = newMatrix (RowMajor ()) [[2,8],[0,10],[6,12]]; + compareMatrices (mat.transformRows (vec.scaled 2) m) m'' and + compareMatrices (mat.transformRows (vec.scaled 2) m') m'' +), + +"transformColumns-\(name)": \( + m = newMatrix (RowMajor ()) [[1,4],[0,5],[3,6]]; + m' = newMatrix (ColumnMajor ()) [[1,0,3],[4,5,6]]; + m'' = newMatrix (RowMajor ()) [[2,8],[0,10],[6,12]]; + compareMatrices (mat.transformColumns (vec.scaled 2) m) m'' and + compareMatrices (mat.transformColumns (vec.scaled 2) m') m'' +), + "sum-\(name)": \( compareMatrices (mat.sum (constMatrix 2 { rows = 3, columns = 4 }) diff -r 2202e40f375a -r 295b66046da3 src/may/stream/framer.yeti --- a/src/may/stream/framer.yeti Tue Nov 19 19:26:15 2013 +0000 +++ b/src/may/stream/framer.yeti Tue Nov 19 19:26:48 2013 +0000 @@ -13,6 +13,7 @@ mat = load may.matrix; ch = load may.stream.channels; complex = load may.complex; +cm = load may.matrix.complex; load may.stream.type; @@ -52,14 +53,62 @@ :. \(overlappingBlockList size hop stream remaining buffer); fi); -frames { framesize, hop } stream = +//!!! doc: if hop != framesize, stream will be padded at start with +// framesize - hop zeros if padded is true. if hop == framesize, no +// padding will occur at start regardless of the value of padded. The +// end will always be padded (...?) +frames' framesize hop padded stream = if framesize == hop then blockList framesize stream else - overlappingBlockList framesize hop stream - framesize (map \(vec.zeros framesize) [0..stream.channels-1]); + initialBuffer = + if padded then + map \(vec.zeros framesize) [0..stream.channels-1]; + else + mat.asRows + (mat.concatHorizontal + [mat.zeroMatrix { rows = stream.channels, columns = hop }, + stream.read framesize]); + fi; + overlappingBlockList framesize hop stream framesize initialBuffer; fi; +frames framesize options stream = + (var hop = framesize; + var padded = true; + var windower = id; + var transform = id; + for options \case of + Hop h: hop := h; + Padded p: padded := p; + Window w: + windower := mat.transformRows (vec.multiply (w framesize)); + FrequencyDomain f: + transform := mat.transformRows (fft.realForwardMagnitude framesize); + esac; + map transform + (map windower + (frames' framesize hop padded stream))); + +complexFrames framesize options stream = + (var hop = framesize; + var padded = true; + var windower = id; + var rowTransform = do r: complex.complexArray r (vec.zeros (vec.length r)) done; + for options \case of + Hop h: hop := h; + Padded p: padded := p; + Window w: + windower := mat.transformRows (vec.multiply (w framesize)); + FrequencyDomain f: + rowTransform := fft.realForward framesize; + esac; + map do m: + cm.newComplexMatrix (RowMajor ()) (map rowTransform (mat.asRows m)) + done + (map windower + (frames' framesize hop padded stream))); + streamContiguous rate framesize frames = (var remaining = frames; var buffered = mat.zeroSizeMatrix (); @@ -170,41 +219,17 @@ frames fi; -monoFrames params stream = - map ch.mixedDown (frames params stream); - -windowedFrames { framesize, hop, window } stream = - (win = window framesize; - map (vec.multiply win) (monoFrames { framesize, hop } stream)); - -frequencyDomainFrames parameters stream = - (f = fft.realForward parameters.framesize; - map f (windowedFrames parameters stream)); - -typedef params = { framesize is number, hop is number }; -typedef winparams = { framesize is number, hop is number, window is number -> vec.vector_t }; { - frames is params -> stream -> list, - monoFrames is params -> stream -> list, - windowedFrames is winparams -> stream -> list, - frequencyDomainFrames is winparams -> stream -> list >, + frames, + complexFrames, - framesOfFile parameters filename = - frames parameters (af.open filename), + framesOfFile framesize options filename = + frames framesize options (af.open filename), - monoFramesOfFile parameters filename = - monoFrames parameters (af.open filename), + overlapAdd, - windowedFramesOfFile parameters filename = - windowedFrames parameters (af.open filename), - - frequencyDomainFramesOfFile parameters filename = - frequencyDomainFrames parameters (af.open filename), - - overlapAdd is number -> list -> mat.matrix_t, - - streamed is number -> params -> list -> stream, - streamOverlapping is number -> winparams -> list -> stream, + streamed, + streamOverlapping, }