Advertisement
omnilynx

Haar Transform

Mar 9th, 2012
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function Average(left, right) {
  2.     var result = new Array();
  3.    
  4.     if (left instanceof Array && right instanceof Array) {
  5.         for (var i=0; i<left.length || i<right.length; i++) {
  6.             result[i] = Average((i<left.length ? left[i] : 0.0), (i<right.length ? right[i] : 0.0));
  7.         }
  8.     } else if (left instanceof Array) {
  9.         for (var i=0; i<left.length; i++) {
  10.             result[i] = Average(left[i], (i==0 ? right : 0.0));
  11.         }
  12.     } else if (right instanceof Array) {
  13.         for (var i=0; i<right.length; i++) {
  14.             result[i] = Average((i==0 ? left : 0.0), right[i]);
  15.         }
  16.     } else {
  17.         result = (left + right) / 2;
  18.     }
  19.    
  20.     return result;
  21. }
  22.  
  23. function Difference (left, right) {
  24.     var result = new Array();
  25.    
  26.     if (left instanceof Array && right instanceof Array) {
  27.         for (var i=0; i<left.length || i<right.length; i++) {
  28.             result[i] = Difference((i<left.length ? left[i] : 0.0), (i<right.length ? right[i] : 0.0));
  29.         }
  30.     } else if (left instanceof Array) {
  31.         for (var i=0; i<left.length; i++) {
  32.             result[i] = Difference(left[i], (i==0 ? right : 0.0));
  33.         }
  34.     } else if (right instanceof Array) {
  35.         for (var i=0; i<right.length; i++) {
  36.             result[i] = Difference((i==0 ? left : 0.0), right[i]);
  37.         }
  38.     } else {
  39.         result = left - right;
  40.     }
  41.    
  42.     return result;
  43. }
  44.  
  45. function Haar(source) {
  46.     if (source instanceof Array) {
  47.         if (source.length > 1) {
  48.             var avg = new Array();
  49.             var diff = new Array();
  50.             for (var i=0; i<source.length - 1; i += 2) {
  51.                 avg[avg.length] = Average(source[i], source[i+1]);
  52.                 diff[diff.length] = Difference(source[i], source[i+1]);
  53.             }
  54.             for (var i=0; i<diff.length; i++) { diff[i] = Haar(diff[i]); }
  55.             source = Haar(avg).concat(diff, (source.length % 2 == 1 ? source[source.length -1] : []));
  56.         } else if (source.length == 1) { source[0] = Haar(source[0]); }
  57.     }
  58.     return source;
  59. }
  60.  
  61. function Left(average, difference) {
  62.     var result = new Array();
  63.    
  64.     if (average instanceof Array && difference instanceof Array) {
  65.         for (var i=0; i<average.length || i<difference.length; i++) {
  66.             result[i] = Left((i<average.length ? average[i] : 0.0), (i<difference.length ? difference[i] : 0.0));
  67.         }
  68.     } else if (average instanceof Array) {
  69.         for (var i=0; i<average.length; i++) {
  70.             result[i] = Left(average[i], (i==0 ? difference : 0.0));
  71.         }
  72.     } else if (difference instanceof Array) {
  73.         for (var i=0; i<difference.length; i++) {
  74.             result[i] = Left((i==0 ? average : 0.0), difference[i]);
  75.         }
  76.     } else {
  77.         result = average + difference/2;
  78.     }
  79.    
  80.     return result;
  81. }
  82.  
  83. function Right(average, difference) {
  84.     var result = new Array();
  85.    
  86.     if (average instanceof Array && difference instanceof Array) {
  87.         for (var i=0; i<average.length || i<difference.length; i++) {
  88.             result[i] = Right((i<average.length ? average[i] : 0.0), (i<difference.length ? difference[i] : 0.0));
  89.         }
  90.     } else if (average instanceof Array) {
  91.         for (var i=0; i<average.length; i++) {
  92.             result[i] = Right(average[i], (i==0 ? difference : 0.0));
  93.         }
  94.     } else if (difference instanceof Array) {
  95.         for (var i=0; i<difference.length; i++) {
  96.             result[i] = Right((i==0 ? average : 0.0), difference[i]);
  97.         }
  98.     } else {
  99.         result = average - difference/2;
  100.     }
  101.    
  102.     return result;
  103. }
  104.  
  105. function deHaar(source) {
  106.     if (source instanceof Array) {
  107.         if (source.length > 1) {
  108.             var sub = Math.floor(source.length/2);
  109.             var avg = source.slice(0,sub);
  110.             var diff = source.slice(sub, sub*2);
  111.             deHaar(avg);
  112.             for (var i=0; i<sub; i++) {
  113.                 diff[i] = deHaar(diff[i]);
  114.                 source[i*2] = Left(avg[i], diff[i]);
  115.                 source[i*2+1] = Right(avg[i], diff[i]);
  116.             }
  117.         } else if (source.length == 1) { source[0] = deHaar(source[0]); }
  118.     }
  119.     return source;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement