Chris@25: 'use strict'; Chris@25: Chris@25: !function(complex_array, fft) { Chris@25: Chris@25: var ComplexArray = complex_array.ComplexArray Chris@25: Chris@25: fft.FFTImageDataRGBA = function(data, nx, ny) { Chris@25: var rgb = splitRGB(data) Chris@25: Chris@25: return mergeRGB( Chris@25: FFT2D(new ComplexArray(rgb[0], Float32Array), nx, ny), Chris@25: FFT2D(new ComplexArray(rgb[1], Float32Array), nx, ny), Chris@25: FFT2D(new ComplexArray(rgb[2], Float32Array), nx, ny) Chris@25: ) Chris@25: } Chris@25: Chris@25: function splitRGB(data) { Chris@25: var n = data.length / 4, Chris@25: r = new Uint8ClampedArray(n), Chris@25: g = new Uint8ClampedArray(n), Chris@25: b = new Uint8ClampedArray(n), Chris@25: i Chris@25: Chris@25: for(i = 0; i < n; i++) { Chris@25: r[i] = data[4 * i ] Chris@25: g[i] = data[4 * i + 1] Chris@25: b[i] = data[4 * i + 2] Chris@25: } Chris@25: Chris@25: return [r, g, b] Chris@25: } Chris@25: Chris@25: function mergeRGB(r, g, b) { Chris@25: var n = r.length, Chris@25: output = new ComplexArray(n * 4), Chris@25: i Chris@25: Chris@25: for(i = 0; i < n; i++) { Chris@25: output.real[4 * i ] = r.real[i] Chris@25: output.imag[4 * i ] = r.imag[i] Chris@25: output.real[4 * i + 1] = g.real[i] Chris@25: output.imag[4 * i + 1] = g.imag[i] Chris@25: output.real[4 * i + 2] = b.real[i] Chris@25: output.imag[4 * i + 2] = b.imag[i] Chris@25: } Chris@25: Chris@25: return output Chris@25: } Chris@25: Chris@25: function FFT2D(input, nx, ny, inverse) { Chris@25: var i, j, Chris@25: transform = inverse ? 'InvFFT' : 'FFT', Chris@25: output = new ComplexArray(input.length, input.ArrayType), Chris@25: row = new ComplexArray(nx, input.ArrayType), Chris@25: col = new ComplexArray(ny, input.ArrayType) Chris@25: Chris@25: for(j = 0; j < ny; j++) { Chris@25: row.map(function(v, i) { Chris@25: v.real = input.real[i + j * nx] Chris@25: v.imag = input.imag[i + j * nx] Chris@25: }) Chris@25: row[transform]().forEach(function(v, i) { Chris@25: output.real[i + j * nx] = v.real Chris@25: output.imag[i + j * nx] = v.imag Chris@25: }) Chris@25: } Chris@25: Chris@25: for(i = 0; i < nx; i++) { Chris@25: col.map(function(v, j) { Chris@25: v.real = output.real[i + j * nx] Chris@25: v.imag = output.imag[i + j * nx] Chris@25: }) Chris@25: col[transform]().forEach(function(v, j) { Chris@25: output.real[i + j * nx] = v.real Chris@25: output.imag[i + j * nx] = v.imag Chris@25: }) Chris@25: } Chris@25: Chris@25: return output Chris@25: } Chris@25: Chris@25: }( Chris@25: typeof require === 'undefined' && (this.complex_array) || Chris@25: require('./complex_array'), Chris@25: typeof require === 'undefined' && (this.fft) || Chris@25: require('./fft') Chris@25: )