Chris@25
|
1 'use strict';
|
Chris@25
|
2
|
Chris@25
|
3 !function(complex_array, fft) {
|
Chris@25
|
4
|
Chris@25
|
5 var ComplexArray = complex_array.ComplexArray
|
Chris@25
|
6
|
Chris@25
|
7 fft.FFTImageDataRGBA = function(data, nx, ny) {
|
Chris@25
|
8 var rgb = splitRGB(data)
|
Chris@25
|
9
|
Chris@25
|
10 return mergeRGB(
|
Chris@25
|
11 FFT2D(new ComplexArray(rgb[0], Float32Array), nx, ny),
|
Chris@25
|
12 FFT2D(new ComplexArray(rgb[1], Float32Array), nx, ny),
|
Chris@25
|
13 FFT2D(new ComplexArray(rgb[2], Float32Array), nx, ny)
|
Chris@25
|
14 )
|
Chris@25
|
15 }
|
Chris@25
|
16
|
Chris@25
|
17 function splitRGB(data) {
|
Chris@25
|
18 var n = data.length / 4,
|
Chris@25
|
19 r = new Uint8ClampedArray(n),
|
Chris@25
|
20 g = new Uint8ClampedArray(n),
|
Chris@25
|
21 b = new Uint8ClampedArray(n),
|
Chris@25
|
22 i
|
Chris@25
|
23
|
Chris@25
|
24 for(i = 0; i < n; i++) {
|
Chris@25
|
25 r[i] = data[4 * i ]
|
Chris@25
|
26 g[i] = data[4 * i + 1]
|
Chris@25
|
27 b[i] = data[4 * i + 2]
|
Chris@25
|
28 }
|
Chris@25
|
29
|
Chris@25
|
30 return [r, g, b]
|
Chris@25
|
31 }
|
Chris@25
|
32
|
Chris@25
|
33 function mergeRGB(r, g, b) {
|
Chris@25
|
34 var n = r.length,
|
Chris@25
|
35 output = new ComplexArray(n * 4),
|
Chris@25
|
36 i
|
Chris@25
|
37
|
Chris@25
|
38 for(i = 0; i < n; i++) {
|
Chris@25
|
39 output.real[4 * i ] = r.real[i]
|
Chris@25
|
40 output.imag[4 * i ] = r.imag[i]
|
Chris@25
|
41 output.real[4 * i + 1] = g.real[i]
|
Chris@25
|
42 output.imag[4 * i + 1] = g.imag[i]
|
Chris@25
|
43 output.real[4 * i + 2] = b.real[i]
|
Chris@25
|
44 output.imag[4 * i + 2] = b.imag[i]
|
Chris@25
|
45 }
|
Chris@25
|
46
|
Chris@25
|
47 return output
|
Chris@25
|
48 }
|
Chris@25
|
49
|
Chris@25
|
50 function FFT2D(input, nx, ny, inverse) {
|
Chris@25
|
51 var i, j,
|
Chris@25
|
52 transform = inverse ? 'InvFFT' : 'FFT',
|
Chris@25
|
53 output = new ComplexArray(input.length, input.ArrayType),
|
Chris@25
|
54 row = new ComplexArray(nx, input.ArrayType),
|
Chris@25
|
55 col = new ComplexArray(ny, input.ArrayType)
|
Chris@25
|
56
|
Chris@25
|
57 for(j = 0; j < ny; j++) {
|
Chris@25
|
58 row.map(function(v, i) {
|
Chris@25
|
59 v.real = input.real[i + j * nx]
|
Chris@25
|
60 v.imag = input.imag[i + j * nx]
|
Chris@25
|
61 })
|
Chris@25
|
62 row[transform]().forEach(function(v, i) {
|
Chris@25
|
63 output.real[i + j * nx] = v.real
|
Chris@25
|
64 output.imag[i + j * nx] = v.imag
|
Chris@25
|
65 })
|
Chris@25
|
66 }
|
Chris@25
|
67
|
Chris@25
|
68 for(i = 0; i < nx; i++) {
|
Chris@25
|
69 col.map(function(v, j) {
|
Chris@25
|
70 v.real = output.real[i + j * nx]
|
Chris@25
|
71 v.imag = output.imag[i + j * nx]
|
Chris@25
|
72 })
|
Chris@25
|
73 col[transform]().forEach(function(v, j) {
|
Chris@25
|
74 output.real[i + j * nx] = v.real
|
Chris@25
|
75 output.imag[i + j * nx] = v.imag
|
Chris@25
|
76 })
|
Chris@25
|
77 }
|
Chris@25
|
78
|
Chris@25
|
79 return output
|
Chris@25
|
80 }
|
Chris@25
|
81
|
Chris@25
|
82 }(
|
Chris@25
|
83 typeof require === 'undefined' && (this.complex_array) ||
|
Chris@25
|
84 require('./complex_array'),
|
Chris@25
|
85 typeof require === 'undefined' && (this.fft) ||
|
Chris@25
|
86 require('./fft')
|
Chris@25
|
87 )
|