DFT yaparken Matlab FFT ile uyuşmuyor ?

Başlatan AsHeS, 23 Aralık 2012, 21:37:53

AsHeS

Merhaba arkadaşlar Matlab'de DFT denemeleri yapıyorum fakat Matlab'in kendi DFT algoritması olan FFT ile sadece peak frekansları aynı geliyor.Bende mi bir hata var yoksa olması gereken mi bu sizlere danışmak istedim.
%Bu kısım FFT için
fs=1000;
ara=0;
t=0:1/fs:1023*(1/fs);
X=zeros(1,size(t,2));
xn=sin(2*pi*100*t);
F = (0:1024/2-1)*fs/1024;
u=abs(fft(xn,1024));
subplot(2,1,1);
plot(F,u(1:512));xlabel('FFT grafiği');
%Bu kısımdan sonrası DFT için 
for k=1:size(t,2)
    for i=1:size(t,2)
           ara=ara+xn(i)*exp((-j*2*pi*(k-1)*(i-1))/1024);
    end
    X(k)=ara;
end
F = (0:1024/2-1)*fs/1024;
subplot(2,1,2);
plot(F,abs(X(1:512)));xlabel('DFT grafiği');

pisayisi

X(k)=ara;

satırından sonra ara değişkeninin sıfırlanması gerekmiyoru mu, DFT yi aşağıdaki gibi dikkate alırsan daha sağlıklı olabilir. Bu arada frekans spektrumlarının örnekleme işlemi dışında aynı olması gerekir...

for k=0:ln-1
    for n=0:ln-1
        xk(k+1)=xk(k+1)+(xn(n+1)*exp((-i)*2*pi*k*n/ln));
    end
end
Murat

berat23

bu hataları düzeltilmiş ve hız açısından biraz değiştirilmiş hali. matris çarpımında yapsak muhtemelen matlab dahada hızlı yapacaktır.çıkıtıda işlemler için geçen zamanı görüp,kıyaslayabilirsin.

%Bu kısım FFT için
clear all;
clc
fs=1000;
temp=0;
t=0:1/fs:1023*(1/fs);
a=size(t,2);
X=zeros(1,a);
u=zeros(1,a);
xn=sin(2*pi*100*t);
F = (0:1024/2-1)*fs/1024;
disp('FFT için geçen zaman');
t1=tic;
u=abs(fft(xn));
toc(t1);
subplot(2,1,1);
plot(F,u(1:512));xlabel('FFT grafiği');
%Bu kısımdan sonrası DFT için 
disp('DFT için geçen zaman');
t2=tic;
X(1)=mean(xn);
for k=1:a-1
    wt=-i*2*pi*k/1024;
    for m=0:a-1
           temp=temp+xn(m+1)*exp(wt*m);
    end
    X(k+1)=temp;
    temp=0;
end
toc(t2);
F = (0:1024/2-1)*fs/1024;
subplot(2,1,2);
plot(F,abs(X(1:512)));xlabel('DFT grafiği');

AsHeS

#3
Alıntı yapılan: pisayisi - 23 Aralık 2012, 23:59:28
X(k)=ara;

satırından sonra ara değişkeninin sıfırlanması gerekmiyoru mu, DFT yi aşağıdaki gibi dikkate alırsan daha sağlıklı olabilir. Bu arada frekans spektrumlarının örnekleme işlemi dışında aynı olması gerekir...

for k=0:ln-1
    for n=0:ln-1
        xk(k+1)=xk(k+1)+(xn(n+1)*exp((-i)*2*pi*k*n/ln));
    end
end

Ne kastettiğinizi anlamadım ama hata dediğiniz yerde ara=0 yapınca halloldu.Frekans spektrumları zaten aynı.

mesaj birleştirme:: 24 Aralık 2012, 01:02:40

Alıntı yapılan: berat23 - 24 Aralık 2012, 00:54:29
bu hataları düzeltilmiş ve hız açısından biraz değiştirilmiş hali. matris çarpımında yapsak muhtemelen matlab dahada hızlı yapacaktır.çıkıtıda işlemler için geçen zamanı görüp,kıyaslayabilirsin.

%Bu kısım FFT için
clear all;
clc
fs=1000;
temp=0;
t=0:1/fs:1023*(1/fs);
a=size(t,2);
X=zeros(1,a);
u=zeros(1,a);
xn=sin(2*pi*100*t);
F = (0:1024/2-1)*fs/1024;
disp('FFT için geçen zaman');
t1=tic;
u=abs(fft(xn));
toc(t1);
subplot(2,1,1);
plot(F,u(1:512));xlabel('FFT grafiği');
%Bu kısımdan sonrası DFT için 
disp('DFT için geçen zaman');
t2=tic;
X(1)=mean(xn);
for k=1:a-1
    wt=-i*2*pi*k/1024;
    for m=0:a-1
           temp=temp+xn(m+1)*exp(wt*m);
    end
    X(k+1)=temp;
    temp=0;
end
toc(t2);
F = (0:1024/2-1)*fs/1024;
subplot(2,1,2);
plot(F,abs(X(1:512)));xlabel('DFT grafiği');

Bazı hesapları dediğiniz gibi 1 döngü üstte yaparsak hızlanır dediğiniz gibi.
Matlab zaten matrix laboratory adı üstünde  zaten :)