Skip to main content

İçerik

SORU 1

kokler01 isimli bir fonksiyon yazın. Fonksiyon giriş olarak sembolik bir polinom fonksyon (f) almalı ve çıktı olarak sırasıyla aşağıdakileri vermelidir:

  • Polinomun tüm kökleri (S)
  • Polinomun gerçek kökleri (Sreal). Eğer gerçek kök yoksa Sreal boş bir vektör olmalıdır.
  • Gerçek köklerden polinoma çizilen teğetlerin denklemleri (fm). Eğer gerçek kök yoksa fm boş bir vektör olmalıdır.
  • Fonksiyonun belli bir aralıktaki integrali (intf). Eğer fonksiyonun iki veya daha fazla gerçek kökü varsa bu aralık en küçük ve en büyük köklerin arasındaki kısımdır. Eğer ikiden az gerçek kök varsa bu aralık [-1, 1] aralığı olarak alınmalıdır.

Fonksiyon ayrıca iki adet şekil çizmelidir. Şekiller iki ayrı pencerede olmalıdır, yani birincisini silip üzerine ikinicisi çizdirmemelidir. Şekillerin içeriği:

  • Birinci şekilde fonksiyon kendisi çizdirilmeli, kökleri fonsiyon üzerinde işaretlenmeli ve teğet çizgileri gösterilmelidir. Şeklin başlığında fonksiyonun denklemi yazmalıdır. Çizimin sınırları tüm kökler ve teğetler net ve açık görülecek şekilde otomatik olarak ayarlanmalıdır. Eğer hiç gerçek kök yoksa çizim [-2,2] aralığında yapılabilir.
  • İkinci şekilde fonksiyonun kendisi çizdirilmeli, yukarıdaki tanıma göre integral alınan aralık gösterilmeli ve bu aralıkta fonksiyonun altında kalan alanlar sarı renkte doldurulmalıdır. İntegralin hangi aralıkta alındığı ve çıkan sayısal değer de şeklin başlığında belirtilmelidir. Çizimin sınırları integral alınan bölge açıkça görülecek şekilde otomatik olarak ayarlanmalıdır.

SORU 1’deki fonksiyonun örnek kullanımı 1

syms x % Sembolik değişken
f = 4*x^3  - 20*x^2 + 10; % Polinomu oluştur
[S,Sreal,fm,intf] = kokler01(f) % Fonksiyonu çağır
S =

   4.8957 + 0.0000i
  -0.6643 + 0.0000i
   0.7687 - 0.0000i

Sreal =

   -0.6643
    0.7687
    4.8957

fm =

 31.870171391168089058965051663108*x + 21.172857398498900688032223083611
 18.183429955571252037526158297743 - 23.656205757322130267539250780828*x
 91.786034366153984365155338309705*x - 449.35628735406985405209132739067

intf =

 -154.3535

Not: Fonksiyonun üç tane gerçek kökü olduğu için ikinci şekildeki integralin en küçük kök -0.6643 ve en büyük kök 4.8957 arasında alınmış olduğuna dikkat edin.

SORU 1’deki fonksiyonun örnek kullanımı 2

syms x % Sembolik değişken
f = x^2+x+1; % Polinomu oluştur
[S,Sreal,fm,intf] = kokler01(f) % Fonksiyonu çağır
S =

  -0.5000 - 0.8660i
  -0.5000 + 0.8660i

Sreal =

   Empty matrix: 0-by-1

fm =

[ empty sym ]

intf =

    2.6667

Not: Fonksiyonun ikiden az gerçek kökü olduğu için (hiç yok) ikinci şekildeki integralin % -1 ve 1 arasında alınmış olduğuna dikkat edin.

SORU 1’deki fonksiyonun örnek kullanımı 3

syms x % Sembolik değişken
f = x^3 + 2*x^2 + 4*x - 2; % Polinomu oluştur
[S,Sreal,fm,intf] = kokler01(f) % Fonksiyonu çağır
S =

   0.4026          
  -1.2013 - 1.8773i
  -1.2013 + 1.8773i

Sreal =

    0.4026

fm =

6.096839541815825214143842458725*x - 2.4547579524634561035858813423557

intf =

   -2.6667

Not: Fonksiyonun ikiden az gerçek kökü olduğu için (bir tane var) ikinci şekildeki integralin -1 ve 1 arasında alımış olduğuna dikkat edin. bakımından çıkması beklenen sonuçlar verilmiştir.

