1
$\begingroup$

I am trying to calculate inverse discrete fourier transform for an array of signals.

I am using the following formula:

$$ x[n] = \tfrac1N \sum\limits_{k=0}^{N-1} X[k] \, e^{j 2 \pi k n/N} $$

And my python code looks as follow.

def IFT(array):
    array = np.asarray(array, dtype=float)
    # array length
    N = array.shape[0]
    # new array of lenght N [0, N-1]
    n = np.arange(N)
    k = n.reshape((N, 1))
    # Calculate the exponential of all elements in the input array.
    M = np.exp(2j * np.pi * k * n / N)
    return 1 / N * np.dot(M, array)

y = 2*np.sin(2*np.pi*f1*t+0.2) + 3*np.cos(2*np.pi*f2*t+0.3) + noise*5
IFT(sc.fft(y))

array([ 3.42732136e+00+0.00000000e+00j,  4.81582993e+00-4.10374772e-16j,
    5.86456023e+00+3.88824673e-16j,  4.07942919e+00-1.48609552e-15j,
    5.25077594e+00+6.70968395e-16j,  6.45823471e+00-1.22977116e-15j,
...
sc.ifft(sc.fft(y))

array([ 3.42732136-8.59756710e-16j,  5.34401724+4.97379915e-17j,
    5.46939384-9.87654403e-16j,  3.31504852-4.17443857e-16j,
    6.52888175+6.39488462e-16j,  6.90804001-3.10862447e-16j,
...

but if I compare array returned from Scipy.ifft with the one returned from my own function IFT, I get completely different array. Am I missing something?

$\endgroup$
4
  • $\begingroup$ Are you confusing n and N? $\endgroup$
    – MBaz
    May 28, 2019 at 19:26
  • $\begingroup$ You are right, but still there is something wrong $\endgroup$
    – Rokas.ma
    May 28, 2019 at 19:29
  • $\begingroup$ I tested your function's body code and it works fine ? (checked with Matlab's ifft)... May be you are mis-using scipy.ifft ? $\endgroup$
    – Fat32
    May 28, 2019 at 23:52
  • $\begingroup$ Really? I added my comparison with Scipy, results are slightly different $\endgroup$
    – Rokas.ma
    May 31, 2019 at 6:37

2 Answers 2

1
$\begingroup$

First of all, I think it'd be good to include your result vs the result given by the mentioned library.

Here is the code of scipy's ifft. In the docs it states that the function returns a

complex array contains y(0), y(1),..., y(n-1) where

y(j) = (x * exp(2*pi*sqrt(-1)*j*np.arange(n)/n)).mean().

I suspect that you're trying to write the imaginary unit as $j$, and I'm not sure that works fine... try replacing it with sqrt(-1).

PS: Just noticed, but you want to compute idft on an array of signals? Or an array which represents a signal?

$\endgroup$
1
  • $\begingroup$ I added the results $\endgroup$
    – Rokas.ma
    May 29, 2019 at 6:48
1
$\begingroup$

Removing the 2nd term -> array = np.asarray(array, dtype=float) should work

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.