
Ayrık Fourier Dönüşümü Durum: TAMAMLANDI
Giriş
Zaman ekseninde bulunan sonlu sayıda noktanın frekans eksenindeki karşılığını veren programdır.
Kullanım Alanları
Görüntü işleme, büyük sayıları çarpma, sayısal süzgeçler, spektrometre yapımı vb. uygulama alanları vardır.



/**************************************************************** * Ayrık Fourier Dönüşümü: * * * * N-1 * * ___ -j(2*(PI)/N)*k*n * * X = \ x e * * k /__ n * * n=0 * * * * şeklinde tanımlanır. * * * ****************************************************************/ /*************************************************************** * * * Yazar : Cerem Cem ASLAN * * * * Başlama tarihi : Ne bileyim ben (oldu bayaa) * * Bitiş tarihi : 24 Mayıs 2007, saat: 18.57 * * * * AÇIKLAMA : * * * * Fourier/xZaman isimli dosyadan okuduğu noktaların * * ayrık fourier dönüşümlerini alarak listelere * * yerleştiren programdır. * * * * * * YAPILACAKLAR : * * * * * Dosya okuma/yazma yaparken şu anki dizini daha * * kesin bir yolla buldur. * * * * * Dosyadan okuma yapılacağı zaman ilgili dosyanın * * yerini program parametresi olarak girdir. * * * * * * * * * ****************************************************************/ #include <iostream> // Standart giriş çıkış için #include <iomanip> // Çıkan rakamları biçimlendirmek için #include <math.h> // Matematik işlemleri için #include <fstream> // Dosyadan okumak ve dosyaya yazmak için #include <vector> // Noktaların tutulacağı vektör diziler için // İsim uzayları using namespace std; // Tanımlamalar #define EKRANA_YAZDIR ; // Ekrana çıktı al #define DOSYAYA_YAZDIR ; // Tanımlandıysa Fourier dönüşümü alınmış noktaları dosyaya yazdır #define NOKTALARI_DOSYADAN_OKUT ; // Tanımlanmazsa klavyeden giriş yaptır #ifndef NOKTALARI_DOSYADAN_OKUT // Diyelim ki klavyeden giriş yapılacak //#define KLAVYE_GIRISI_DOGRULAMASI ; // Klavyeden giriş yaptırıldığında girişleri takip edebilmek için #endif//NOKTALARI_DOSYADAN_OKUT #define BILGILENDIR ; // Tüm bilgilendirme çıkışlarını açar ya da kapatır //#define TUM_SAYILARI_GOSTER ; // //#define TEK_SAYILARI_GOSTER ; // } Dosyadan okunan sayıları gösterir //#define CIFT_SAYILARI_GOSTER ; // //Sık kullanılacak uzun isimli değişken türlerine takma isimler ver typedef vector<double> Vektor; typedef vector<double>::iterator VektorGostericisi; // Karmaşık değerler içerecek listeler için yapı tanımla struct KarmasikVektor {Vektor Gercel, Sanal, Mutlak;}; struct VektorIndis {Vektor Tumu, Tek, Cift;}; // Kullanılan işlevleri bildir KarmasikVektor AFD(Vektor&); int main() { ///////////////////////////// /// VERİ GİRİŞİ YAPILIYOR /// ///////////////////////////// Vektor xZaman; // Zaman uzayındaki noktaların aktarılacağı liste #ifdef NOKTALARI_DOSYADAN_OKUT ifstream xZamanDosyasi; // Zaman uzayındaki noktaların okunacağı dosya // Zaman uzayındaki noktaları dosyadan oku xZamanDosyasi.open("./Fourier/xZaman"); // Okuyamazsan haberimiz olsun if (!xZamanDosyasi) { cerr << endl << "Zaman uzayındaki noktaların bulunduğu dosya okunamadı. Kusura bakma." << endl << endl; return 1; // "Hata var!" diye bağıra bağıra programı sonlandır. } else { cout << "Zaman uzayındaki noktalar dosyadan okunabiliyor. Süperim ben" << endl; } double nokta; while (xZamanDosyasi >> nokta) { xZaman.push_back(nokta); } xZamanDosyasi.close(); #else//NOKTALARI_DOSYADAN_OKUT // Noktaları dosyadan okutmuyorsak elle gireceğiz. // Klavyeden bilinmeyen sayıda zaman uzayında örnek girdir: cout << "Lütfen örneklenmiş işaretin noktalarını giriniz. " << "Giriş işlemi bittiğinde \\0 giriniz. Bu, NULL anlamına gelir." << "Bu karakter girildiğinde giriş yapılan döngüden çıkılacak ve programın akışına devam edilecektir." << endl << endl; double gecici; int sayac=0; while (true) { #ifdef KLAVYE_GIRISI_DOGRULAMASI cout << "xZaman.size()=" << xZaman.size() << " ## " << "Şu ana kadar toplam " << sayac << " tane giriş yaptın. " << "Bu girdiğin " << sayac+1 << ". olacak : "; #endif//KLAVYE_GIRISI_DOGRULAMASI cout << "x[" << sayac++ << "]="; if (!bool (cin>>gecici)) { // "\0" (yani NULL) karakteri girildiyse giriş tamamlanmıştır // Döngüden çık, gez dolaş, işine gücüne bak break; } xZaman.push_back(gecici); } #endif//NOKTALARI_DOSYADAN_OKUT /////////////////////////////////////////////////////////////////// /// VERİ GİRİŞİ TAMAMLANDI, HESAPLAMALAR BURADAN SONRA BAŞLIYOR /// /// zaman uzayındaki tüm noktalar şu anda /// Vektor xZaman; //nesnesinde /////////////////////////////////////////////////////////////////// // Fourier dönüşümünü hesapla, listeye aktar KarmasikVektor xFrekans; xFrekans = AFD(xZaman); // GİRİLEN SAYILARI GÖSTER #ifdef TUM_SAYILARI_GOSTER // Okunan tüm sayıları göster cout << "Girdideki tüm sayılar: " << endl; for (unsigned int i = 0; i < xZaman.size(); i++) { cout << "xZaman[" << i << "] = " << xZaman[i] << endl; } #endif//TUM_SAYILARI_GOSTER #ifdef TEK_SAYILARI_GOSTER // Okunan sayılardan tek indisli olanları göster cout << "Girdideki tek indisli sayılar: " << endl; for (unsigned int i = 1; i < xZaman.size(); i += 2) { cout << "xZaman.Tek[" << i << "] = " << xZaman[i] << endl; } #endif//TEK_SAYILARI_GOSTER #ifdef CIFT_SAYILARI_GOSTER cout << "Girdideki çift indisli sayılar: " << endl; for (unsigned int i = 0; i < xZaman.size(); i += 2) { cout << "xZaman.Cift[" << i << "] = " << xZaman[i] << endl; } #endif//CIFT_SAYILARI_GOSTER #ifdef EKRANA_YAZDIR // Hesaplanan fourier dönüşümünü bir zahmet ekrana yazdır cout << endl << "frekans listesinin eleman sayısı: " << xFrekans.Mutlak.size() << endl; int k = 0; for (VektorGostericisi i = xFrekans.Mutlak.begin(); i != xFrekans.Mutlak.end(); i++) { cout << "X.Mutlak[" << k++ << "] = " << *i << endl; } #endif//EKRANA_YAZDIR #ifdef DOSYAYA_YAZDIR ofstream xFrekansDosyasiGercel, xFrekansDosyasiSanal, xFrekansDosyasiMutlak; xFrekansDosyasiGercel.open("./Fourier/xFrekans.Gercel.cem", ios::out | ios::trunc); if (!xFrekansDosyasiGercel) { cerr << "böyle bir dosya oluşturamadım"; return 1; } else { cout << "Dosyaya yazılıyor, lütfen bekleyin. Sakin olun. Kıpraşmayın." << endl; } for (unsigned int i=0; i < xFrekans.Gercel.size(); i++) { xFrekansDosyasiGercel << xFrekans.Gercel[i] << endl; } xFrekansDosyasiGercel.close(); cout << "Tamam, yazdım. Hadi git selametle." << endl; #endif//DOSYAYA_YAZDIR return 0; // Programı hatasız sonlandır } ///################################################################################### /** Programda kullanılan işlevler buradan sonra tanımlanacaktır. */ ///##################################################################################### KarmasikVektor AFD(Vektor& donusturulecekNoktalar) { /** Vektor türündeki zaman noktalarının yer göstericisini kullanıp * işlemden sonra Karmaşık türündeki veriyi döndüren işlev */ // Zaman uzayında kaç tane nokta olduğunu bul const unsigned int ORNEK_SAYISI = donusturulecekNoktalar.size(); #ifdef BILGILENDIR // İşlevin devreye girdiğini kullanıcıya bildir: cout << endl << "AFD() işlevi devreye girdi, " << ORNEK_SAYISI << " adet nokta üzerinde işlem yapılacak" << endl; #endif//AFD_BILGILENDIR // Hesaplanan frekans uzayındaki değerlerin aktarılacağı liste(ler) KarmasikVektor frekanstakiNoktalar; // Ayrık Fourier Dönüşümü için hesaplama // Zaman uzayındaki nokta sayısı kadarlık döngü aç // k. frekans değerini hesapla for (unsigned int k = 0; k < ORNEK_SAYISI; k++) { // Kullanılacak geçici değerleri ilklendir double gercel=0.0; double sanal=0.0; // Zamandaki noktalara ulaşmak için liste göstericisi tanımla ve onu ilklendir VektorGostericisi x; x = donusturulecekNoktalar.begin(); // Toplam işlemi // n. zaman değerini işleme al for (double n = 0.0; n < ORNEK_SAYISI; n++) { // Trigonometrik fonksiyonun içini bu şekilde sadeleştir double p = 2.0 * M_PI / ORNEK_SAYISI * k * n; // Gerçel ve sanal frekans değerlerini bul gercel += (*x) * cos(p); sanal += (*x) * sin(p); x++; } // Hesaplanan frekans değerlerinin gerçel ve sanal kısımlarını // ilgili listelere aktar: frekanstakiNoktalar.Gercel.push_back(gercel); frekanstakiNoktalar.Sanal.push_back(sanal); /** * frekans = frekansGercel + j frekansSanal * ____________________________________ * frekansMutlak = mutlak = \/ (frekansGercel)² + (frekansSanal)² * ______________________ * = \/ (gercel)² + (sanal)² */ double mutlak; mutlak = sqrt( pow(gercel, 2) + pow(sanal, 2) ); // Hesaplanan mutlak frekans değerini frekanstakiNoktalar.Mutlak listesine koy frekanstakiNoktalar.Mutlak.push_back(mutlak); } return frekanstakiNoktalar; }

