Evaluate a function via fast fourier transform using Matlab

Click For Summary

Discussion Overview

The discussion revolves around evaluating a function using the Fast Fourier Transform (FFT) in Matlab, specifically comparing computed values at grid points with exact values. The function in question is a combination of cosine and sine terms evaluated over the interval [-pi, pi] with a specified number of grid points.

Discussion Character

  • Technical explanation
  • Mathematical reasoning
  • Debate/contested

Main Points Raised

  • Rayne describes an attempt to compute the Fourier coefficients and reconstruct the function using FFT, but notes discrepancies between computed and exact values.
  • One participant suggests avoiding the use of 'j' as a variable in Matlab due to its designation as the imaginary unit, hinting at potential issues with variable naming.
  • This participant questions the logic behind using 'x' in the exponential term of the reconstruction formula and recommends adhering to the conventional definition of the Inverse FFT (IFFT).
  • A later reply provides an alternative code snippet for computing the function values, indicating a different approach to the summation and normalization process.
  • Rayne acknowledges that the program works after applying the suggested changes but does not confirm the correctness of the approach regarding the use of 'x' in the IFFT.
  • Another participant reiterates that it is incorrect to directly plug 'x' into the IFFT as presented.

Areas of Agreement / Disagreement

Participants express differing views on the correctness of the approach to using 'x' in the IFFT and the implications of variable naming in Matlab. There is no consensus on the final correctness of the method employed by Rayne.

Contextual Notes

There are unresolved questions regarding the proper application of the IFFT and the implications of variable naming conventions in Matlab, which may affect the results.

wu_weidong
Messages
27
Reaction score
0
Hi all,
I'm new to Matlab, and I'm trying to evaluate a function via fast Fourier transform using Matlab, then compare the values at each gridpoint with the exact value.

The function is
y1 = cos(x)-20*sin(5*x)+6*sin(12*x)
on the interval [-pi, pi], using n = 9 gridpoints.

I first tried to find the Fourier coefficients F1:
n = 9;
x = -pi:(2*pi/(n-1)):pi;
y1 = cos(x)-20*sin(5*x)+6*sin(12*x);
F1 = fft(y1);

I checked the values of my coefficients with the formula given by my teacher:
F1_k = SUM[y1(x_j)*exp(pi*i*j*k/m)]
where m = n/2, k = 0, 1, ..., 2m-1, and SUM is from j = 0 to j = 2m-1.
The coefficients matched.

Then I tried to compute the function F(x) at each grid point x_j using the formula
F(x) = (1/m)*SUM(F1_k*exp(i*k*x))
where SUM is from k = 0 to 2m-1
(This is the formula given by my teacher.)

for j=1:1:n
sum=0;
for k=1:1:n
sum=sum+(F1(k)*(exp(i*(k-1)*x(j))));
end
F(j)=sum/(n/2);
end

However, the values for F(x) that I got were

-0.2222 -14.8231i
-15.3243 +36.4597i
22.2864 -22.5086i
-4.6765 + 1.8450i
-2.0000 + 0.0000i
-30.6032 -12.5842i
26.5710 +26.7933i
-7.6067 -17.8277i
-0.2222 -14.8231i

instead of the actual values

-1
-14.849242
20
-13.435029
1
14.849242
-20
13.435029
-1

What is wrong with my program?

Thank you.

Regards,
Rayne
 
Physics news on Phys.org
For starters, you should avoid using j as a variable, since in Matlab, both i and j denote the imaginary unit.

I venture to guess that your exercise is to verify that the FFT operation is reversible where in the later part of your work, you had used the IFFT to recover the original signal. I do not see, however, the logic behind the given function...

wu_weidong said:
Then I tried to compute the function F(x) at each grid point x_j using the formula
F(x) = (1/m)*SUM(F1_k*exp(i*k*x))
where SUM is from k = 0 to 2m-1
(This is the formula given by my teacher.)

In particular, why the x in the exponential? I would advise you, instead, to stick to the conventional definition of the IFFT, e.g., http://mathworld.wolfram.com/DiscreteFourierTransform.html" .

The following code should do the trick:
Code:
for j=1:1:n
sum=0;
for k=1:1:n
sum=sum+(F1(k)*(exp(i*(k-1)*(j-1)*2*pi/n)));
end
F(j)=sum/n;
end
 
Last edited by a moderator:
The goal of my program was simply to compute the value of the function y1 using FFT at each grid point x, where x = -pi:(2*pi/(n-1)):pi. For example, if n = 9, I would then get 9 values of F(x) for 9 grid points.

Thanks a lot for your help, the program works now!
 
Well yes, but it is still incorrect to plug the x into the IFFT as is.
 

Similar threads

  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 6 ·
Replies
6
Views
5K
  • · Replies 2 ·
Replies
2
Views
3K
  • · Replies 9 ·
Replies
9
Views
4K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 5 ·
Replies
5
Views
2K
  • · Replies 1 ·
Replies
1
Views
2K
Replies
3
Views
3K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 3 ·
Replies
3
Views
10K