En temel sinyal işleme komutları ve nota üretme

Matlab dilinin sunduğu basitlik sayesinde olabildiğindce bilgisayar kavramlarından soyutlanarak teorie odalanabiliyoruz. Bu komut satırları içinde basit sinyal işleme ve sinyal giriş çıkış komutları bulunmaktadır. Geçmişte matlab çok kısıtlı dosya formatlarını açıp,kaydedebiliyordu ve fonksiyonlarda ona göre yapılmıştı. Günümüzde yeni dosya formatları için ayrı ayrı fonksiyon yazmak yerine audioread, audiowrite yada audiorecorder, audioplayer gibi basit komutlarla sinyal giriş çıkışı yapılabiliyor.

soundsc
Belkide bir çoğunuz soundsc(ses, fsampling) ile sesi çaldırıp durduramıyorsunuzdur. Aslında çok basit bir çözümü var: "clear sound" ile çalan ses durduruabiliyor.

audioplayer
Daha iyisi player = audioplayer(ses, fsampling); play(player); istersen pause(player); ile duraklatabilir, stop(player); ile kapatabilirsiniz.

audiorecorder
Ses kaydı için r = audiorecorder(44100, 16, 2); record(r); iyi ve basit bir seçenek. En iyi şekli 44.1khz yaparak kaydetmek olacaktır. Parametresiz olursa varsayılan frekans olan 8khz kullanır ve kötü bir kayıt olur.
getaudiodata ile kodlanmış olan ses açılır ve işlenebilir hâle gelir. stop(r); play(r); y=getaudiodata(r); fSampling=r.SampleRate;

Nota oluşturmaya gelirsek. Do, Re, Mi, Fa, Sol, La, Sİ frekansları [524 588 660 698 784  880 988] ile verilir ve müzik aletlerine dikkat ederseniz notalar sürekli salınım yapan dalgalardan oluşur. Sürelki salınım yapan benzer dalga sin ve cos vardır ve frekans düzleminde iki çizgi olarak görünür yani tek sese karşılık gelirler. Aralarında 90 derecelik faz farkı vardır.
Eğer bu notalardan müzik yapmak isterseniz notaları [ ] içinde sıralayın ve 44.1khzde çaldırın. expAttenCst değiştirerek notayı farklı bir aletten geliyor gibi hissettirebilirsiniz.
11 satırda nota üretimi.
fsampling=4000;
t=0:1/fsampling:0.35;
%       Do  Re  Mi  Fa  Sol  La  Si
fnotes=[524 588 660 698 784  880 988];
expAttenCst=6;
note=[];
for i=each(fnotes)
notes=(expAttenCst/6)*sin(2*pi*(t*i+rand));
notes=notes.*exp(-abs(expAttenCst*t));
note=[note, notes]; % aslında önceden hafızada yer ayrılmış olursa daha hızlı çalışır.
end
%soundsc(notes, fsampling) ile çalarsan 'clear sound' komutu işe yarıyor.
player = audioplayer(note, fsampling);
play(player)


Basit frekans düzlemi grafik çizdirimi:
fsampling=8000;
A=2;
t=-0.005:1/fsampling:0.005;
F0=262;
phase=pi/4;
xt=A*sin(2*pi*F0*t+phase);  %rectpuls(t,0.04);
stem(t,xt)
xlabel('t')
ylabel('x(t)')
title('Time Domain')
nfft=1024;
XT=fft(xt,nfft);
magXT=fftshift(abs(XT));
phaseXT=fftshift(unwrap(angle(XT)));

faxis=-fsampling/2:fsampling/1024:fsampling/2-fsampling/1024;

figure
subplot(2,1,1)
plot(faxis,magXT)
title('fft magnitude')
xlabel('Hz frequency')
ylabel('|XT(F)|')
subplot(2,1,2)
plot(faxis,phaseXT)
title('fft phase')
xlabel('Hz frequency')
ylabel('phase XT(F)')

figure('Name','freqz of xt');
%db olarak sinyalin yada filternin tepkisini bulur.
freqz(xt,1,nfft,fsampling) % [Xf,f]=freqz(xt,1,nfft,fsampling);
spectrogram(xt)





KODALARIN TAMAMI:

