Question about Fourier transformation in Matlab

Click For Summary

Discussion Overview

The discussion revolves around the implementation of a band-pass filter using the Fourier transform in Matlab, specifically targeting a periodic phenomenon related to El Niño with a periodicity between 3 and 7 years. Participants are exploring the correct selection of Fourier coefficients to achieve the desired filtering effect.

Discussion Character

  • Technical explanation
  • Debate/contested
  • Mathematical reasoning

Main Points Raised

  • One participant describes their approach to zero out Fourier coefficients outside the range corresponding to 3 to 7 years, but expresses dissatisfaction with the resulting plot.
  • Another participant suggests that the original selection of coefficients (36 to 84) is incorrect and provides a method to determine the correct range of coefficients based on angular frequencies.
  • A later reply reiterates the need to consider the full spectrum and not just the first half when applying the filter.
  • One participant questions whether the coefficients being removed are indeed the ones corresponding to the periodicity of interest, implying that this could lead to unexpected results.
  • Another participant recommends applying time series analysis techniques, such as Box-Jenkins, to better understand the autocorrelations present in the data.

Areas of Agreement / Disagreement

Participants express differing views on the correct selection of Fourier coefficients and the implications of removing certain coefficients. There is no consensus on the best approach to achieve the desired filtering effect, and the discussion remains unresolved.

Contextual Notes

Participants highlight potential issues with the selection of coefficients and the need for symmetry in the Fourier transform, but do not resolve the mathematical steps or assumptions involved in the filtering process.

Frank Einstein
Messages
166
Reaction score
1
Hello everybody.

I am triying to calculate a band-pass filter using the Fourier transform.
I have a vector with 660 compomponents; one for each month. I am looking for a phenomenon which has a periodicity between 3 and 7 years (it's el niño, on the souhtern pacific ocean). I want to make zero all the coefficients of the Fourier transform except the ones which are in between 3 and 7 years. I have tried to remove all of the coefficients which are between the 36th (12*3) and 84th (12*7). Then, I proceed to do the same thing in the other half of the series to mantain simmetry.

But once I make the inverse Fourier transform and I plot it, the results don't match whith what I want.

Can someone tell me where is my faliure?Code used:
niniofourier=fft(ninios);

for i=1:35
niniofourierb(i)=0;
end

for i=85:330
niniofourierb(i)=0;
end

for i=36:84
niniofourierb(i)=niniofourier(i);
end

for i=331:576
niniofourierb(i)=0;
end

for i=577:624
niniofourierb(i)=niniofourier(i);
end

for i=625:660
niniofourierb(i)=0;
end

niniosi=ifft(niniofourierb);
figure(4)
plot (niniosi)
 
Physics news on Phys.org
You're selecting the wrong part of the DFT. You don't want coefficients 36 through 84.

You have 660 months worth of samples, so ##X_k## (for ##k=0, 1, \dots, 330##) corresponds to a cycle that has an angular frequency of ##k\omega_0## where ##\omega_0=2\pi/660\text{ rad/month}##. What you want to do is determine the range of ##k## that corresponds to angular frequencies between ##2\pi/36\text{ rad/month}## and ##2\pi/84\text{ rad/month}##.
 
  • Like
Likes   Reactions: Frank Einstein
vela said:
You're selecting the wrong part of the DFT. You don't want coefficients 36 through 84.

You have 660 months worth of samples, so ##X_k## (for ##k=0, 1, \dots, 330##) corresponds to a cycle that has an angular frequency of ##k\omega_0## where ##\omega_0=2\pi/660\text{ rad/month}##. What you want to do is determine the range of ##k## that corresponds to angular frequencies between ##2\pi/36\text{ rad/month}## and ##2\pi/84\text{ rad/month}##.

Thank you very much; I am using now this code:
for i=1:660
if (i-1)/660<pi/18
if (i-1)/660> pi/42
niniofourierb(i)=niniofourier(i);
else
niniofourierb(i)=0;
end
else
niniofourierb(i)=0;
end
end
niniosi=ifft(niniofourierb);
figure(4)
plot (niniosi)
instead of the previously used.

But it seems like I still got it wrong. I am obtaining something which makes no sense
fourier.jpg


I have done the same filter using a low pass filter and I obtain reasonalbe results.
 
I have no idea what that plot is supposed to represent.

Don't forget that like before you also have to take care of the other half of the spectrum.
 
vela said:
I have no idea what that plot is supposed to represent.

Don't forget that like before you also have to take care of the other half of the spectrum.
I have plotted the inverse Fourier transform of the series in which all the coefficients except those between 2π/36 and 2π/84 are zero.
In the code that I have posted is figure(4)
EDIT:
auxTWO=fliplr(niniofourier(1:330));
for i=1:330
niniofourierb(i+330)=auxTWO(i);
end
niniosi=ifft(niniofourierb);
niniosib=niniosi(1:330);
If I add this code to make the mirroring of the first half, I still get an awful figure
 
Last edited:
It sounds like you are removing the coefficients of the very periodicity that you expect it to have. Shouldn't those be the ones you keep? If you remove the period, you should expect noise. Is that what you expected? Is that what you got?

PS. Before you go too far, I think you should apply some time series analysis like Box-Jenkins and see what autocorrelations are in the data.
 

Similar threads

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