Fourier serilsi ile fourier dönüşümü arasındaki fark

Başlatan strom, 23 Mart 2014, 21:32:55

strom

Herkese iyi günler.

FFT analizinin ne olduğu hakkında araştırma yaparken ayrık fourier dönüşümüne ordanda sürekli zaman fourier dönüşümlerine ordanda fourier serilerine geldim. Aklıma takılan bir soruya gün boyu araştırmama rağmen bir cevap bulamadım (bunda zayıf ingilizceminde katkısı büyük oldu). Cevaplayabilecek birisi olursa inanın çok mabule geçer (tabi önce benim sorunumu açık bir şekilde anlatabilmem lazım)

Şimdi fourier serilerinin kullanımı oldukça mantıklı geldi. Malum fourier; herhangi bir periyodik fonksiyonun sinus ve cosinus fonksiyonlarının toplamıyla oluşturulabileceğini söylemiş. Gerekli hesaplamaları yaptığımızda;
a0*sin(n*w0*t) + a1*sin(n*w1*t) + a2*sin(n*w2*t) + ......... şeklinde bir denklem elde ediyoruz.
Burda bulduğumuz 'an' katsayılarını 'w' eksenine göre çizebiliyoruz. Buna da spectrum analiz deniyor sanırım. Bize specturm grafiği verilmiş bir dalgayı rahatlıkla zaman domeninde oluşturabiliriz. Bu kısım gayet anlaşılır geliyor. Burdaki en önemli nokta spectrum'un süreksiz olması.

Gelelim fourier dönüşümüne. Malum fourier serileri aperiyodik dalgalara uygulanamıyor. Bunuda bazı zeki matematikçilerimiz şu şekilde çözmüşler; elimizdeki aperiyodik dalgayı periyodik bir dalga olarak düşünürüz. Daha sonra periyodu sonsuza doğru götürdüğümüzde bize aperiyodik dalgayı geri verir.
Tam bu noktada bazı garip, anlayamadığım matematiksel işlemler yapıp yeni bir sentez ve analiz denklemleri çıkarmışlar. Denklemlerin nasıl geldiğini şimdilik geçiyorum. Çünkü burda önemli olan dönüşümü yaptığımızda bize frekansa bağlı sürekli bir fonksiyon vermesi. İşte tam bu noktada kafam çok karıştı.
Anlatmaya çalıştığımı bir örnek üzerinden göstereyim.


Yukardaki resimde bir kare dalganın fourier açılımı gösteriliyor.

Bu resimdede spektrum grafiği görülüyor.
Bize direk spektrum grafiği verilse hemen f(x) fonksiyonunu oluşturabiliriz. Çünkü grafikte sinus dalgalarının frekansları, genlikleriyle beraber veriliyor. Bunları toplamak yeterli.
Ama gel gelelim aperiyodik bir kare dalganın spectrumu sürekli bir fonksiyon. Ben o grafikten herhangi bir anlam çıkaramıyorum malesef. Mesela

Mesela bu şekil neyi ifade ediyor??
Benim anladığım şuna benzer bişe; aperiyodik kare dalgayı, her frekanstaki sinusiodal dalgaların toplamıyla oluşturuyoruz (her frekans derken, temel frekanstan büyük her frekansı kastetmiştim). Bu durumda spectrum grafiğini oluşturan F(w) veya F(f) fonksyonu ise bize girdiğimiz bir frekans değerindeki sinusoidal dalganın genliğini veriyor.
Mesela T = 1sn olan bir kare dalga düşünelim. (0<t<T aralığında 1 birim genliğe sahip. Geri kalan yerlerde 0). Bu durumda temel frekansımız f0 = 1hz oluyor. Bu dalgada 1hz frekansından büyük sonsuz tane sinus dalgasından oluşuyor. Biz F(3hz) yazdığımızda, 3hz frekansına sahip sinusoidal dalganın genliğini elde ediyoruz. F(500.85hz) yazsaydıkta bize bir genlik verecekti. Çünkü her frekansta bir genliğe sahip sinusoidal dalga var.
Buna benzer bir sonuç çıkardım. Acaba doğru düşünüyor muyum?

Anlatamadıysam kusura bakmayın. Kafam epey karışık. İnsanın neyi anlamadığını anlatmasıda biraz zor oluyor :)

barisertekin

#1
Açılım sinüslerle gösterme. Dönüşüm ise sinyali başka bir domainde gösterme.

Fourier Dönüşümünü anlamanın en iyi yolu herhangi bir programlama dili ile yazılmış algoritmasını incelemek.

Şu şekilde çalışıyor.

Ana sinyalimizin en başında başlayarak içerisinde 1hz'lik sinyalleri arıyor. Bulursa F[1] indisine ekliyor.
Sonra başa dönüyor 2hz'lik sinyalleri arıyor. Bulursa F[2] indisine ekliyor.

İşin güzel yanı bunu istediğin aralıkta yapabilirsin. Mesela k = [10 20 30 40 50] diye hz'leri belirten bir vektörümüz olsun. Hepsine ihtiyacımız yoksa ana sinyal içinde sadece onları arayabiliriz.

Şu konuya bir göz at. Ben açmıştım kodda sorun varmış. Sonradan düzelttim.
https://www.picproje.org/index.php/topic,52093.0.html

Bu konu da şuan cevap bekliyor :)
https://www.picproje.org/index.php/topic,52241.msg395146/topicseen.html#msg395146

Kare dalganın açılımını yazmışsın. 1 , 3 , 5 diye gidiyor neden? Cevap aşağıdaki videoda.

http://www.youtube.com/watch?v=x04dnqg-iPw#ws

strom

