pg-fft
Fast Fourier Transforms in PostgreSQL
-- 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;