pg-fft

Fast Fourier Transforms in PostgreSQL

pg-fft
-- A 1 kHz signal containing a 50 Hz and a 120 Hz sine
CREATE TABLE samples AS
SELECT i AS t,
       (0.7 * sin(2 * pi() * 50 * i / 1000.0)
          + sin(2 * pi() * 120 * i / 1000.0))::real AS v
  FROM generate_series(0, 999) i;

-- Which frequencies dominate?
SELECT bin - 1 AS freq_hz, round(power::numeric, 1) AS power
  FROM (SELECT fft_agg(v ORDER BY t) AS spectrum FROM samples) s,
       unnest(spectrum) WITH ORDINALITY AS u(power, bin)
 WHERE power > 10 AND bin - 1 < 500
 ORDER BY freq_hz;
© 2026 Omar Bohsali. RSS | @omarish