![require(esm) Backported to Node.js 20, Paving the Way for ESM-Only Packages](https://cdn.sanity.io/images/cgdhsj6q/production/be8ab80c8efa5907bc341c6fefe9aa20d239d890-1600x1097.png?w=400&fit=max&auto=format)
Security News
require(esm) Backported to Node.js 20, Paving the Way for ESM-Only Packages
require(esm) backported to Node.js 20, easing the transition to ESM-only packages and reducing complexity for developers as Node 18 nears end-of-life.
GLSL setup for performing a Fast Fourier Transform of real-valued input
$ npm install glsl-rfft
var rfft = require('glsl-rfft');
// Set up a forward transform:
var forwardTransform = rfft({
width: 4,
height: 4,
input: 0,
ping: 1,
pong: 2,
output: 0,
forward: true,
splitNormalization: true
}));
// Output is a list of passes:
// => [{
// operation: 'fft',
// passes:[
// {horizontal: true, forward: true, resolution: [0.25, 0.25], subtransformSize: 2, input: 0, output: 2},
// {horizontal: true, forward: true, resolution: [0.25, 0.25], subtransformSize: 4, input: 2, output: 1}
// ]
// }, {
// operation: 'untangle',
// passes:[
// {resolution: [0.25, 0.25], horizontal: true, normalization: 0.5, input: 1, output: 2}
// ]},
// {
// operation: 'fft',
// passes:[
// {horizontal: false, forward: true, resolution: [0.25, 0.25], subtransformSize: 2, input: 2, output: 1},
// {horizontal: false, forward: true, resolution: [0.25, 0.25], subtransformSize: 4, input: 1, output: 2}
// ]
// },{
// operation: 'untangle',
// passes:[
// {resolution: [0.25, 0.25], horizontal: false, normalization: 0.5, input: 2, output: 0}
// ]
// }]
Usage of the GLSL fragment shader using the above parameters as uniforms:
precision highp float;
#pragma glslify: fft = require(glsl-rfft)
uniform sampler2D src;
uniform vec2 resolution;
uniform float subtransformSize;
uniform bool horizontal, forward;
void main () {
gl_FragColor = fft(src, resolution, subtransformSize, horizontal, forward);
}
This shader computes the 2D Fast Fourier Transform of four real-valued input matrices contained in a single four-channel floating point (or half float) WebGL texture. Each channel contains the real-valued input. The results match and are tested against ndarray-fft.
The output follows the format of Moreland and Angel [1]. To within a sign, it contains every unique entry of the full complex FFT, but the output is compressed to fit in the same storage space as the input. See [1] for more details.
This module does not interface with WebGL or have WebGL-specific peer dependencies. It only performs the setup work and exposes a fragment shader that performs the Fourier transform.
This module is designed for use with glslify, though it's not required. It also works relatively effortlessly with regl, though that's also not required. At minimum, you'll need no less than two float or half-float WebGL framebuffers, including input, output, and two buffers to ping-pong back and forth between during the passes. The ping-pong framebuffers may include the input and output framebuffers as long as the parity of the number of steps permits the final output without requiring an extra copy operation.
The size of the textures must be a power of two, but not necessarily square.
As far as fast Fourier transforms go, it's not particularly optimized, though it's much faster than transferring data to and from the GPU each time you need to compute a Fourier transform.
require('glsl-rfft')(options)
Perform the setup work required to use the FFT kernel in the fragment shader, index.glsl
. Input arguments are:
input
(Any
): An identifier or object for the input framebuffer.output
(Any
): An identifier or object for the final output framebuffer.ping
(Any
): An identifier or object for the first ping-pong framebuffer.pong
(Any
): An identifier or object for the second ping-pong framebuffer.forward
(Boolean
): true
if the transform is in the forward direction.size
(Number
): size of the input, equal to the width
and height
. Must be a power of two.width
(Number
): width of the input. Must be a power of two. Ignored if size
is specified.height
(Number
): height of the input. Must be a power of two. Ignored if size
is specifid.splitNormalization
: (Boolean
): If true
, normalize by 1 / √(width * height)
on both the forward and inverse transforms. If false
, normalize by 1 / (width * height)
on only the inverse transform. Default is true
. Provided to avoid catastrophic overflow during the forward transform when using half-float textures. One-way transforms will match ndarray-fft only if false
.Returns a list of phases. Each phase is identified by the name of the Each object in the list is a set of parameters that must either be used to bind the correct framebuffers or passed as uniforms to the fragment shader.
#pragma glslify: fft = require(glsl-rfft/fft)
vec4 fft(sampler2D src, vec2 resolution, float subtransformSize, bool horizontal, bool forward)
Returns the gl_FragColor
in order to perform a single pass of the FFT comptuation. Uniforms map directly to the output of the JavaScript setup function, with the exception of src
which is a sampler2D
for the input framebuffer or texture.
#pragma glslify: untangle = require(glsl-rfft/untangle)
vec4 untangle(sampler2D src, vec2 resolution, bool horizontal, float normalization)
Returns the gl_FragColor
in order to untangle the output from a pass of the FFT computation.
#pragma glslify: tangle = require(glsl-rfft/tangle)
vec4 tangle(sampler2D src, vec2 resolution, bool horizontal, float normalization)
Returns the gl_FragColor
in order to tangle the output from a pass of the FFT computation.
© Ricky Reusser 2017. MIT License. Based on the filtering example of David Li. See LICENSE for more details.
FAQs
GLSL setup for performing a Fast Fourier Transform of real-valued input
The npm package glsl-rfft receives a total of 1 weekly downloads. As such, glsl-rfft popularity was classified as not popular.
We found that glsl-rfft demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
require(esm) backported to Node.js 20, easing the transition to ESM-only packages and reducing complexity for developers as Node 18 nears end-of-life.
Security News
PyPI now supports iOS and Android wheels, making it easier for Python developers to distribute mobile packages.
Security News
Create React App is officially deprecated due to React 19 issues and lack of maintenance—developers should switch to Vite or other modern alternatives.