MATLAB: Belli bir örnekleme hızı ile sinüs oluşturmak

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
21,557
MATLAB, dijital olarak örneklenmiş ses üzerinde çalışmak için çok zengin olanaklar sunmaktadır. Bu konu ile, en temel konulardan birisi olan, belli bir örnekleme hızına sahip bir sinüs sinyalin elde edilmesi ve görüntülenmesini ele alacağız.

Örnekleme hızı 44.1 kHz ve 2 saniyelik bir sinüs sinyalı oluşturacağız, o yüzden tüm zaman noktalarını içeren bir tablo oluşturuyoruz.

Kod:
>> t = 0:1/44100:2;
>>
>> t(1:10)

ans =

   1.0e-03 *

         0    0.0227    0.0454    0.0680    0.0907    0.1134    0.1361    0.1587    0.1814    0.2041


Tablomuzu görüntüleyince, 22.7 µs, 45.4 µs şeklinde mutlak örnekleme zamanlarını içerdiğini görüyoruz.
 
Bunun benim enkoder mantığıyla bir alakası var mı abi? :cheeky1:
 
Tablonun son 10 değerine bakınca da en sonunda 2 saniye anını görüyoruz.

Kod:
>> t(end - 10:end)

ans =

    1.9998    1.9998    1.9998    1.9998    1.9999    1.9999    1.9999    1.9999    2.0000    2.0000    2.0000


Değerlerin eşit olduğuna bakmayın, o MATLAB'in görüntüleme çözünürlüğü ile ilgili. Tam çözünürlükle görüntülenince her birisinin ayrı bir zaman olduğu anlaşılıyor.

Kod:
>> format long
>> t(end - 10:end)

ans =

  Columns 1 through 7

   1.999773242630386   1.999795918367347   1.999818594104308   1.999841269841270   1.999863945578231   1.999886621315193   1.999909297052154

  Columns 8 through 11

   1.999931972789116   1.999954648526077   1.999977324263039   2.000000000000000

>>
 
Sonra da t anlık zamanlarına karşılık gelen sinüs fonksiyon değerlerini hesaplatıyoruz. Burada örnek olarak genliği 310, frekansı da 50 olan bir sinüs oluşturuyoruz (şebeke voltajı)

Kod:
>> w = 310 * sin(2 * pi * 50 * t);
>>
 
Sonra da sinyalin grafiğini çizdiriyoruz:

Kod:
>> plot(w);
>>

Ve MATLAB bize elde ettiğimiz sinüs sinyalinin grafiğini çiziyor

1590676679152.png
 
Şimdi bu şekilde üretilmiş olan bir sinüs dalgasını bir ses dosyası olarak kaydedeceğimiz zaman ne yapmalıyız? Öncelikle, sinüsü oluştururken maksimum genliği 1.0 diye düşünmeliyiz. Buradaki 1.0 , analog bir değerdir. Ama herhangi bir voltaja karşılık gelmemektedir. Sadece "ifade edilebilecek en büyük değer" anlamına gelmektedir. Bu 1.0 değerinin dijital ortamda karşılığı, kullanılan dijital/analog dönüştürücünün bit sayısına göre değişecektir. 8 Bitlik DAC için 1.0 değeri, DAC'a binary olarak 11111111 sayısının verilmesidir. 16 bitlik DAC için 1.0 değeri, DAC'a binary olarak 1111111111111111 sayısının verilmesidir. DAC çıkışındaki analog voltaj, DAC'ın referans voltajı, DAC çıkışındaki antialiasing filtresinin zayıflatması, filtre sonrasındaki yükseltecin kazancı gibi faktörlere göre değişecektir.

Ama sinüsü üretirken 1.0 dan daha düşük bir genlik verebiliriz. Örneğin maksimum değere göre -3 dB zayıflatılmış bir sinüs üretmek için şu ifadeyi kullanabiliriz:

Kod:
>> w = db2mag(-3) * sin(2 * pi * 50 * t);
>>
 
Bu şekilde sinüs sinyalimizi ürettikten sonra, bu ses sinyalini dijital olarak dosyaya kaydedebiliriz. MATLAB bu veriyi doğrudan belli formatlarda (mesela wav, mp3 gibi) kaydedilmesine izin verse de, bence en iyi yol, ses verisini diske RAW olarak kaydetmek. Yani dosyada sadece ses örnekleri olacak, herhangi bir metadata veya başka ilave bilgi olmayacak. Bir kere elde RAW dosya varsa, Linux veya diğer işletim sistemlerinde bulunan çok daha gelişmiş programlar kullanılarak istenen formatta dosya elde edilebilir. MATLAB'in asıl işi ses üretmek olmadığı için, değişik formatlarda ses dosyası üretme konusunda sunacağı seçenekler, tamamen bu konuda uzmanlaşmış olan başka programlar kadar iyi olmayacaktır.

