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');
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
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');
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 :)