Esempio n. 1
0
        public WaveletD4Transform(int dataDim)
        {
            dim = HaarTransform.RoundDimension(dataDim);
            InitializeConstants();
            D4 = WaveTransforms.App.ScriptApp.New.NumberTable(dim, dim);

            // Algorithm adapated from: http://www.bearcave.com/misl/misl_tech/wavelets/daubechies/daub.java
            for (int row = 0; row < dim; row++)
            {
                double[] v = (D4.Matrix as double[][])[row];
                Array.Clear(v, 0, v.Length);
                v[row] = 1.0;
                for (int n = v.Length; n >= 4; n >>= 1)
                {
                    TransformD4(v, n);
                }
            }

            int interval = dim / 16;

            for (int k = 0; k < dim; k++)
            {
                D4.RowSpecList[k].Type = D4.ColumnSpecList[k].Group = (short)(k / interval);
            }

            List <int> rows = new List <int>();

            for (int row = 0; row < dataDim; row++)
            {
                rows.Add(row);
            }
            D4 = D4.SelectRows(rows);
        }
Esempio n. 2
0
        public WalshTransform(int dataDim)
        {
            dim   = HaarTransform.RoundDimension(dataDim);
            walsh = WaveTransforms.App.ScriptApp.New.NumberTable(dim, dim);

            //
            // The Walsh matrix differs from Hadamard in ordering of the base vectors:
            // the former uses the sequency order (bit-reversal or Gray code permutation)
            // while the latter uses nature order resulted
            // from recursive calculation.
            //
            // The following code is adapted from http://www.musicdsp.org/showone.php?id=18.
            int log2 = Log2(dim);

            for (int row = 0; row < dim; row++)
            {
                double[] v = (walsh.Matrix as double[][])[row];
                v[row] = 1.0;

                for (int i = 0; i < log2; i++)
                {
                    int i2 = (1 << i);
                    for (int j = 0; j < (1 << log2); j += 2 * i2)
                    {
                        for (int k = 0; k < i2; k++)
                        {
                            int    jk = j + k;
                            double a  = v[jk] + v[jk + i2];
                            v[jk + i2] = v[jk] - v[jk + i2];
                            v[jk]      = a;
                        }
                    }
                }
            }

            //
            // perform the bit-reserve and gray code re-ordering.
            //
            int[] order    = new int[dim];
            int[] grayCode = GrayOrder(log2);
            for (int i = 0; i < dim; i++)
            {
                order[i] = ReverseOrder(log2, grayCode[i]);
            }

            // Permutate the rows.
            double[][] newM = new double[dim][];
            double[][] M    = walsh.Matrix as double[][];
            for (int row = 0; row < dim; row++)
            {
                newM[row] = M[order[row]];
            }
            for (int row = 0; row < dim; row++)
            {
                M[row] = newM[row];
            }

            int interval = dim / 16;

            for (int k = 0; k < dim; k++)
            {
                walsh.RowSpecList[k].Type = walsh.ColumnSpecList[k].Group = (short)(k / interval);
            }

            // Remove the redudant rows.
            List <int> rows = new List <int>();

            for (int row = 0; row < dataDim; row++)
            {
                rows.Add(row);
            }
            walsh = walsh.SelectRows(rows);

            // Normalize the matrix.
            double normFactor = Math.Pow(2, -log2 / 2.0);

            for (int row = 0; row < walsh.Rows; row++)
            {
                for (int col = 0; col < walsh.Columns; col++)
                {
                    walsh.Matrix[row][col] *= normFactor;
                }
            }
        }