Chris@38: Chris@264: module yetilab.signal.window; Chris@38: Chris@222: vec = load yetilab.vector.vector; Chris@222: bf = load yetilab.vector.blockfuncs; Chris@38: Chris@263: cosineWindowSymmetric a0 a1 a2 a3 n = Chris@263: (n1 = n - 1; Chris@218: vec.fromList Chris@38: (map do i: Chris@38: a0 Chris@263: - a1 * cos(2 * pi * i / n1) Chris@263: + a2 * cos(4 * pi * i / n1) Chris@263: - a3 * cos(6 * pi * i / n1) Chris@263: done [0..n1])); Chris@263: Chris@263: cosineWindowPeriodic a0 a1 a2 a3 n = Chris@263: (vec.fromList Chris@263: (map do i: Chris@263: a0 Chris@38: - a1 * cos(2 * pi * i / n) Chris@38: + a2 * cos(4 * pi * i / n) Chris@262: - a3 * cos(6 * pi * i / n) Chris@263: done [0..n-1])); Chris@38: Chris@263: cosineWindow a0 a1 a2 a3 sampling n = Chris@263: case sampling of Chris@263: Symmetric (): cosineWindowSymmetric; Chris@263: Periodic (): cosineWindowPeriodic; Chris@263: esac a0 a1 a2 a3 n; Chris@263: Chris@265: bartlettSymmetric n = Chris@265: if n < 2 then vec.ones n Chris@265: else Chris@265: vec.fromList Chris@265: (n1 = n - 1; Chris@265: h = int (n1 / 2); Chris@265: concat [ Chris@265: map do i: Chris@265: 2 * i / n1 Chris@265: done [0..h], Chris@265: map do i: Chris@265: 2 - (2 * i / n1) Chris@265: done [h+1..n1] Chris@265: ]); Chris@265: fi; Chris@265: Chris@265: bartlettPeriodic n = Chris@265: if n < 2 then vec.ones n Chris@265: else Chris@265: vec.slice (bartlettSymmetric (n+1)) 0 n; Chris@265: fi; Chris@265: Chris@265: bartlett sampling = Chris@265: case sampling of Chris@265: Symmetric (): bartlettSymmetric; Chris@265: Periodic (): bartlettPeriodic; Chris@265: esac; Chris@265: Chris@263: hann = cosineWindow 0.5 0.5 0.0 0.0; Chris@263: hamming = cosineWindow 0.54 0.46 0.0 0.0; Chris@263: blackman = cosineWindow 0.42 0.50 0.08 0.0; Chris@263: nuttall = cosineWindow 0.355768 0.487396 0.144232 0.012604; Chris@263: blackmanNuttall = cosineWindow 0.3635819 0.4891775 0.1365995 0.0106411; Chris@263: blackmanHarris = cosineWindow 0.35875 0.48829 0.14128 0.01168; Chris@263: Chris@218: boxcar = vec.consts 0.5; Chris@38: Chris@265: windowFunction type options = Chris@263: (var sampling = Periodic (); Chris@263: for options \case of Chris@263: Symmetric s: if s then sampling := Symmetric () fi Chris@263: esac; Chris@263: case type of Chris@263: Hann (): hann sampling; Chris@263: Hamming (): hamming sampling; Chris@263: Blackman (): blackman sampling; Chris@263: Nuttall (): nuttall sampling; Chris@263: BlackmanNuttall (): blackmanNuttall sampling; Chris@263: BlackmanHarris (): blackmanHarris sampling; Chris@263: Boxcar (): boxcar; Chris@265: Bartlett (): bartlett sampling; Chris@263: esac); Chris@263: Chris@49: windowed windowFunc frames = Chris@43: case frames of Chris@43: []: frames; Chris@43: _: (first = head frames; Chris@218: window = windowFunc (vec.length first); Chris@43: map (bf.multiply window) frames); Chris@43: esac; Chris@43: Chris@38: { Chris@263: cosineWindow, Chris@263: hann = hann (Periodic ()), Chris@263: hamming = hamming (Periodic ()), Chris@263: blackman = blackman (Periodic ()), Chris@263: nuttall = nuttall (Periodic ()), Chris@263: blackmanNuttall = blackmanNuttall (Periodic ()), Chris@263: blackmanHarris = blackmanHarris (Periodic ()), Chris@265: boxcar, Chris@265: bartlett = bartlett (Periodic ()), Chris@263: windowFunction, Chris@263: windowed Chris@38: }; Chris@38: