result of FFT
Dennis
dkorpel at gmail.com
Tue Jul 8 19:39:37 UTC 2025
On Tuesday, 8 July 2025 at 18:11:27 UTC, Matthew wrote:
> I can't figure out how the 4096 results of the FFT relate to
> the frequencies in the input.
>
> I tried taking the magnitude of each element,
That's correct!
> What do the 4096 resulting complex numbers represent?
The magnitude of each element (computed with `std.complex.abs`)
corresponds to the amplitude of each frequency component, the
angle in the complex plane represents the phase (computed with
`std.complex.arg` in radians).
The frequencies are all relative to the FFT window. `res[0]` is 0
Hz, `res[1]` corresponds to a sine wave that fits 1 cycle inside
your window, res[2] is 2 cycles etc. The frequency in Hz depends
on your sample rate. If it's 44100, 44100 / 4096 = ~10 so your
window fits 10 times in 1 second. That means res[1] is around 10
hz, res[2] 20 hz etc. up to res[4095] which is 40950 hz. Although
everything from res[2048] onwards is just a mirrored copy since
44100 samples/s can only capture frequencies up to 22 Khz (for
more info search 'Nyquist frequency' and 'aliasing').
> How should I use the result to check whether the 1209Hz,
> 1336Hz, 1477Hz, or 1633Hz tones are present in that part of the
> sound?
The closest bucket to 1209Hz is 1209 * (4096 / 44100) = 112.3,
which is not an exact match so it will leak frequencies in all
other bins, but it will still mostly contribute to bins 112 and
113 so it's probably good enough to just check those. If you need
better frequency resolution you can try applying a 'window
function' to reduce spectral leakage or increasing the window
size either by including more samples reducing the time
resolution, or by padding the window with 0's which will
essentially adds interpolated bins.
I haven't programmed pitch detection myself yet (still on my todo
list!) so I don't know how much of this is needed for your use
case, but you can just start by checking the closest bin and see
how far you get. Good luck!
More information about the Digitalmars-d-learn
mailing list