Şimdi Ara

Hacetepeliden MATLAB da DSP dersleri

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
103
Cevap
6
Favori
34.212
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 12345
Sayfaya Git
Git
sonraki
Giriş
Mesaj
  • edit:
    musallim abime 4share.com'u tavsiye ettiği için teşekkür ederim

    http://www.4shared.com/file/5886566/396a46a8/DSP1.html
    http://www.4shared.com/file/5886589/375676b7/DSP2.html
    http://www.4shared.com/file/5886592/b99f9e7e/DSP3.html
    http://www.4shared.com/file/5886598/594a7760/DSP_ders123.html
    http://www.4shared.com/file/5886603/1d1cabf8/Hacettepeliden_MATLAB_GUIDE.html
    http://www.4shared.com/file/5886599/2e4d47f6/CDMAders.html

    ---------------
    mrb arkadaşlar burda bildiğim kadarıyla MATLAB da DSP uygulamaları yapmayı göstereceğim (çok bişey bilmiyorum fakat bildiğim kadarını paylaşıyorum) umarım birilerine faydalı olabilirim dersi (talep olursa dersleri) takip edebilmek için sadece MATLAB programınız olmalı ben ders sırasında yeri geldikçe anlatacağım tek tek hem DSP hemde MATLAB ı (insanların DSP ye olan merakından dolayı böyle bişey yazmaya karar verdim)

    bu ilk dersimizde basit bişeyler yapacağız amacım şu insan kulağı 20 Hz (Bas)- 20kHz (Tiz) e kadar frekanstaki sesleri duyabilir iki sinüs dalgası (ki bunlar telefondaki gibi sabit ton oluşturur) oluşturacağız yüksek frekansların nasıl tiz ses düşük frekanslarında nasıl bas duyulduğunu göreceğiz daha sonra bu iki sinyali toplayıp beraber dinleyeceğiz daha sonra basit bi LPF (Low Pass Filter) (Alçak frekansları geçiren filtre) tasarlayıp topladığımız iki sinüsü birbirinden ayıracağız evet lafı uzamayalım başlayalım

    ilk önce 150Hz de bi sinüs oluşturacağız ama sonuçta bilgisayarımız dijital olduğu için bu sinüsünde dijital hale getirilmiş olması lazım bu sebeple elimizde analog bi sinyal olduğunu düşüneceğiz bunu belli bir frekansta örnekleyeceğiz diyelimki elimizde f Hz lik bi kaynak var bunun ürettiği dalganın denklemi şu şekildedir

    Sin(t)=sin(2*pi*f*t)

    2*pi*f=w bu sinüsün frekansını belirleyen parametre f Hz (1/sn) cinsinden ölçülür w (rad/sn) yı şöyle düşünebiliriz bi tekerlek diyelim eğer
    bu w frekansıyla dönüyorsa 1 saniyede w kadar açı tarar bunu 2*pi ye bölerseniz (tekerleğin bi turda taradığı açı) w/(2*pi)=f olur ki buda 1 saniyede kaç kere döndüğünü gösterir

    dolayısıyla 150Hz lik kaynak şudur

    Sin1(t)=sin(2*pi*150*t)

    15kHz lik analog kaynağımızda şu olur

    Sin2(t)=sin(2*pi*15000*t)

    şimdi bu analog sinyalleri örneklememiz lazım aklıma gelmişken analog ve discrete (=ayrık) (~dijital) ne demek kısaca anlatıyım basitçe anlatmak gerekirse analog reel sayılar demektir dijital ise tam sayılar demektir mesel 0 ile 100 arasında sonsuz reel sayı vardır ama sınırlı sayıda tam sayı vardır aynı şey zaman içinde geçerlidir t yani zaman "akıp" gider seke seke gitmez bildiğiniz gibi ancak sonsuz zamanı bilgisayarla kontrol etmek simülasyonunu yapmak olanaksızdır bu sebeple DSP de sinyaller belli zaman aralıklarıyla=Ts (sampling period,örnekleme aralığı) örneklenir yani Ts nin tam katındaki değerler alınır eğer bu Ts ler yeterince küçükse analog sinyal teoride tam anlamıyla tekrar oluşturula bilir yani Ts aralığındaki sinyalin diğer aldığı değerler gereksizdir sinyalleri dijital hale getirmek bizim bu gereksiz (redundant) verilerden kurtulmamızı sağlar şimdi bu Ts aralıklarının nasıl seçileceğini anlatıyım 1 saniyede aldığımız örnek sayısı örnekleme frekansıdır fs (sampling frequency) buda örnekleme aralığıyla şu şekilde ilişkilidir Ts=1/fs. Bir sinyalin maksimum içerdiği frekans bileşeni ...(şimdi frekans bileşenini anlatıyım çoğu sinyaller ağırlıklandırılmış sinüslerin toplamı olarak yazılabilirler, sinyallerin frekans bileşenlerinin analizi periyodik olmayan sinyaller için fourier transform (fourier dönüşümü) periyodik sinyaller içinse fourier series (fourier serisi) ile yapılır bu ağırlıklandırılmış sinüs kavramını daha basit bi şekilde açıklayacak olursak x,y,z koordinat sistemini düşünün bu koordinat sisteminde bir vektör birim vektörlerin toplamı olarak yazılabilir mesela V=2*x-3*y+1*z (burda x,y,z birim vektörler) aynı şekilde sinyallerde sonsuz boyutlu bir koordinat sistemindeki vektörlerdir. bu xyz koordinat sistemindeki katsayıların birim vektörleri ağırlıklandırarak xyz deki vektörü belirttiği gibi sonsuz boyutlu birim,vektörleri farklı frekanstaki sinüsler olan sistemde sinyallerin her frekanstaki sinüsten aldığı katkılarda sinyalleri belirtir yani basitçe
    y(t)=2*sin(2*pi*1*t)+3*sin(2*pi*2*t)+..... (frekanslar böyle gitmek zorunda değil sadece örnek).İşe Fourier dönüşümü ve serisi sinyallerin farklı frekanstaki sinüslerden aldığı kat sayıları hesaplamakta kullanılır)...fm frekansında ise bu sinyal en az 2*fm frekansında örneklenmelidir (Nyquist criterion,Nyquist kriteri) bunun sebebi eğer bundan daha düşük bi frekansta örneklenirse yani iki örnek arası maksimum Ts den daha fazla aralık bırakılırsa bu Ts aralığındaki tüm datalar gereksiz değildir (redundant) yani böyle yapmakla bize sinyali tekrar oluşurmak için gereken tüm dataları almamış eksik data almış oluruz ve sinyali tekrardan oluşuramayız

    ...devam ediyor altta



    < Bu mesaj bu kişi tarafından değiştirildi lftx -- 14 Kasım 2006; 8:44:16 >







  • şimdi analog sinyallerimize dönelim yani

    Sin1(t)=sin(2*pi*150*t)

    Sin2(t)=sin(2*pi*15000*t)

    dediğim gibi örnekleme işlemi Ts nin tam katlarında katlarında alınan datalardır yani biz sinyali dijitale çevirdiğimizde n*Ts deki datalara sahip oluruz şimdi n*Ts yi üstteki sinyallerde yerine koyalım

    Sin1(n)=sin(2*pi*150*n*Ts) Sin2(n)=sin(2*pi*15000*n*Ts) yani Sin1(n)=sin(2*pi*30*n/fs) Sin2(n)=sin(2*pi*15000*n/fs)

    fs olarak 44kHz seçelim MATLAB da dinleyebilmek için (şimdi anladınız neden mp3 ler 44kHz den büyük frekansla örneklenmiyor çünkü yarısı 22kHz insan sesi yaklaşık 20kHz i duyuyordu 2kHz de filtrelemeye kolaylık vs bakımından konulmuş bi marj)

    şimdu bu dijital sinyalleri Matlab da oluşturalım

    1sn lik sinyaller olsun yani n*Ts=1 sn. yani n=44000 maksimum değeri bunun için

    >> n=[0:44000]; (yazıyoruz bu işlem 0 dan başlayıp 44000 a kadar 1 er 1 er arttırarak bi dizi oluşurur bu bizim ayrık zaman dizimiz olcak)
    >> fs=44000; (örnekleme frekansımızı tanımladık)

    (sondaki ";" işlemin sonucunu göstermeden sadece işlemi yaptırmaya yarıyor koymazsanız sonucuda gösterir)

    >> Sin1=sin(2*pi*150.*n/fs); (yazarak 30 Hz lik 44000 Hz de örneklenmiş bi sinüs oluşturduk bunu çizdirip bir bakalım)

    önce analog zamanı oluşturalım t ye göre cizdirmek için

    >> t=linspace(0,1,44001); (yazıyoruz bu linspace fonksiyonu 0 ile 1 arasına 44001 yazdık çünkü 0 ile 44000 arası 44001 sayı var MATLAB da yanda dizinin boyutundanda bunu görebilirsiniz)

    >> plot(t,Sin1); (dediğimizde 30 Hz lik sinyali görüyoruz plot fonksiyonunda neye göre neyi çizdirceğimizi yazıyoruz )

    (diğer Sinüsü oluşturalım şimdide)

    >> Sin2=sin(2*pi*15000.*n/fs); (bunun frekansı o kadar yüksek ki saniyede 15000 defa +1 ile -1 arasında gidip gelmiş bu yüzden bunu çizdirirseninz pek bişey göremezsiniz ancak yakınlaştırırsanız sinüs olduğunu anlarsınız)

    şimdi bu sinyalleri dinleyelim bunun için

    >> sound(Sin1,44000) yazıyoruz (burda Sin1 çalacağımız vektör 44000 de örnekleme frekansı) (Boooooo diye bişey duydum ben işte buna BAS derim )

    >> sound(Sin2,44000) (işte buda TİZ)

    .... devam ediyor




  • şimdi bu sinyallerin Fourier Transformlarını alalım frekans ekseninde nasıl görüldüklerinide gösteriyim bu sinyaller dijital sinyaller olduklarından DFT (Discrete Fourier Transform) lerini alıyoruz aslında gerçek FT (Fourier Transform) ( DFT yi FT nin bi Alt kümesi olarak düşünün onun bi yakınsaması bunu anlamak biraz uzun iş çünkü)

    bunun için şöyle yapıyoruz

    >> Sin1_spec=fft(Sin1); (FFT Fast Fourier Transform Hızlı bir şekilde DFT alan bi algoritma) (normal olarak sinyal kompleks çıktı FT nin sonucu genelde kompleks tir yani sadece bir büyüklük değil bide fazı vardır bileşenlerin) (ama biz sadece büyüklüğüyle ilgleniyoruz şimdi)

    bunu çizdirelim bakalım

    ama önce bi frekans vektörü tanımlamamız lazım yada radyan olarak çizdirebiliriz ama biz frekans olarak çizdirelim frekansa daha aşinayız çünkü ayrık zamanda sinyallerin DTFT (Discrete Time Fourier Transform) ları 2*pi ile periyodiktir analog bi sinayali fs ile örneklediğimizde sinyal fs in katlarında kendisini tekrarlar frekans ekseninde dijital hale getirdiğimizde bu frekanslar 2*pi frekansına denk gelir yani fs ile örneklediğimiz bi sinyal 0 ile 2*pi arasına skalanır bu durumda fs=2*pi ye denk gelir

    MATLAB ın FFT fonksiyonu 0 ile 2*pi arasında sinyallerin DFT lerini alır bu bilgilerden sonra f i oluşuralım

    >> f=linspace(-22000,22000,44001); (-22000 +22000 yaptım çünkü -fs/2 ve +fs/2 arasında çizdircem FT u simetrik olması açısından)
    >> plot(f,abs(fftshift(Sin1_spec))); (burda fftshift 0 2*pi arasındaki transformu -pi pi arasına kaydırır simetrik gözükür böylece cizilen grafik)

    gördüğünüz gibi 0 civarında 2 tane çizgi görüyorsunuz bunlarda normal çünkü 150Hz deki sinüs sadece 150 Hz deki birim sinüsten katkı alır diğerlerinden almaz

    diğer fonksiyonunda FFT sini alalım

    >> Sin2_spec=fft(Sin2);
    >> plot(f,abs(fftshift(Sin2_spec)));

    ve çizdirince 15000 Hz de iki çizgi görüyoruz buda 15kHz deki bi sünüsün sadece 15kHz deki birim sinüsten katkı aldığını gösterir

    elimizde bi sinyal varsa bundan onun FT sini elde edebiliyoruz elimizde bi sinyalin FT si varsa bundanda sinyalin kendisini elde edebiliriz

    bunuda gösteriyim

    diyelim elimizde Sin1_spec var biz Sin1 yi oluşturacağız bunun için

    >> inv_Sin1_spec=ifft(Sin1_spec); (yazıyoruz ifft (inverse fft anlamına geliyor) sinyalin ters fourier dönüşümünü alıyor)

    (bunun normalde reel çıkması lazım ama MATLAB daki yuvarlamalardan filan dolayı çok küçük bi kompleks kısım çıkıyor bunuda şöyle elimine ederiz)

    >> inv_Sin1_spec=real(inv_Sin1_spec); (sadece reel kısmını aldık iki fonksiyonu aynı ekranda çizdirelim inv_Sin1_spec in Sin1 e eşit olduğunu görelim)

    >> subplot(2,1,1); plot(t,Sin1);
    >> subplot(2,1,2); plot(t,inv_Sin1_spec); (yazıyoruz burda subplot(x,y,z) ekranı x satır y sütuna bölüp z ye çiziyor)

    gördüğünüz gibi aynı sinyali elde ettik


    .... devam ediyor




  • dostum bende aynı derslerleri seninle aldım, ama hakketen sen olayı iyi kavramışsın. eskiden kafama takılan bi kiç şey de aydınlanmış oldu sayende. bende bi eklemede bulunayım çünkü bu dizilerin çarpma işlemleri kafamı çok karıştırmıştı zamanında, okuyanlar için faydalı olabilir..
    -----
    >> Sin1=sin(2*pi*150.*n/fs); burada 150 den sonra lftx in koyduğu nokta çarpımdan sonraki n in bir dizi olmasından kaynaklanıyor(>> n=[0:44000];). n biri dizi olduğu için bu noktayı koymak zorundayız. böylelikle Sin1 de artık n değerlerine bağlı bir dizi haline gelmiş oluyor..
    ------

    devamını bekliyoruz



    < Bu mesaj bu kişi tarafından değiştirildi matador01 -- 24 Ağustos 2005, 14:44:52 >
  • şimdi bu iki sinyali toplayıp ikisini beraber dinleyelim hem TİZ hem BAS olcak

    >> Signal=Sin1+Sin2; (diyip topluyoruz iki sinyali bunları dinleyelim)

    >> sound(Signal,44000); (MTV World Chart Express te çıkar bu eheue )

    şimdi toplanmış iki sinyalin FT larına ne olduğuna bakalım

    >> Signal_spec=fft(Signal);
    >> plot(f,abs(fftshift(Signal_spec))); (yazıyoruz eveeet gördük iki sinyalde toplanmış)

    ...devam edecek (şu filtreleme işini daha sonra anlatacağım sıkıldım biraz yeter bu kadar şimdilik)
  • evet kaldığımız yerden devam ediyoruz

    eski duruma gelmek için şurayı kopyalayığ matlab a yapıştırın


    n=[0:44000];
    fs=44000;
    Sin1=sin(2*pi*150.*n/fs);
    t=linspace(0,1,44001);
    Sin2=sin(2*pi*15000.*n/fs);
    Sin1_spec=fft(Sin1);
    f=linspace(-22000,22000,44001)
    Sin2_spec=fft(Sin2);
    Signal=Sin1+Sin2;
    Signal_spec=fft(Signal);

    şimdi Signal sinyalinden TİZ sesi yani yüksek frekanslı sesi bastıracağız BAS ses kalacak bunuda bi LPF ile (Low Pass Filter-Alçak Frekansları Geçiren) önce filtremizi MATLAB ın filter design tool u ile tasarlayacağız MATLAB/Start/Tool Boxes/Filter Design/Filter Design Tool dan çalıştırıyoruz Low Pass i seçin FIR ı işaretleyin (IIR da seçebiliriz ancak IIR filtrelerin phase response ları (faz tepkileri) lineer değildir bu sebeple filtrelenen sinyali bozar bunu düzeltmek için IIR filtrenin önüne bi APF (All Pass Filter-Tüm Frekansları Geçiren) konulur bunun magnitude response u(yani Büyüklük tepkisi ?? ne biçim çevirdim demi başka bi çevirisi varsa haber verin magnitude response un) sabittir ancak phase response u bozulan sinyali düzeltecek yöndedir ) FIR filtrelerin phase response ları lineerdir buda tercih edilen bir durum çünkü lineer olması sadece sinyalde bi gecikmeye sebep olur (delay) FIR ın yanından Window seçin Fs yerine 44000 yazın Fpass için 150 den büyük 15000 den küçük bişey yazmalısınız bu hangi frekansa kadar geçirileceğini gösteren parametre ben 3000 yazdım Fstop 12000 yazdım buda hangi frekanstan sonrasının geçirilmeyeceğini gösterir Fpass Fstop a ne kadar yakın olursa filtrenin derecesi artar (filter order) derecesinin atması iyi bişey değil filtreyi bi dizi gibi düşünün bu dizideki eleman sayısı artıyor demektir Fpass ve Fstop un arasındaki bölgeye geçiş bölgesi (Transition Region-Transition Band) denir bu bölgedeki frekanslarda bastırılmaya başlanır ancak tam anlamıyla istediğimiz kadar zayıflamazlar (Fstop tan sonrası gibi) Apass a 1 yazın bu 0dB demek yani 0 Hz den Fpass e kadar olan sinyaller ne zayıflatılacak nede yükseltilecek Astop yerine 40 yazın 40dB zayıflatılacak demektir bu sinyalin gücünün 10^4 kat azaldığını gösterir

    Design Filter butonuna basıyoruz biraz bekletin üstteki grafiklerden filtrenin tepkisini görüyoruz

    File/Export... a gelin

    Numerator un yanında Num yazıyor oraya Filter yazın ok diyin şimdi bunu kapata biliriz şimdi istediğimiz sinyali bu tasarladığımız filtre ile filtreleyebiliriz

    şimdi bunu bi kaç yolla yapabiliriz LTI (Linear Time Invariant-Lineer Zamandan Bağımsız) sistemlerin giriş ve çıkışları aradaki ilişki şudur giren sinyal ve sistemin impluse response u (girişine impulse uygulandığında çıkışta görülen sinyal) nun konvolüsyonu (convolution-matematiksel bi operasyon-polinom çarpmasına benzer bi işlem) çıkış sinyaline eşittir yani

    x(t) (*) h(t) = y(t) x(t) giriş sinyali h(t) impulse response y(t) çıkış sinyali (*)convolution operatörü

    yani bizim h(t) Filter x(t) Signal oluyor MATLAB daki

    şimdi filtrelemeyi yapalım

    >> Output1=conv(Signal,Filter);

    iki sinyalin konvolüsyonlarını almış olduk bunu dinleyelim

    >> sound(Signal,44000);
    >> sound(Output1,44000);
    >> sound(Sin1,44000);

    farkı göreceksiniz ne yaptığımızı bunu bide çizdirelim

    >> subplot(3,1,1); plot(Sin1); axis([0 44000 -1 1]);
    >> subplot(3,1,2); plot(Signal); axis([0 44000 -1 1]);
    >> subplot(3,1,3); plot(Output1); axis([0 44000 -1 1]);

    (elimizde 2. sinyal vardı biz bunu filtreledik 3. sinyali elde ettik ki buda 1. sinyale eşit yani orjinal sinyale diğer topladığımız yüksek frekanslı sinyal yok olmuş durumda) (axis fonksiyonu çizerken hangi aralıkta çizeceğini söylüyor axis([a b c d]) x ekseninde a dan b ye y ekseninde c den d ye)

    filtrelemeyi şöylede yapabiliriz

    >> Output2=filter(Filter,1,Signal); (buda conv un yaptığına benzer bi iş yapıyor)

    bunuda dinleyebilirsiniz Output1 ile aynı çizdiredebilirsini buda aynısını çıkartacaktır şimdi göstermek istediğim başka bişey daha var

    devam ediyor...



    < Bu mesaj bu kişi tarafından değiştirildi lftx -- 25 Ağustos 2005, 19:15:48 >




  • konvolüsyon işlemi zaman değişkeniyle yapılan bir işlemdir yani bir sinyali real-time (gerçek zamanlı işlemek istiyorsak bunu konvolüsyonla yaparız gerçi direk konvolüsyonla yapmak verimli bi yöntem değil nasıl verimli hale getirildiğini söylicem)

    frekans değişkeniylede filtreleme yapabiliriz yani Fourier Transformları alınmış sinyalleride kullanarak filtreleme yapılabilir zaman değişkeniyle yapılan konvolüsyon işlemi Fourier Dönüşümünden geçince bildiğimiz çarpma işlemine döner yani

    X(f)*H(f)=Y(f)

    >> Filter_spec=fft(Filter,44001); (44001 noktalı FFT alıyoruz yani Filter 13 noktadan oluşturuyordu bu 13 noktanın yanına 44001 e tamamlıcak kadar 0 konup FFT si alınıyor ki bu gerekli çünkü ( .* ) operasyonu yapacağız yani dizilerin her elemanı karşılık gelen elemanlarla tek tek çarpılacak matris çarpımı yapılmayacak)

    >> Output3_Spec=Filter_spec.*Signal_spec;

    şimdi bunu çizdirelim

    >> subplot(3,1,1); plot(f,abs(fftshift(Sin1_spec)));
    >> subplot(3,1,2); plot(f,abs(fftshift(Signal_spec)));
    >> subplot(3,1,3); plot(f,abs(fftshift(Output3_Spec)));

    gördüğünüz gibi 2. durumda 3. duruma geldik ki buda 1. duruma benzer ama aynı değil 3. grafikte 15000 Hz civarına yakınlaşırsanız küçük bi çıkıntı görürsünüz buda orda "eskiden" bulunan sinüsten kalmadı (çünkü yok etmedik sadece çok fazla zayıflattık)

    zamana geri dönelim

    >> Output3=ifft(Output3_Spec); (ters Fourier dönüşümüyle döndük)
    >> Output3=real(Output3);

    bunu dinleyelim

    >> sound(Output3,44000); (ve tadaaa işte yaptık ;) )

    umarım dersten memnun kamışsınızdır birilerine yardımcı olabildiysem ne mutlu eğer talep olursa başka derslerde yazarım şimdilik hoşçakalın başarılar herkese....

    (*)Musty(*)2005(*)



    < Bu mesaj bu kişi tarafından değiştirildi lftx -- 25 Ağustos 2005, 19:16:28 >




  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
  • lftx arkadaşım çok güzel açıklamışsın.

    peki dsp ile mp3 dekoder nasıl yapılır?
  • o konuda bi fikrim yok ama algoritması vardır sonuçta onu bilirsem Matlab da bi decoder yazabilirim sanıyorum ayrıca sesi encode etmek decode etmekten daha zor bence

    ***gelecek derste filtrelemeye devam ederek wav dosyalarının boyutunu küçülteceğiz***

    ( coming soon!!! )
  • eveet arkadaşlar bi kez daha merhaba bu derste MATLAB için fonksiyon yazmayı öğreneceğiz ve yazdığımız bu fonksiyonu yapacağımız başka bir iş için kullanacağız

    öncelikle matlaba bir wav dosyası okutacağız kısa süreli olursa yapacağımız işe harcanan zaman ve elde ettiğimiz performans daha iyi olacaktır ben kendi kullandığım wav dosyasını upload ettim aşağıdaki linkten indirebiliriniz

    http://rapidshare.de/files/4420648/wrong.wav.html

    bu dosyayı MATLAB ın work isimli klasörünün içine koyun

    şimdi bu dosyayı MATLAB a okutalım bunun için

    >> [signal,Fs,bits]=wavread('wrong.wav');

    (bu datayı signal isimli vektöre okur Fs dosyanın örnekleme frekansı ,bits te kaç bitle nicelendiği (quantize))

    şimdi bu sinyalin Fourier Dönüşümünü alalım bakalım nasıl bişeymiş bu ses frekans bölgesinde

    >> signal_spec=fft(signal);
    >> f=linspace(-Fs/2,Fs/2,1652); (frekans eksenini olşturduk)
    >> plot(f,fftshift(abs(signal_spec))); (çizdirdik)

    gördüğünüz gibi bu dosyanın frekans bileşenleri 0-800Hz arasında yoğunlaşmış geri kalan kısmı 800-11025/2 Hz arası sinyalin enerjisinin küçük bi kısmını oluşuruyor

    şimdi bi fonksiyon yazalım MATLAB da yapacağı iş fourier dönüşümünü örnekleme frekansını verdiğimiz sinyalin istediğimiz yüzdedeki gücünün hangi frekans arasında olduğunu buldurmak ben bunun için şu kodu yazdım

    bunu şuraya yazacaksınız

    File/New/M File

    yada (CTRL+N)

     

    function [f,n,real_perc]=findenergyperc(x,Fs,perc);
    max_size=length(x); %sinyalin boyunu buluyoruz
    x_psd=x.*conj(x); %frekansa bağlı güç dağılım yoğunluğunu buluyoruz (power spectral density=psd)
    %bir sinyalin PSD si onun FT umun büyüklüğünün karesi olarak tanımlanır bu eğrinin altında kalan alan sinyalin enerjisini verir
    %conj(x) x in kompleks konjugesini alır kompleks bir sayının kendisi ile konjugesinin çarpımı sayının mutlak değerinin karesidir

    x_psd_int=integ(x_psd,1,round(max_size/2)); %integ aşağıda yazdığımız fonksiyon her hangi bir sinyalin verilen iki değer arasında integralini alıyor
    %burda 1 den sinyalin yarısına kadar alıyoruz çünkü önceden anlattığım gibi MATLAB 0-2pi arası FFT alıyor
    %ama bize 0-pi arası lazım çünkü ondan sonra periyodik devam ediyor yani tam pi noktasında bir ayna
    %var gibi düşünebilirsiniz

    x_psd_int=x_psd_int*100/x_psd_int(round(max_size/2)); %sinyali yüz üzerine skalalandırdık artık enerjiyi değil yüzde enerjiyi gösteriyor

    n=1; %başlangıç değeri
    while(x_psd_int(n) < perc) %istediğimiz yüzdeye eşit veya daha büyük bir değer bulduğu ana kadar vektörü tarıyor
    n=n+1;
    end
    n=n %noktalı virgül koymadım sadece göstermesi için istediğimiz sinyal yüzdesi hangi indise sahip onu gösteriyor
    real_perc=x_psd_int(n) %bu indisteki sinyal yüzdesi tam olarak kaç onu gösteriyor
    f=(n-1)*(Fs/2)/length(x_psd_int) %ve indisi frekans a dönüştürüyor Fs i kullanarak
    x_psd_int_opt=(x_psd_int-min(x_psd_int))./([1:length(x_psd_int)]); %burda her yüzdeyi bulunduğu indise böldüm ve optimum hangi değerden kesilirse
    % hem sinyaldeki kaybımız en az olacak (yani sinyalin büyük bi kısmını alacağız) hemde düşük frekansta olacak
    %yani frekansın düşük enerjininde en fazla olduğu noktayı bulduruyorum min(x_psd_int) i çıkarmamın sebebi
    %düşük frekanslarda eneji fazla değil ancak frekansta çok küçük olduğu için yanlış olarak optimumun düşük
    %düşük çıkmasını engellemek içindi (bu benim optimum için uydurduğum bişey genel bi fikir vermesi açısından)
    %ama veriyorda
    [y,n_opt]=max(x_psd_int_opt); %optimum değerin indisini buluyoruz
    n_opt=n_opt %gösteriyoruz
    real_perc_opt=x_psd_int(n_opt) %optimum değeri kullanırsak sinyalin yüzde kaçını aldığımızı gösteriyor
    f_opt=(n_opt-1)*(Fs/2)/length(x_psd_int) %ve optimum indisin karşılık geldiği frekans



    ve yardımcı olarak

     

    function int=integ(curve,x0,x1); %bu fonksiyonda sinyalin nümerik integralini alıyor
    int(x0)=curve(x0);
    for(n=(x0+1):(x1))
    int(n)=int(n-1)+curve(n);
    end



    ÖNEMLİ:bu dosyaların ismi function ****** dediğimiz kısımla aynı olmalıdır yoksa çalışmaz fonksiyonlar

    devam ediyor....




  • şimdi oluşturduğumuz bu fonksiyonu kullanarak istediğimiz ve optimum sinyal enerjilerinin frekansını bulalım

    bunun için

    >> [ft,nt,real_perct]=findenergyperc(signal_spec,Fs,90); (sinyalin 90 enerjisi 0 ile hangi frekans arasında demek oldu bunu yazmak)

    n =

    110


    real_perc =

    91.2873


    f =

    727.4364


    n_opt =

    117


    real_perc_opt =

    98.2477


    f_opt =

    774.1525

    yani sinyalin %90 enerjisi 0-727 Hz arasındaymış
    optimum bize önerilen değer 0-774Hz arasını almamız bunu yaparsak sinyalin %98.2 enerjisini korumuş oluyoruz

    tamam dediğini yapalım bunun için

    filter design tool u açıyoruz

    MATLAB/Start/Tool Boxes/Filter Design/FDATool

    FIR-LOWPASS-Window seçin

    Triangular seçip

    Specify Order a 300 yazın

    Fs=11025
    Fc=774 yazın Design Filter a basın
    biraz kasacak ve tadaa

    sonra

    File/Export diyin Numerator kısmına Filter yazın ok diyin

    tamam şimdi filtremizi dizayn ettik

    şimdi bu filtre ile sinyalimizi filtreleyelim

    bunun için

    >> signal_filter=filter(Filter,1,signal); (yazıyoruz ve tadaa 0-774Hz kısmına aldık sinyalin geri kalan kısmını attık gitti bu ne yarar sağladı öncede sinyal 0-11025/2 Hz arasında tanımlıydı yani sinyalin çok önemli olmayan kısımları için birsürü veri tutuyorduk bu da boyutu arttırıyordu)

    bunu çizdirip bakalım

    >> subplot(2,1,1); plot(f,abs(fftshift(signal_spec)));
    >> subplot(2,1,2); plot(f,abs(fftshift(signal_filter_spec)));

    üstteki orjinal sinyal alttaki bizim sinyal farkı görüyorsunuz

    şimdi madem sinyali 0-774Hz arasına sınırladık 5000 küsür Hz e ihtiyacımız yok yani sinyali tekrardan örnekleyebiliriz bunu şöyle yapacağız

    >> signal_filter_resample=resample(signal,1600,11025); (sinyali 1600 Hz de örnekledik 1600 seçmemizin sebebi üstte anlattığım Nyquist Criteria yani artık sinyalimiz 0-800 Hz arasındaki değerlere sahip)

    şimdi bunu dinleyelim ve orjinalden çok farklı olmadığını göreceksiniz

    >> sound(signal,11025); (bu orjinal)
    >> sound(signal_filter_resample,1600); (bu bizim ufaklık)

    şimdi bunu kaydedip boyutunu ne kadar küçülttüğümüze bakalım

    bunuda şöyle yapıyoruz

    >> wavwrite(signal_filter_resample,1600,8,'wrong_opt.wav'); (1600 Hz de örneklenmiş 8bit le nicelendirilmiş olarak wrong_opt ismiyle MATLAB ın work klasörüne kaydettik)

    boyutlara bakalım

    wrong.wav 1696 bytes
    wrong_opt.wav 284 bytes

    yanii

    >> 1696/284

    ans =

    5.9718

    kat küçülttük dosyayı hemde sinyalin enerjisinin %98.2 sini koruyarak

    hiç fena bi ticaret değil değil mi?

    (*)Musty(*)2005(*)



    < Bu mesaj bu kişi tarafından değiştirildi lftx -- 30 Ağustos 2005, 14:46:11 >




  • Peki bunların C kodu dönüşümlerini sağlıyabiliyor musunuz?
  • wavread,wavwrite ı yazamam ama diğerlerini yazarım fft de dahil olmak üzere ama belki dsp için kütüphane dosyası varsa dahada kolay olabilir C ye aktarmak niçin sordunuz?
  • maşşallah abicim matlab olayını iice çözmüşsünüz bize matlab dersinde (bir hafta sıkıştırılmış program) matris oluşturma girme türev integral çözme çarpma ters alma grafik çizme felan gösterdiler benim bilgler baya azmış...
  • Ben matematik bölümünde okuyorum.Fen edebiyat fak.3. sınıfa geçtim.Bu bilgilerin bana faydası olurmu?Biz matlab dersini görecekmiyiz?
  • biz elektronikçiler matlabı uzun ve karışık denklemleri çözmek ve genelde grafik çıkarmak için kullıyoruz sizde heralde matrisleri ve polinomları çözmek için kullanırsınız heralde...
  • Ok ben o zaman bir araştırayım.Eğer lazım bişeyse müdavinlerinden olurum bu topiğin.
  • çok yararlı bi program bence bilmende yarar var çok işine yarar özellikle bitime ödevinde felan mat öğretminliğinde okuyan bi arkadaşım 4. sınıfda alacakdı bu dersi belki sizde görürsünüz...
  • Eyvallah salagil.Çok sağolasın...
  • MATLAB ı elektronikçilerden -ekonomistlere kadar herkes kullanıyor bir şeyi matrisle ifade edebilirseniz MATLAB ın yapamayacağı şey yok onunlar merak ettiğiniz bişey varsa sorun bildiğim kadarıyla açıklarım



    < Bu mesaj bu kişi tarafından değiştirildi lftx -- 28 Ağustos 2005, 11:20:35 >
  • 
Sayfa: 12345
Sayfaya Git
Git
sonraki
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.