SORU 2

MATLAB’a standart ses dosyalarındaki ses sinyallerini yüklemek ve onlar üzerinde işlemler yapmak mümkündür. Bu soruda basit ses sinyalleri üzerinde bazı işlemler yapacağız.

Öncelikle Giris01.wav dosyasını MATLAB’da şu anda bulunduğunuz çalışma klasörüne kaydedin. (Linkin üzerine sağ tıklayıp, Farklı Kaydet diyebilirsiniz).

Aşağıdaki komutları çalıştırmadan önce dosyayı kaydettiğiniz klasörde çalıştığınızdan mutlaka emin olun. Eğer yanlış klasörde olursanız dosyanın bulunamadığına dair hatalar alırsınız. (Hatırla: MATLAB ekranının üst tarafındaki Current Folder isimli alandan çalışma klasörünüzü görebilir ve değiştirebilirsiniz.)

MATLAB’a WAV formatında ses dosyası yüklemek için wavread komutu kullanılır. Aşağıdaki Giris01.wav dosyasının içindeki ses sinyali s değişkenine, sesin örnekleme frekansını fs değişkenine, örnek başına kullanılmış olab bit sayısını da nb değişkenine alır. (Aslında nb değişkenine bu ödev için ihtiyacımız olmayacak).

[s,fs,nb] = wavread('Giris01.wav');

Okumuş olduğumuz ses sinyalini sound komutu ile dinleyelelim. Bu sinyal bu ödev için oluşturmuş olduğum basit bir ses sinyali olup, birkaç farklı frekansta sinüs sinyalinin birleşimidir.

sound(s,fs);

Ödevin bu kısmında sizden istenen, filtrele01 isimli bir fonksiyon yazmanız olup, fonksiyonun girileri sırasıyla aşağıdaki gibi olmalıdır:

  • Filtrelenecek giriş sinyali (s)
  • Örnekleme frekansı (fs)
  • Sinyalin içindeki farklı frekaslar arasındaki mesafe bilgisi (fAra). Bu soru için fAra = 100 Hz farz edeceğiz. Şu durumda s’nin içindeki farklı sinüs sinyallerinin frekansları arasında en az 100 Hz olmalıdır. Mesela s’nin içinde 500 Hz’lik bir sinyal varsa o zaman [400 Hz, 600 Hz] aralığında başka bir sinüs olamaz, 1000 Hz’lik bir sinüs varsa o zaman [900 Hz, 1100 Hz] aralığında başka sinüs olamaz vs.
  • Sinyale yapılması istenilen işlemi belirten parametre (is).

is parametresi fonskiyonun yapacağı iş ve çıkışını belirler. Şöyle ki:

  • Eğer is = 0 ise: Giriş sinyali s içindeki en güçlü (genliği en falza olan, dolayısıyla FFT’de kendisine karşılık gelen büyüklük en fazla olan) bileşeni bularak bu bileşeni bastıracak bir filtreleme işlemi yapmalıdır. Filtreleme sonucunda bu bileşen en az 40 dB bastırılmalıdır. Sinyalin içindeki diğer bileşenler olduğu gibi korunmalıdır. Filtrelenmiş sinyal, fonksiyonun çıkış değişkeni (y) olarak döndürülmelidir.
  • Eğer is = 1 ise: Giriş sinyali s içindeki en güçlü (genliği en falza olan, dolayısıyla FFT’de kendisine karşılık gelen büyüklük en fazla olan) bileşeni bularak bu bileşen dışındaki tüm bileşenleri bastıracak bir filtreleme işlemi yapmalıdır. Bastırılacak bileşenler en az 40 dB azalmalıdır. Korunacak olan en güçlü bileşen ise olduğu gibi kalmalı ve herhangi bir azalmaya uğramamalıdır. Filtrelenmiş sinyal, fonksiyonun çıkış değişkeni (y) olarak döndürülmelidir.

Fonksiyon ayrıca üç adet şekil çizmelidir. Şekiller üç ayrı pencerede olmalıdır, yani öncekini silip yenisi üzerine çizdirmemelidir. Şekillerin içeriği:

  • Birinci şekilde kullanılan filtrenin frekans cevabı (Bode çizgesi) yer almalıdır.
  • İkinci şekilde Giriş ve Çıkış sinyalleri üst üste çizdirilmelidir.
  • Üçüncü şekilde iki ayrı alt şekil (subplot) olmalı, üstteki alt şekilde girişin FFT katsayılarının büyüküğü, alttaki şekilde de çıkışın FFT katsayılarının büyüklüğü yer almalıdır.

