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); }
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; } } }