A=2;
F0=300;
phase=pi/4;
fsample=[2*(100:100:700), 8000];
%% sin ve nyquist kriteri
figure('Name','sin');
for i=1:numel(fsample)
t=-1:1/fsample(i):1;
xt=A*sin(2*pi*F0*t+phase);
subplot(4,2,i);
stem(t,xt);
hold on
plot(t,xt);
axis([-0.38 0.38 -2 2]);
title(['sin(2*pi*F0*t+phase), F0=',num2str(F0),'hz, phase=',num2str(phase),' Fsample=',num2str(fsample(i))])
xlabel('t')
ylabel('sin(2*pi*F0*t+phase)')
legend('stem','plot')
end
%% sawtooth ve nyquist kriteri
figure('Name','sawtooth');
for i=1:numel(fsample)
t=-1:1/fsample(i):1;
xt=A*sin(2*pi*F0*t+phase);
subplot(4,2,i);
stem(t,xt);
hold on
plot(t,xt);
axis([-0.38 0.38 -2 2]);
title(['sin(2*pi*F0*t+phase), F0=',num2str(F0),'hz, phase=',num2str(phase),' Fsample=',num2str(fsample(i))])
xlabel('t')
ylabel('sin(2*pi*F0*t+phase)')
legend('stem','plot')
end
%% sinc ve nyquist kriteri
% sinc fonksiyonunun ana lobunun genişliği T0=1/F0 kadardır
figure('Name','sinc');
for i=1:numel(fsample)
t=-1:1/fsample(i):1;
xt=A*sinc(2*pi*F0*t);
subplot(4,2,i);
stem(t,xt);
hold on
plot(t,xt);
axis([-0.38 0.38 -2 2]);
title(['sin(2*pi*F0*t+phase), F0=',num2str(F0),'hz, phase=',num2str(phase),' Fsample=',num2str(fsample(i))])
xlabel('t')
ylabel('sin(2*pi*F0*t+phase)')
legend('stem','plot')
end
%% square ve nyquist kriteri
figure('Name','square');
for i=1:numel(fsample)
t=-1:1/fsample(i):1;
xt=A*square(2*pi*F0*t);
subplot(4,2,i);
stem(t,xt);
hold on
plot(t,xt);
axis([-0.38 0.38 -2 2]);
title(['sin(2*pi*F0*t+phase), F0=',num2str(F0),'hz, phase=',num2str(phase),' Fsample=',num2str(fsample(i))])
xlabel('t')
ylabel('sin(2*pi*F0*t+phase)')
legend('stem','plot')
end
%% rand(uniform) ve randn(gauss) gürültü oluşturmada kullanılabilir.
gNoise=rand(1,1e6);
figure;
ax1=subplot(2,1,1);
histogram(gNoise,100)
title('rand(Uniform dağıtım)')
ax2=subplot(2,1,2);
gNoise=randn(1,1e6);
histogram(gNoise,100)
title('randn(Gaussian dağıtım)')
linkaxes([ax1,ax2],'xy')
%% downsample
A=2;
F0=300; %hz
phase=pi/4;
fsamp=8000; %300hz için çok yüksek. 2 katından biraz yüksek olması yeterli
T=-1:1/fsamp:1;

XT=A*sinc(2*pi*F0*T+phase);
stem(T,XT)
axis([-0.01 0.01 -0.5 2])
XTdown=downsample(XT,4);
Tdown=downsample(T,4);
hold on
stem(Tdown,XTdown,'r');
%% notalar
clear; clc;

fsampling=4000;
t=0:1/fsampling:0.35;
%       Do  Re  Mi  Fa  Sol  La  Si
fnotes=[524 588 660 698 784  880 988];
expAttenCst=6;
note=[];
for i=each(fnotes)
notes=(expAttenCst/6)*sin(2*pi*(t*i+rand));
notes=notes.*exp(-abs(expAttenCst*t));
note=[note, notes]; % aslında önceden hafızada yer ayrılmış olursa daha hızlı çalışır.
end
%soundsc(notes, fsampling) ile çalarsan 'clear sound' komutu işe yarıyor.
player = audioplayer(note, fsampling);
play(player)
%% Sound I/O audiorecorder
r = audiorecorder(44100, 16, 2); % en iyi şekli budur. parametresiz olursa varsayılan frekans olan 8khz kullanır ve kötü bir kayıt olur.
record(r);
stop(r); play(r); y=getaudiodata(r); fSampling=r.SampleRate;
figure('Name','audiorecorder(44100, 16, 2)')
subplot(2,1,1)
plot(y);
subplot(2,1,2)
plot(abs(fftshift(fft(y))))
% sesi dosyaya yazma.
audiowrite('Myrecord.wav',y,fSampling);
which Myrecord.wav
[x,fs]=audioread('Myrecord.wav');
soundsc(x,fs)
%% fft frekans düzleminde sinyaller
fsampling=8000;
A=2;
t=-0.005:1/fsampling:0.005;
F0=262;
phase=pi/4;
xt=A*sin(2*pi*F0*t+phase);  %rectpuls(t,0.04);
stem(t,xt)
xlabel('t')
ylabel('x(t)')
title('Time Domain')
nfft=1024;
XT=fft(xt,nfft);
magXT=fftshift(abs(XT));
phaseXT=fftshift(unwrap(angle(XT)));

faxis=-fsampling/2:fsampling/1024:fsampling/2-fsampling/1024;

figure
subplot(2,1,1)
plot(faxis,magXT)
title('fft magnitude')
xlabel('Hz frequency')
ylabel('|XT(F)|')
subplot(2,1,2)
plot(faxis,phaseXT)
title('fft phase')
xlabel('Hz frequency')
ylabel('phase XT(F)')

figure('Name','freqz of xt');
%db olarak sinyalin yada filternin tepkisini bulur.
freqz(xt,1,nfft,fsampling) % [Xf,f]=freqz(xt,1,nfft,fsampling);
spectrogram(xt)

Yorumlar

Popüler Yayınlar