FLTK ile Görsel Kullanıcı Arayüzü Durum: Başlangıç Aşamasında
Giriş
FLTK (Fast Light Tool Kit), özellikle C++ için yazılmış ve adından da anlaşılacağı gibi hem hızlı hem de küçük boyutlu bir görsel öğe kütüphanesidir. Ana sayfası http://www.fltk.org
Kullanım Alanları
Kullanıcılar her zaman komut satırından hoşlanmayabilir. * Bu yüzden yazdığınız programlara bir arayüz eklemek durumunda kalırsınız. Bu iş için Windows'da eskiden yalnızca Windows'un kendi görüntü kütüphanelerini kullanabiliyordunuz, şimdilerde çeşitler bollaştı. Güzel ve doğal görünüm için tercih edilebilecek en güzel kütüphane wxWidgets olmasına rağmen FLTK da çok hızlı ve küçük boyutlu olmasının yanında aynı zamanda taşınabilir de olduğu için tercih sebebi olabilir.
#include <fltk/Window.h> #include <fltk/Widget.h> #include <fltk/run.h> using namespace fltk; int main(int argc, char** argv) { Window* Pencere = new Window(800, 180); // Yeni bir Pencere nesnesi oluştur Pencere->begin(); // Başla. Neyini açıklayım daha... Widget* IcKutu = new Widget(90, 40, 620, 100, "Merhaba dünya"); // İçKutu tanımla IcKutu->box(DOWN_BOX); // Kutuya özellik ata IcKutu->labelfont(HELVETICA_BOLD_ITALIC); // Karakter türü IcKutu->labelsize(36); // Karakter boyutu IcKutu->labeltype(SHADOW_LABEL); // Bunu bilmiyorum, sallamayım şimdi. Pencere->end(); // Bitiriyordur herhalde Pencere->show(argc, argv); // Hiçbir fikrim yok. Bu ne lan? char KarakterDizisi[]="Naber nasılsın?"; Window* TheWindow2 = new Window(400,300); TheWindow2->begin(); Widget* Kutucuk = new Widget(10, 100, 200, 100, KarakterDizisi); // Widget(x, y, en, boy, "kutu başlığı") Kutucuk->labelsize(20); Kutucuk->labeltype(SHADOW_LABEL); TheWindow2->end(); TheWindow2->show(argc, argv); return run(); // Çalıştırmak için sanırsam... }
Belirli integral Durum : Kullanışsız
Giriş
Sayısal çözümleme dersinde gördüğümüz yöntemlerden biri, sınırları ve denklemi belli olan bir fonksiyonu küçük dikdörtgenlere bölerek fonksiyonun grafiği ile x ekseni arasında kalan alanı hesaplamakta kullanılabilcek en basit program.
Kullanım Alanları
Programı bu halde hiçbir yerde kullanamazsınız. Niye? E, her seferinde kaynak kodu mu değiştireceğiz? Ben zaten öylesine yazdım bunu. Evet.
#include <iostream> #include <math.h> using namespace std; double Integral (double, double); double ORNEKLEME_PERIYODU=1e-6; int main() { double AltSinir, UstSinir; cout << "İntegral sınırlarını gir:" << endl; cout << "AltSınır: "; cin >> AltSinir; cout << endl; cout << "ÜstSınır: "; cin >> UstSinir; cout << "İntegral Sonucu: " << Integral ( AltSinir, UstSinir) <<endl; return 0; } double Integral (double AltSinir, double UstSinir) { // Fonksiyon: x²+2x+5 olsun. double IntegralSonucu, i; for (i=AltSinir; i<UstSinir; i+=ORNEKLEME_PERIYODU) { IntegralSonucu += (i*i + 2*i + 5) * ORNEKLEME_PERIYODU; } return IntegralSonucu; }
Naber.asm Durum: Örnek Amaçlı
Giriş
Bunca zaman boyunca (uzunca bir süre mikroişlemciler dersi aldık) gerçekte hiç assembly programı yazmamıştık. En azından bir yerden başlamak istedim...
section .data Naber: db 'Naber, nasılsın?',0xA ; Deneme cümlemiz, sonuna SatırAşağı karakteri ekliyoruz NaberKacKarakter: equ $-Naber section .text global _start _start: push 10 ; Sayaç. Yerimiz olmadığı için belleğe yolluyoruz. yaz: mov eax,4 ; sys_write mov ebx,1 ; 1 - standart yazma mov ecx, Naber mov edx, NaberKacKarakter ; int 80h ; Kernel buraya yumruk havaya pop eax ; Sayacı çağır dec eax ; Bir azalt push eax ; Geri yerine koy jnz yaz ; Bak bakalım sayaç dolmuş mu, dolmamışsa yaz: 'a git mov eax,1 ; İşimiz bitti, çıkıyoruz (sys_exit) mov ebx,0 ; Çıkış kodu: 0 (Hata falan yok) int 80h