How to execute fft and ifft

64 次查看(过去 30 天)
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);

采纳的回答

David Sanchez
David Sanchez 2015-8-11
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 个评论
Maxilyn Tan
Maxilyn Tan 2015-8-19
I see what you mean, thank you very much!
yusra Ch
yusra Ch 2020-3-12
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)

请先登录,再进行评论。

更多回答(1 个)

Shaohui Yong
Shaohui Yong 2017-7-24
This is really helpful, thanks!
  1 个评论
Venkat Ta
Venkat Ta 2017-10-31
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)?

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Fourier Analysis and Filtering 的更多信息

标签

Community Treasure Hunt

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

Start Hunting!

Translated by