Eliot Miranda uploaded a new version of Sound to project The Trunk: http://source.squeak.org/trunk/Sound-eem.83.mcz
==================== Summary ====================
Name: Sound-eem.83 Author: eem Time: 23 October 2021, 3:52:26.745004 pm UUID: bb4ab1c4-cd31-45f2-80b8-0b8a76870de8 Ancestors: Sound-ct.82
Avoid busy loop in playAndWaitUntilDone Use Float64Array in FWT.
=============== Diff against Sound-ct.82 ===============
Item was changed: ----- Method: AbstractSound>>playAndWaitUntilDone (in category 'playing') ----- playAndWaitUntilDone "Play this sound to the sound ouput port and wait until it has finished playing before returning."
+ | duration timeTaken delay | + duration := [self duration] on: MessageNotUnderstood do: [:ex| SmallInteger maxVal]. + timeTaken := Time utcMicrosecondClock. self play. + timeTaken := Time utcMicrosecondClock - timeTaken // 1000. + duration > timeTaken ifTrue: + [delay := Delay forMilliseconds: (SoundPlayer bufferMSecs min: duration - timeTaken). + [self samplesRemaining > 0] whileTrue: [delay wait]]. + (Delay forMilliseconds: SoundPlayer bufferMSecs) wait "ensure last buffer has been output" + + "AndreasSystemProfiler spyOn: [PluckedSound bachFugue playAndWaitUntilDone]"! - [self samplesRemaining > 0] whileTrue. - (Delay forMilliseconds: 2 * SoundPlayer bufferMSecs) wait. "ensure last buffer has been output" - !
Item was changed: ----- Method: FWT>>doWaveDemo (in category 'testing') ----- doWaveDemo "FWT new doWaveDemo" "Printing the above should yield a small number -- I get 1.1e-32" | originalData | self nSamples: 312 nLevels: 3. self setAlpha: 0.0 beta: 0.0.
"Install a sine wave as sample data" + self samples: ((1 to: nSamples) collect: [:i | ((i-1) * 0.02 * Float pi) sin] as: Float64Array). - self samples: ((1 to: nSamples) collect: [:i | ((i-1) * 0.02 * Float pi) sin]). originalData := samples copy. FFT new plot: (samples copyFrom: 1 to: nSamples) in: (0@0 extent: nSamples@100).
"Transform forward and plot the decomposition" self transformForward: true. transform withIndexDo: [:w :i | FFT new plot: (w copyFrom: 1 to: w size-5) in: (i-1\2*320@(i+1//2*130) extent: (w size-5)@100)].
"Test copy out and read in the transform coefficients" self coeffs: self coeffs.
"Ttransform back, plot the reconstruction, and return the error figure" self transformForward: false. FFT new plot: (samples copyFrom: 1 to: nSamples) in: (320@0 extent: nSamples@100). ^ self meanSquareError: originalData!
Item was changed: ----- Method: FWT>>nSamples:nLevels: (in category 'initialization') ----- nSamples: n nLevels: nLevs "Initialize a wavelet transform." "Note the sample array size must be N + 5, where N is a multiple of 2^nLevels" | dyadSize | (n // (1 bitShift: nLevs)) > 0 ifFalse: [self error: 'Data size error']. (n \ (1 bitShift: nLevs)) = 0 ifFalse: [self error: 'Data size error']. nSamples := n. + samples := Float64Array new: n + 5. - samples := Array new: n + 5. nLevels := nLevs. transform := Array new: nLevels*2. "Transformed data is stored as a tree of coeffs" dyadSize := nSamples. 1 to: nLevels do: [:i | dyadSize := dyadSize // 2. + transform at: 2*i-1 put: (Float64Array new: dyadSize + 5). + transform at: 2*i put: (Float64Array new: dyadSize + 5)]! - transform at: 2*i-1 put: (Array new: dyadSize + 5). - transform at: 2*i put: (Array new: dyadSize + 5)]!
Item was changed: ----- Method: FWT>>setAlpha:beta: (in category 'initialization') ----- setAlpha: alph beta: bet "Set alpha and beta, compute wavelet coeefs, and derive hFilter and lFilter" | tcosa tcosb tsina tsinb | alpha := alph. beta := bet.
"WaveletCoeffs..." "precalculate cosine of alpha and sine of beta" tcosa := alpha cos. tcosb := beta cos. tsina := alpha sin. tsinb := beta sin. + coeffs := Float64Array new: 6. - coeffs := Array new: 6. "calculate first two wavelet coefficients a := a(-2) and b := a(-1)" coeffs at: 1 put: ((1.0 + tcosa + tsina) * (1.0 - tcosb - tsinb) + (2.0 * tsinb * tcosa)) / 4.0. coeffs at: 2 put: ((1.0 - tcosa + tsina) * (1.0 + tcosb - tsinb) - (2.0 * tsinb * tcosa)) / 4.0.
"precalculate cosine and sine of alpha minus beta" tcosa := (alpha - beta) cos. tsina := (alpha - beta) sin.
"calculate last four wavelet coefficients c := a(0), d := a(1), e := a(2), and f := a(3)" coeffs at: 3 put: (1.0 + tcosa + tsina) / 2.0. coeffs at: 4 put: (1.0 + tcosa - tsina) / 2.0. coeffs at: 5 put: 1.0 - (coeffs at: 1) - (coeffs at: 3). coeffs at: 6 put: 1.0 - (coeffs at: 2) - (coeffs at: 4).
"MakeFiltersFromCoeffs..." "Select the non-zero wavelet coefficients" coeffs := coeffs copyFrom: (coeffs findFirst: [:c | c abs > 1.0e-14]) to: (coeffs findLast: [:c | c abs > 1.0e-14]).
"Form the low pass and high pass filters for decomposition" hTilde := coeffs reversed collect: [:c | c / 2.0]. gTilde := coeffs collect: [:c | c / 2.0]. 1 to: gTilde size by: 2 do: [:i | gTilde at: i put: (gTilde at: i) negated].
"Form the low pass and high pass filters for reconstruction" h := coeffs copy. g := coeffs reversed. 2 to: g size by: 2 do: [:i | g at: i put: (g at: i) negated] !
packages@lists.squeakfoundation.org