SORU 2’deki fonksiyonun örnek kullanımı 1

[s,fs,nb] = wavread('Giris01.wav'); % Sinyali ve örnekleme frekansını al
fAra = 100; % Bileşenler arasındaki frekans ayrımı

is = 0; % En güçlü bileşeni bastırma işini seç
y = filtrele01(s,fs,fAra,is); % Fonksiyonu çağır

İstersek filtrelenmiş sinyali dinleyebilir ve başka bir WAV dosyasına yazdırabiliriz:

sound(y,fs); % Çıkış sinyalini dinle
wavwrite(y,fs,16,'Cikis011.wav'); % Çıkışı Cikis01.wav dosyasına yazdır.

SORU 2’deki fonksiyonun örnek kullanımı 2

[s,fs,nb] = wavread('Giris01.wav'); % Sinyali ve örnekleme frekansını al
fAra = 100; % Bileşenler arasındaki frekans ayrımı

is = 1; % En güçlü bileşen dışındakileri bastırma işini seç
y = filtrele01(s,fs,fAra,is); % Fonksiyonu çağır

İstersek filtrelenmiş sinyali dinleyebilir ve başka bir WAV dosyasına yazdırabiliriz:

sound(y,fs); % Çıkış sinyalini dinle
wavwrite(y,fs,16,'Cikis012.wav'); % Çıkışı Cikis01.wav dosyasına yazdır.

SORU 2’deki fonksiyonun örnek kullanımı 3

Fonksiyonumuzu denemek için ona rastgele test girişleri üreten bir fonksiyon yazılabilir. Örneğin testSinyaliUret01.m fonksiyonunu çalışma klasörünüzün içine indirin.

Bu fonksiyonu kullanarak bir test sinyali üretip fonksiyonumuza giriş olarak verelim. (Bu işlem dilendiği kadar tekrarlanabilir, her seferinde farklı bir sinyal üretecektir).

fs = 8000; % Örnekleme frekansı
fAra = 100; % Bileşenlerin frekansları arasındaki mesafe
Tmax = 1; % Sinyalin bitiş zamanı

s = testSinyaliUret01(fs,fAra,Tmax); % Test sinyali üret
is = 1; % En güçlü bileşen dışındakileri bastırma işini seç
y = filtrele01(s,fs,fAra,is); % Fonksiyonu çağır
sound(y,fs); % Çıkış sinyalini dinle

BONUS SORU

ayikla01 isimli bir fonksiyon yazın. Fonksiyonun girdileri sırasıyla aşağıdaki gibi olmaldır:

  • Filtrelenecek giriş sinyali (s). Bu sinyal birkaç tane sinüsoidal sinyalin toplamıdır. (Kaç tane sinüsün toplamı olduğu önceden bilinmiyor).
  • Örnekleme frekansı (fs)
  • Sinyalin içindeki farklı frekaslar arasındaki mesafe bilgisi (fAra). Bu soru için fAra = 100 Hz farz edeceğiz. Şu durumda s’nin içindeki farklı sinüs sinyallerinin frekansları arasında en az 100 Hz olmalıdır. Mesela s’nin içinde 500 Hz’lik bir sinyal varsa o zaman [400 Hz, 600 Hz] aralığında başka bir sinüs olamaz, 1000 Hz’lik bir sinüs varsa o zaman [900 Hz, 1100 Hz] aralığında başka sinüs olamaz vs.
  • Sinyalin içindeki bileşenlerin sahip olabileceği minimum genlik (minGenlik). Bu soru için minGenlik = 0.01 alacağız. Şu durumda s’nin içindeki bileşenlerden hiçbirinin genliğinin 0.01’den küçük olmadığı bilgisi bize verilmiş oluyor. Mesela s’nin içinde 0.005*sin(2*pi*200*t) gibi bir bileşen olamaz.

Fonksiyonun çıkışları sırasıyla aşağıdaki gibi olmalıdır:

  • Giriş sinyalini içinde bulunan bileşenlerin frekanslarından oluşan vektör (fo)
  • Giriş sinyali içinde bulunan bileşenlerden oluşan bir matris (yo). Matrisin her sütünu bir bileşene karşılık gelmektedir. Örneğin fo(1) frekansındaki bileşen yo(:,1), fo(2) frekansındaki bileşen yo(:,2) … şeklinde verilmelidir.

