To give a little more context, the Discrete Fourier Transform (DFT) is in general a complex-to-complex transform - if you give it a vector of `N`

complex numbers in the time domain, you get `N`

complex numbers back representing the spectra of your signal. The Fast Fourier Transform (FFT) is a fast algorithm for computing the DFT, but it’s ubiquitous enough that people commonly use “FFT” for the transform in general.

In the special case where you signal is real-valued (the imaginary part is zero for all your samples), it turns out that the spectrum is conjugate-symmetric (positive frequencies are the complex conjugates of negative frequencies), so you only need to compute half of it. `rfft`

exists to do that optimization, and only gives you the positive half of the spectrum. So in that case `rfft(x)`

will give you a vector of length `length(x) ÷ 2 + 1`

(note `÷`

is truncating integer division).

So if `x`

is length `16`

, `rfft(x)`

will be of length `9`

, but if `x`

is length `17`

, `rfft(x)`

will *also* be length `9`

. That’s why when you invert the transform with `irfft`

you need to specify the original length, as it’s lost in the `rfft`

process.

If you’re dealing with real-valued signals you can use `rfft`

and `irfft`

, and if you have complex signals you should use `fft`

and `ifft`