Intended behaviour of irfft


#1

Hi,

I am trying to get a hold on irfft but there is no much docs / examples about it. I tried some python code but the equivalent failed. Basically (and I aopologize for this), I can’t make sense of

irfft(fft(rand(16)))

which throws an error

Has anyone used this ?

Thank you for your help,

Bests


#2

irfft is the inverse of rfft. Also, you need to supply an extra argument for the size of first dimension (since it is not uniquely determined by the output of rfft).


#3

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