01 Aralık 2021, 17:41:50

Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME


DFT yaparken Matlab FFT ile uyuşmuyor ?

Başlatan AsHeS, 24 Aralık 2012, 00: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);
= (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
= (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);
= (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);
= (0:1024/2-1)*fs/1024;
subplot(2,1,2);
plot(F,abs(X(1:512)));xlabel('DFT grafiği');

AsHeS

24 Aralık 2012, 03:59:52 #3 Son düzenlenme: 24 Aralık 2012, 04:09:54 AsHeS35
Alıntı yapılan: pisayisi - 24 Aralık 2012, 02: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, 04:02:40

Alıntı yapılan: berat23 - 24 Aralık 2012, 03: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);
= (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);
= (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 :)

Yasal Uyarı: Picproje.org sitemizde 5651 sayılı kanunun 8. maddesine ve T.C.Knın 125. maddesine göre tüm üyelerimiz yaptıkları paylaşımlardan kendileri sorumludur. Picproje.org hakkında yapılacak tüm hukuksal şikayetleri İletişim sayfamızdan bize bildirdikten en geç 3 (üç) iş günü içerisinde ilgili kanunlar ve yönetmelikler çerçevesinde tarafımızca incelenerek gereken işlemler yapılacak ve site yöneticilerimiz tarafından bilgi verilecektir.