Fonksiyon ayrıca iki adet şekil çizmelidir. Şekiller iki ayrı pencerede olmalıdır, yani birincisini silip üzerine ikinicisi çizdirmemelidir. Şekillerin içeriği: * Birinci şekilde sinyali oluşturan bileşenler üst üste çizilmelidir. Zaman aralığı olarak sinyallerin rahatça görülebileceği birkaç periyotluk zaman seçilerek bu aralıkta çizim yapılmalıdır. * İkinci şekilde sinyalin FFT’sinin büyüklüğü çizilmeli ve bileşenlerinin frekanslarına karşılık gelen tepeler X ile işaretlenmelidir.

BONUS SORU’daki fonksiyonun örnek kullanımı 1

[s,fs,nb] = wavread('Giris01.wav'); % Sinyali ve örnekleme frekansını al
fAra = 100; % Bileşenler arasındaki frekans ayrımı

Ts = 1/fs; % Örnekleme periyodu
Tmax = Ts*(length(s)-1); % Maksimum zaman
t = 0:Ts:Tmax; % Zaman vektörü oluştur
minGenlik = 0.01; % Bileşenlerin sahip olabileceği en küçük genlik

[fo, yo] = ayikla01(s,fs,fAra,minGenlik); % Fonksiyonu çağır

whos fo yo % Fonksiyon çıktılarını boyutlarını görelim
  Name         Size             Bytes  Class     Attributes

  fo           1x3                 24  double              
  yo        8001x3             192024  double

BONUS SORU’daki fonksiyonun örnek kullanımı 2

Test sinyali üretmek için yine testSinyaliUret01.m fonksiyonumuzu kullanalım: (Bu işlem dilendiği kadar tekrarlanabilir, her seferinde farklı bir sinyal üretecektir).

fs = 8000; % Örnekleme frekansı
fAra = 100; % Bileşenlerin frekansları arasındaki mesafe
Tmax = 1; % Sinyalin bitiş zamanı

s = testSinyaliUret01(fs,fAra,Tmax); % Test sinyali üret
[fo, yo] = ayikla01(s,fs,fAra,minGenlik); % Fonksiyonu çağır

whos fo yo % Fonksiyon çıktılarını boyutlarını görelim
  Name         Size             Bytes  Class     Attributes

  fo           1x7                 56  double              
  yo        8001x7             448056  double

İstersek fonksiyonun ayıklamış olduğu bileşenleri sırasıyla dinleyebiliriz. Bunun için aşağıdaki kod kullanılabilir:

h = waitbar(0,'Bileşenler çalınıyor...'); % Bekleme çubuğu
for i = 1:length(fo)

    % i. bileşeni çal, bekleme çubuğunu kullarak hangi bileşenin çalındığını
    % ve frekansını belirt, çubuğu ilerlet.
    sound(yo(:,i),fs);
    waitbar(i/length(fo),h,['Bileşen ',num2str(i),' çalınıyor... (',num2str(fo(i)),' Hz)']);

end
pause(Tmax); % Son bileşenin çalınmasının bitmesini bekle
close(h); % Bekleme çubuğunu kapat.

BAZI NOTLAR

sound komutuyla ses sinyallerini çalarken bazı frekanstaki seslerin çıkmadığını veya kısık çıktığını fark edebilirsiniz, bu normaldir. Bu durum bilgisayarınızda bulunan hoparlörlerin kapasitesi ile ilgilidir. Düşük frekanslı (bas) sesleri çıkarmak daha zordur ve bunlar için daha büyük ve güçlü hoparlörler gerekir. Genellikle dizüstü bilgisayarlardaki standart hoparlörler 400 Hz’in altındaki sesleri çok iyi çıkartamazlar. Normal masaüstü bilgisayarlardaki hoparlörler ile muhtemelen 250 Hz ve üstündeki sesleri alabilirsiniz. 250 Hz’in altındaki sesler ise eğer buna uygun özel ses donanımınız yoksa (subwoofer) çıkmayacaktır. Subwoofer’ınız varsa muhtemelen 30 Hz’e kadar olan sesleri alabilirsiniz.

ÇÖZÜM

Soruların Çözümleri