/// <summary> /// Implements a wavelet filter. /// </summary> /// <param name="data">Matrix</param> public void Apply(float[,] data) { var B = WaveletDecomposition.Forward(data); int n, m; for (int i = 1; i < B.Length; i++) { var b = B[i]; n = b.GetLength(0); m = b.GetLength(1); if (!Maths.IsEven(n)) { n--; // ? } if (!Maths.IsEven(m)) { m--; // ? } // visu_shrink var bb = Matrice.Reshape(b, b.Length).ToAbs(); Array.Sort(bb); var median = Math.Sqrt(bb[bb.Length / 2]) * Math.Sqrt(Maths.Log2(n * m)); for (int y = 0; y < n; y++) { for (int x = 0; x < m; x++) { b[y, x] = Math.Abs(b[y, x]) > median ? b[y, x] : 0; } } B[i] = b; } var output = WaveletDecomposition.Backward(B); float factor = 1 + Factor; n = data.GetLength(0); m = data.GetLength(1); for (int y = 0; y < n; y++) { for (int x = 0; x < m; x++) { // pass filtering data[y, x] = output[y, x] + factor * (data[y, x] - output[y, x]); } } }
/// <summary> /// Implements a wavelet filter. /// </summary> /// <param name="data">Array</param> public void Apply(Complex32[] data) { var B = WaveletDecomposition.Forward(data); int n; for (int i = 1; i < B.Length; i++) { var b = B[i]; n = b.GetLength(0); if (!Maths.IsEven(n)) { n--; // ? } // visu_shrink var bb = b.ToAbs(); Array.Sort(bb); var median = Math.Sqrt(bb[bb.Length / 2]) * Math.Sqrt(Maths.Log2(n)); for (int y = 0; y < n; y++) { b[y] = Maths.Abs(b[y]) > median ? b[y] : 0; } B[i] = b; } var output = WaveletDecomposition.Backward(B); float factor = 1 + Factor; n = data.GetLength(0); for (int y = 0; y < n; y++) { // pass filtering data[y] = output[y] + factor * (data[y] - output[y]); } }
/// <summary> /// Initializes the wavelet filter. /// </summary> /// <param name="waveletDecomposition">Discrete wavelet decomposition</param> /// <param name="factor">Factor [-1, 1]</param> public WaveletFilter(WaveletDecomposition waveletDecomposition, float factor = -1.0f) { WaveletDecomposition = waveletDecomposition; Factor = factor; }