Martin Donnelly e6e767bf26 some changes
2016-06-21 10:59:38 +01:00

88 lines
2.1 KiB
JavaScript

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