How to execute fft and ifft

90 Ansichten (letzte 30 Tage)
Maxilyn Tan
Maxilyn Tan am 11 Aug. 2015
Kommentiert: yusra Ch am 12 Mär. 2020
I tried to execute this code but for some reason the graph of the ifft is not a perfect sine wave. Can someone please instruct me as to what I did wrong? I got the fft code from the internet and I want to get the ifft
Main Code
fo = 4; %frequency of the sinewave
Fs = 100; %sampling rate
Ts = 1/Fs; %sampling time interval
t = 0:Ts:1-Ts;
n = length(t); %number of samples
y = sin(2*pi*fo*t);
figure(1)
plot(t,y)
grid on
[YfreqD,freqRng] = positiveFFT(y,Fs);
figure(2)
stem(freqRng,abs(YfreqD));
B = ifft(YfreqD)*length(y);
t1 = (0:(1-Ts)/(length(B)-1):1-Ts);
figure(3)
plot(t1,B)
grid on
Positive fft code
function[X,freq] = positiveFFT(x,Fs)
N = length(x);
k = 0:N-1;
T = N/Fs;
freq = k/T; %create the frequency range
X = fft(x)/N; %normalize the data
cutOff = ceil(N/2);
X = X(1:cutOff);
freq = freq(1:cutOff);

Akzeptierte Antwort

David Sanchez
David Sanchez am 11 Aug. 2015
Hi thereb, the sine wave is right there, but the problem is that after FFTing the your y data, YfreqD contains half the samples than the original. When calculating the iFFT, that length is kept and plot(t1,B) plots half the original data.
You can try plot like this to see the points you are plotting in each case:
figure(1)
plot(t,y,t,y,'r*')
figure(3)
plot(t1,B,t1,B,'r*')
You can add a higher sampling rate at the beginning of your code and your figure(3) will appear like a less "straight" sine wave.
fo = 4; %frequency of the sinewave
Fs = 200; %sampling rate
Ts = 1/Fs; %sampling time interval
t = 0:Ts:1-Ts;
n = length(t); %number of samples
y = sin(2*pi*fo*t);
figure(1)
plot(t,y,t,y,'r*')
grid on
[YfreqD,freqRng] = positiveFFT(y,Fs);
figure(2)
stem(freqRng,abs(YfreqD));
B = ifft(YfreqD)*length(y);
t1 = (0:(1-Ts)/(length(B)-1):1-Ts);
figure(3)
plot(t1,B,t1,B,'r*')
grid on
  2 Kommentare
Maxilyn Tan
Maxilyn Tan am 19 Aug. 2015
I see what you mean, thank you very much!
yusra Ch
yusra Ch am 12 Mär. 2020
Could you please help me with this
My idea is to generate two diffrent sinus signal with diffrent frequencies f1 and f2. One generated I want to do the sum of them (let's call it total) . Next, I want t filter the total signal and recuperate the signal that has frequency equal to f1.
I have created wave1 with f1=30Hz and wave2 with f2=60Hz. I did their sum "total".
The next step is to recuperate wave1 from the "total". I did the FFT of the total. I got two peaks one in 30Hz and the other in 60Hz. Next, I have filtered out (Low pass filter) the wave2. Now that I got the peak corresponding to wave1 (30Hz). My question is how to do the ifft in a right way to get the wave1 back. My code gives my a signal diffrent to wave1 (see the pictures) I dont know where is the problem
>>t=0:1/1000:0.1;
>> f1=30;
>> T1=1/f1;
>> f2=60;
>> T2=1/f2;
>> wave1=sin(2*pi*t/T1);
>> wave2=sin(2*pi*t/T2);
>> total=wave1+wave2;
>> xdft3=fft(total);
>> frq3=0:1000/length(total):1000/2;
>> xdftPos3=xdft3(1:length(total)/2+1);
>> xdftNorm3=xdftPos3/max(xdftPos3);
>> figure
>> plot(frq3,abs(xdftNorm3))
>> XX=(find(frq3>31)); % Low pass filter to recuperate the wave1
>> xdft4=xdft3;
>> xdft4(XX)=0;
>> invers3=ifft(xdft4);
>> figure
>> plot(t,invrs3)

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Shaohui Yong
Shaohui Yong am 24 Jul. 2017
This is really helpful, thanks!
  1 Kommentar
Venkat Ta
Venkat Ta am 31 Okt. 2017
Thanks. The code is fine, is there any possible chance to get no complex values of B sine wave same like as input y ?
suppose if I plot like as plot(t,y,'b',t1,real(B),'r--') with Fs=200; there is so much differences between input Y and ifft B.
Is it good choice to take real(B)?

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Fourier Analysis and Filtering finden Sie in Help Center und File Exchange

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by