annotate fft/jsfft/lib/fft_image.js @ 40:223f770b5341 kissfft-double tip

Try a double-precision kissfft
author Chris Cannam
date Wed, 07 Sep 2016 10:40:32 +0100
parents 66f9fd5ac611
children
rev   line source
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 )