88 lines
2.1 KiB
JavaScript
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')
|
|
)
|