Uzm. Ody. Soner Türüdü

MATLAB ile Gerçek Zamanlı Ses Spektrogramı Oluşturma

MATLAB ile Gerçek Zamanlı Ses Spektrogramı Oluşturma

Merhaba, bugün sizlere MATLAB yazılımı ile gerçek zamanlı ses spektrogramı oluşturmayı göstereceğim.
Spektrogram, zamanla değişen bir sinyalin frekans spektrumunun görsel bir temsilidir.
Kaynak kodlar yazı sonunda mevcuttur.

Gerçek zamanlı ses spektrogramı oluşturmaktaki amacımız, mikrofon ile MATLAB veri girişi yapmak; FFT (Fast Fourier Transform – Hızlı Fourier Dönüşümü) ile sesimizin zaman ve frekans alanlarında gösterimini sağlamaktır. Ek olarak, yazı sonunda ıslık gibi konuşmaya göre daha tiz frekanslar içeren seslerin gösterimi için yapılacak modifikasyon yer almaktadır.

Bu tarz bir projeyi gerçekleştirebilmek için audiorecorder, getaudiodata, fft ve record komutlarının nasıl kullanılacağını bilmek önemlidir.

Bazı temel komutlardan bahsedecek olursak;

  • srate –> örneklem sayısıdır. Genellikle 44100 alınmaktadır.
  • ylim –> y-eksen sınırları ,  xlim –> x-eksen sınırları
  • Örnek linspace kullanımı –> linspace(1,11,6) –> 0 dan 11’e kadar eşit aralıklı 6 tane değer atar.
    linspace (1,11,6) –> 1 3 5 7 9 11
  • subplot (a,b,c) veya subplot (abc); a –> satır b –> sütun c –> konum
    a, b ve c değerlerini değiştirerek olayı daha iyi kavrayabilirsiniz
  • xlabel, ylabel –> x ve y eksenlerinde görünecek etiketler
  • title –> ilgili grafiğin başlığı
  • audiorecorder (fs,a,b) –> fs, örneklem sayısı;
    a, her örneklem için bit sayısı; b, kanal sayısı (1-mono, 2-stereo)
  • fft –> Fast Fourier Transform – Hızlı Fourier Dönüşümü
  • abs (x) –> mutlak değer alma. abs (-19)=19 gibi.

MATLAB yazılımında bilmediğiniz komutları ve işlevlerini, komut üzerine gelip sağ tıkladıktan sonra ya da komut penceresinde ‘open’ ve ‘help’  ile öğrenebilirsiniz. Örneğin audiorecorder komutu için, “help audiorecorder” yazarak bilgi alabilirsiniz.

%Gerçek Zamanlı Ses Spektrogramı Oluşturma
%Soner Türüdü

%Kayıt ve analiz parametreleri
srate = 44100/4;
time = 0:1/srate:1-1/srate;
n = length(time);
hz = linspace(0,srate,n);

% Çizimin oluşturulması
figure(1), clf

%Zaman alanı
subplot(211)
timeh = plot(time,zeros(n,1));
set(gca,’ylim’,[-1 1]/7)
xlabel(‘Zaman (sn.)’), ylabel(‘Amplitüd (dB)’)
title(‘Zamanı Alanı’)

%Frekans alanı
subplot(212)
freqh = plot(hz, zeros(n,1),’linew’,2);
set(gca,’xlim’,[0 500],’ylim’,[0 7]*1e-6)
xlabel(‘Frekans (Hz)’), ylabel(‘Güç’)
title(‘Frekans Alanı’)

%Ses kaydedici kurulumu
auddat = audiorecorder (srate,8,1);

%Kaydı başlatma ve arabellekte tutma
record (auddat);
pause(1.1);

%Ctrl-c ile çıkana kadar, projenin çalışmasını sağlama
while 1

%Bir önceki saniyeden veri alınması
data = getaudiodata (auddat);
data = data (end-srate+1:end);

%Çizimlerin güncel tutulması
set(timeh,’YData’, data);
set(freqh,’YData’, abs(fft(data)/n).^2);

pause(.1)
end

%Durdurma
%Burada hata verebilir. Fakat önemli değil, silebilirsiniz
%Ctrl-c kullanarak çıkacağız

stop(auddat);

Islık sesi için modifikasyon;
Bildiğiniz gibi ıslık sesi daha tiz bir sestir ve frekans alanını [0 500] ile sabit tutamayız.
Bu nedenle ilgili kod satırında [0 500] aralığını [0 2000] olarak değiştirebilirsiniz.

Yukarıdaki matlab kodlarına ve bundan sonra gelecek çalışmalara ulaşmak için aşağıdaki adresi ziyaret edebilirsiniz.
https://github.com/Odysonertrd/matlab_gercek_zamanli_spektrogram

Sorularınız ve katkılarınız için soner.turudu@gmail.com e-mail adresi üzerinden iletişime geçebilirsiniz.
Sonraki yazılarda görüşmek üzere.

BİR YORUM YAZIN

ZİYARETÇİ YORUMLARI - 10 YORUM

Henüz yorum yapılmamış.