Benzer şey örneğin fotoğrafçılıkta da vardır. Profesyonel fotoğraf makinalarının ürettiği görüntü dosyası RAW formattadır ve görüntü sensörünün sağlayabildiği en üst seviyede çözünürlük ve kalite ile piksel değerlerini içerir. Sonradan fotoğrafçı, uygulama alanına göre bu RAW dosyayı işler ve JPG, GIF, veya PNG gibi diğer formatlarda görüntü dosyaları elde eder.

Aşağıda bir tabloda bulunan dijital ses örneklerini RAW olarak audio.raw isimli dosyaya yazan bir MATLAB fonksiyonu var:

Kod:
function create_audio_raw(dirname, data, channels, bitspersample, endianness)

if bitspersample == 8
    scale = 2^7 - 1;
    prec = 'bit8';
elseif bitspersample == 16
    scale = 2^15 - 1;
    prec = 'bit16';
elseif bitspersample == 24
    scale = 2^23 - 1;
    prec = 'bit24';
else
    return
end

data = data * scale;

mkdir(dirname);
prevdir = cd(dirname);
fid = fopen('audio.raw', 'w+');
fwrite(fid, data, prec, endianness);
fclose(fid);
cd(prevdir)

Bu fonksiyon, verilen argümanlara göre audio.raw diye bir dosya üretecektir. Sırasıyla şu argümanları veriyoruz:

dirname: RAW ses dosyasının yazılacağı dizinin adı.

data: ses örneklerini içeren tablo. Mesela yukarıda sinüsü üretip w tablosuna yazmıştık.

channels: Kanal sayısı. Mono için 1, stereo için 2, daha fazla kanal varsa artık kanal sayısı neyse onu belirteceğiz.

bitspersample: Her ses örneği kaç bitten oluşuyor? Ses kalitesine göre bu 8, 16, ve 24 bittir. Yaygın kullanılmasa da 32 bit de olabilir.

endianness: Bu ses dosyasının çalınacağı işlemcinin byte sırasını ifade eder. Little endian için l big endian için de b olabilir.
 
Bu şekilde RAW ses dosyası elde edildikten sonra, değişik işletim sistemlerinde kullanılan ses işleme paket programları ile istenen başka formatta ses dosyaları elde edilebilir. Linux için ben SOX isimli ses işleme programını kullanıyorum. Oluşturulacak ses dosyası üzerinde neredeyse sınırsız manipulasyon imkanı veriyor ve değişik formattaki dosyalara eklenecek metadata konusunda da neredeyse full kontrol sağlıyor.

Bu şekilde 11.025 kHz, 8 bitten başlayıp, 192 kHz, 24 bite kadar örnekleme ve bit genişliğine sahip sinüs dalgalarını ürettirmiştim ve bunları da WAV olarak kaydetmiştim. Şimdi bunları kullanarak ses kartı hardware'i ve kartın aygıt sürücüsünün geliştirilmesinde test amaçlı kullanıyorum. En yaygın test ettiğim formatlar şunlar:

44.1 kHz 16 bit
44.1 kHz 24 bit
48 kHz 16 bit
48 kHz 24 bit
88.2 kHz 24 bit
96 kHz 24 bit
176.4 kHz 24 bit
192 kHz 24 bit
 

Benzer konular

Çevrimiçi üyeler

Forum istatistikleri

Konular
5,659
Mesajlar
97,346
Üyeler
2,438
Son üye
İbrahimSönmez

Son kaynaklar

Son profil mesajları

cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Kesici/Spindle hızı hesaplamak için SpreadSheet UDF'leri kullanın, hesap makinesi çok eski kalan bir yöntem :)
Dr. Bülent Başaran,
Elektrik ve Elektronik Mühendisi
Yonga Tasarım Özdevinimcisi
Üç güzel "çocuk" babası
Ortahisar/Ürgüp/Konya/Ankara/Pittsburgh/San Francisco/Atlanta/Alaçatı/Taşucu...

Back
Top