Need FFT Code for Matlab (not built in)

Does anyone have FFT code for Matlab? I don't want to use the built-in Matlab function.

댓글 수: 5

Walter Roberson
Walter Roberson 2013년 3월 15일
You want the analytic form ?
John
John 2013년 3월 15일
I want the radix 2 decimation in time code in Matlab to compare.
Walter Roberson
Walter Roberson 2013년 3월 15일
radix 2 decimination is a DFT technique.
John
John 2013년 3월 15일
Okay I am looking for the O(n log n) algorithm for DFT then =)
Yasin Arafat Shuva
Yasin Arafat Shuva 2021년 7월 19일
편집: Rik 2021년 7월 19일
clear variables
close all
%%Implementing the DFT in matrix notation
xn = [0 2 4 6 8]; % sequence of x(n)
N = length(xn); % The fundamental period of the DFT
n = 0:1:N-1; % row vector for n
k = 0:1:N-1; % row vecor for k
WN = exp(-1i*2*pi/N); % Wn factor
nk = n'*k; % creates a N by N matrix of nk values
WNnk = WN .^ nk; % DFT matrix
Xk = xn * WNnk; % row vector for DFT coefficients
disp('The DFT of x(n) is Xk = ');
disp(Xk)
magXk = abs(Xk); % The magnitude of the DFT
%%Implementing the inverse DFT (IDFT) in matrix notation
n = 0:1:N-1;
k = 0:1:N-1;
WN = exp(-1i*2*pi/N);
nk = n'*k;
WNnk = WN .^ (-nk); % IDFS matrix
x_hat = (Xk * WNnk)/N; % row vector for IDFS values
disp('and the IDFT of x(n) is x_hat(n) = ');
disp(real(x_hat))
% The input sequence, x(n)
subplot(3,1,1);
stem(k,xn,'linewidth',2);
xlabel('n');
ylabel('x(n)')
title('plot of the sequence x(n)')
grid
% The DFT
subplot(3,1,2);
stem(k,magXk,'linewidth',2,'color','r');
xlabel('k');
ylabel('Xk(k)')
title('DFT, Xk')
grid
% The IDFT
subplot(3,1,3);
stem(k,real(x_hat),'linewidth',2,'color','m');
xlabel('n');
ylabel('x(n)')
title('Plot of the inverse DFT, x_{hat}(n) = x(n)')
grid

댓글을 달려면 로그인하십시오.

답변 (4개)

Youssef  Khmou
Youssef Khmou 2013년 3월 15일

1 개 추천

hi John
Yes there are many versions of Discrete Fourier Transform :
% function z=Fast_Fourier_Transform(x,nfft)
%
% N=length(x);
% z=zeros(1,nfft);
% Sum=0;
% for k=1:nfft
% for jj=1:N
% Sum=Sum+x(jj)*exp(-2*pi*j*(jj-1)*(k-1)/nfft);
% end
% z(k)=Sum;
% Sum=0;% Reset
% end
% return
this is a part of the code , try my submission it contains more details :

댓글 수: 4

John
John 2013년 3월 15일
That's the DFT, not the FFT
Youssef  Khmou
Youssef Khmou 2013년 3월 15일
편집: Youssef Khmou 2013년 3월 15일
FFT is finite Fourier transform, its fast when the length of vector on which is evaluated is ~ to 2^N where N is an integer .
what about this :
% function z=Fast_Fourier_Transform(x)
%
% N=length(x);
% nfft=2^ceil(log2(N));
% z=zeros(1,nfft);
% Sum=0;
% for k=1:nfft
% for jj=1:N
% Sum=Sum+x(jj)*exp(-2*pi*j*(jj-1)*(k-1)/nfft);
% end
% z(k)=Sum;
% Sum=0;% Reset
% end
% return
but keep in mind that its not fast at all for vectors> 1000 points, built-in fft is very fast.
Abdullah Khan
Abdullah Khan 2013년 11월 28일
편집: Abdullah Khan 2013년 11월 28일
This is also DFT
The complexity of the code is still N x N
because
% nfft=2^ceil(log2(N)) = nfft (on upper DTFT code )
or
% 2^ceil(log2(N))= N
Walter Roberson
Walter Roberson 2017년 9월 6일
"FFT" stands for "Fast Fourier Transform", which is a particular algorithm to make Discrete Fourier Transform (DFT) more efficient.

댓글을 달려면 로그인하십시오.