Hocam öncelikle çok teşekkür ederim. Az çok ilerleme kaydettim.
Öncelikle sizin sorununuza gelirsek; ztn formülde öyle değil mi? 2/T formülden geliyor. Formülün nasıl geldiğinide elektronik kitapları anlatıyordu.

Bende dediğiniz gibi bir DFT algoritması yazdım. Matlab'ta ki FFT fonksiyonu ile aynı değerleri alıyorum. Ancak bu değerlerden bir sonuç çıkaramıyorum. Hala ne bulduğumu anlamadım. Mesela;
double xk[8] = {0.0510,    0.1503,    0.0780,    0.8568,    0.3473,    0.4302,    0.1774,    0.5908};
Dizimiz bu olsun.
   fftSlow(xk);
fonksiyonunu çağırdığımda;
#define FFT_SAMPLE   8
struct FFT_DATA
{
   double Re[FFT_SAMPLE];
   double Im[FFT_SAMPLE];
}fftData;
şeklinde tanımladığım değişkenlerin içeriği, aynı dizinin matlabta ki FFT fonksiyonun içeriği olan;

>> fft(xk)

ans =

  Columns 1 through 2

   2.6817            -0.6823 + 0.1093i

  Columns 3 through 4

   0.1429 + 0.8671i   0.0896 - 0.0895i

  Columns 5 through 6

  -1.3745             0.0896 + 0.0895i

  Columns 7 through 8

   0.1429 - 0.8671i  -0.6823 - 0.1093i

Değerleriyle doluyor. Buraya kadar herşey güzel.

Şimdi ben fftSlow fonksiyonunu STM32F429 içinde tanımladım. Arm'ın analog girişinede;

void generateSinusWave()
{
   for(int i=0; i<360; i++)
   {
      SinusWave = (sin( (2*M_PI / 360) * i) + 1 + sin((2*M_PI / 180) * i)) * (4096 / 3.3);
   }
}

fonksiyonu ile oluşturulmuş kare dalgayı, STM32F407'in DAC'ı ile yaklaşık 10Hz'lik bir dalga oluşacak şekilde gönderiyorum.

Yaptığım işlemde şu;
STM32F429'un ADC girişinden 10sample alıp, bunun ortalamasını xk'nın bir elemanına yazıyorum. Bu şekilde 64 örnek alıyorum.
Yani xk[64] uzunluğunda bir dizim oluyor ve bu dizinin içeriği girişteki sinusoidal dalganın değerleri oluyor. Daha sonra bu diziyi, N = 64 olacak şekilde dft fonksiyonuna gönderiyorum.

Benim hayal ettiğim dizinin içerisinde 2 tane peak değer bulunması. (2 sinus'un toplamından oluştuğu için) Ancak durum böyle olmuyor malesef. Bu xk dizisinin içerisindeki değerlerin ne işe yaradığını, bunlardan girişteki sinyalin frekans değerlerini nasıl çıkaracağımı anlamadım.

Aslında yapmak istediğim şu;
Basit bir osiloskop yaptım. Buna uygulanan bir sinyalin DFT'sini alarak sahip olduğu en düşük periyotlu sinusoidal sinyalin frekansını bularak -time- eksenini ona göre scale edecem. Bir nevi autoset yapacam.

mesaj birleştirme:: 25 Mart 2014, 00:31:41







Yukardaki resimlerde girişe uygulanan sinyal ve sonucunda gördüğüm spectrum grafiği (N = 128)

Ben şimdi bu spectrum grafiğinden nasıl sinyalin sinusoidal bileşenlerini bulacam?

barisertekin

Örnek sayısı kadar cosx + isinx değerinin toplamını çizdirdiğimizde spektrumu veriyor. Bu spektrum sürekli.

Mesela x=sin(2*pi*5*t) + 2*sin(2*pi*50*t) + sin(2*pi*5*t);
5 hz ve 50 hz eşit çıkması gerekiyor.

clc;
clear;
%Bu kısım FFT için
fs = 1024;
ara=0;
t=0:1/fs:1023*(1/fs);%ZAMANSAL GÖSTERİMİ X EKSENİ İÇİN
X=zeros(1,size(t,2));
x=sin(2*pi*5*t) + 2*sin(2*pi*50*t) + sin(2*pi*5*t);

subplot(3,1,1);
plot(t,x);xlabel('Time Domain');

F = (0:1024/2-1)*fs/1024;%FREKANS GÖSTERİMİ X EKSENİ İÇİN
u=abs(fft(x,1024));
subplot(3,1,2);
plot(F,u(1:512));xlabel('FFT grafiği');

%Bu kısımdan sonrası DFT için 
for k=1:size(t,2)
    for n=1:size(t,2)
           ara=ara+x(n)*exp((-j*2*pi*(k-1)*(n-1))/1024);
    end
    X(k)=ara;
    ara=0;
end

F = (0:1024/2-1)*fs/1024;
subplot(3,1,3);
plot(F,abs(X(1:512)));xlabel('DFT grafiği');


Bu bulduğumuz "X" frekans değerlerine bakarak kaç tane kaç hz'lik sinyalin toplamından oluştuğunu nasıl anlarız sorusu önemli :)
Tamam spektrumda görüyoruz da fourier serisine açmış gibi nasıl görürüz bende tam çıkartamadım.

1024 örnek aldık diyelim. 1024 / periyot yapsak. Bir periyot başına kaç örnek yani kaç tane cosx + isinx değeri olduğunu anlarız. Atıyorum 10 tane. X frekans değerlerinden ilk 10 tanesi 1hz'lik bölümün cosx + isinx formundaki toplamı diyemez miyiz? Komplex exponansiyel ile çalışmak kafa karıştırabiliyor.

Bende çok bilmiyorum. Beraber öğrenmeye çalışıyoruz.