Picproje Elektronik Sitesi

SERBEST BÖLGE => Bilim Teknik => Matlab => Konuyu başlatan: AsHeS - 23 Aralık 2012, 21:37:53

Başlık: DFT yaparken Matlab FFT ile uyuşmuyor ?
Gönderen: AsHeS - 23 Aralık 2012, 21:37:53
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');
Başlık: Ynt: DFT yaparken Matlab FFT ile uyuşmuyor ?
Gönderen: 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
Başlık: Ynt: DFT yaparken Matlab FFT ile uyuşmuyor ?
Gönderen: 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');
Başlık: Ynt: DFT yaparken Matlab FFT ile uyuşmuyor ?
Gönderen: AsHeS - 24 Aralık 2012, 00:59:52
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 :)