Tobias
Tobias 2014년 2월 11일
편집: Walter Roberson 2017년 9월 6일

1 개 추천

For anyone searching an educating matlab implementation, here is what I scribbled together just now:
function X = myFFT(x)
%only works if N = 2^k
N = numel(x);
xp = x(1:2:end);
xpp = x(2:2:end);
if N>=8
Xp = myFFT(xp);
Xpp = myFFT(xpp);
X = zeros(N,1);
Wn = exp(-1i*2*pi*((0:N/2-1)')/N);
tmp = Wn .* Xpp;
X = [(Xp + tmp);(Xp -tmp)];
else
switch N
case 2
X = [1 1;1 -1]*x;
case 4
X = [1 0 1 0; 0 1 0 -1i; 1 0 -1 0;0 1 0 1i]*[1 0 1 0;1 0 -1 0;0 1 0 1;0 1 0 -1]*x;
otherwise
error('N not correct.');
end
end
end

댓글 수: 4

Alireza Salehi
Alireza Salehi 2018년 8월 6일
hello, Thanks for this code could you please explain how can i use this function? and explain this more for understanding? thanx a lot
Apostolescu Stefan
Apostolescu Stefan 2020년 1월 17일
Hello, I'm trying to understand what you have done there. Why is X equal to (Xp-tmp)? For Xp+tmp I understood, it's basically DFT, but why Xp-tmp?
Siddhant Sharma
Siddhant Sharma 2020년 11월 2일
can anyone explain X equal to (Xp-tmp)?
The total length of the final X will be N.
The first values will be given by + (remember that , and have length elements and both , are periodic of ); it can be written as for , where .
While the last values will be given by for .
Since we can get the second part of X(last values) as:
that is the reason for adding tmp in the first vector part and subtracting it in the second part.

댓글을 달려면 로그인하십시오.

Jan Afridi
Jan Afridi 2017년 9월 6일
편집: Jan Afridi 2017년 11월 6일

0 개 추천

I think I can answer your question. Check the given link may be it will help you. And if you found any error then please inform me... check the link Matlab code for Radix 2 fft

댓글 수: 1

Jan Suchánek
Jan Suchánek 2018년 12월 6일
Hello i would like to ask you what had to be different if you would like to use it for harmonical function.
I tried to implement your solution but it was working only for random vectors but not for any type of harmonical.
i was using this for the harmonical function.
______________________
t2=0:1:255;
h1=sin(t2);
x=h1;
X11 = myFFT(x);
______________________
it gave me this error:
Error using *
Inner matrix dimensions must agree.
Error in myFFT (line 18)
X = [1 0 1 0; 0 1 0 -1i; 1 0 -1 0;0 1 0 1i]*[1 0 1 0;1
0 -1 0;0 1 0 1;0 1 0 -1]*x;
Error in myFFT (line 7)
Xp = myFFT(xp);
Error in myFFT (line 7)
Xp = myFFT(xp);
Error in myFFT (line 7)
Xp = myFFT(xp);
Error in myFFT (line 7)
Xp = myFFT(xp);
Error in myFFT (line 7)
Xp = myFFT(xp);
Error in myFFT (line 7)
Xp = myFFT(xp);
Error in ZBS_projekt (line 246)
X11 = myFFT(x);

댓글을 달려면 로그인하십시오.

Ryan Black
Ryan Black 2019년 3월 11일
편집: Ryan Black 2020년 8월 26일

0 개 추천

Function I wrote that optimizes the DFT or iDFT for BOTH prime and composite signals...
The forward transform is triggered by -1 and takes the time-signal as a row vector:
[Y] = fftmodule(y,-1)
The inverse transform auto-normalizes by N, is triggered by 1 and takes the frequency-signal as a row vector:
[y] = fftmodule(Y,1)
Methodology:
The algorithm decimates to N's prime factorization following the branches and nodes of a factor tree. In formal literature this may be referred to as Mixed Radix FFT, but its really just recursive decimation of additive groups and this method is easily derivable via circular convolutions :)
At the prime tree level, algorithm either performs a naive DFT or if needed performs a single Rader's Algorithm Decomposition to (M-1), zero-pads to power-of-2, then proceeds to Rader's Convolution routine (not easy to derive). Finally it upsamples through the origianlly strucutured nodes and branches incorporating twiddle factors for the solution.

태그

질문:

2013년 3월 15일

댓글:

2024년 4월 28일

Community Treasure Hunt

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

Start Hunting!

Translated by