예제 #1
0
        /// <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]);
                }
            }
        }
예제 #2
0
        /// <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]);
            }
        }
예제 #3
0
 /// <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;
 }