Soru sorBir sinyali diğer bir sinyal içerisinde aramak
kaanicyar tarafından 3 yıl önce soruldu

merhabalar.matlab üzerinden shazam uygulamasına benzer bir uygulama yapmaya çalışıyorum.uygulama şu şekilde olacak elimizde 10 tane ses örneği olduğunu varsayalım.bunları matlaba yüklüyoruz ardından bu seslerin herhangi birinin birebir aynısını yükleyerek en son yüklenen sinyalin öncekilerden hangisiyle eşleştiğini bulmaya çalışıyoruz.ben xcorr kullandım sinyalleri gözlemledim ancak bu gözlemlediklerim üzerinde hangisinin birebir aynısı olduğunu çıktı olarak vermesini istiyorum.ne önerirsiniz yardımcı olabilir misiniz?örnek olarak kodumu yazdım çıktıları da ekliyorum xcorr dan başka bir fonksiyon kullanmamı mı önerirsiniz yoksa buradan nasıl ilerleyebilirim yardımcı olursanız çok mutlu olurum.

[y,fs] = audioread('deneme.mp3');
[y2,fs2] = audioread('o1.mp3');
[y3,fs3] = audioread('o2.mp3');
[y4,fs4] = audioread('o3.wav');

y = y(:,1);
y2 = y2(:,1);
y3 = y3(:,1);
y4 = y4(:,1);

dt = 1/fs;
dt2 = 1/fs2;
dt3 = 1/fs3;
dt4 = 1/fs4;

t = 0:dt:(length(y)*dt)-dt;
t2 = 0:dt2:(length(y2)*dt2)-dt2;
t3 = 0:dt3:(length(y3)*dt3)-dt3;
t4 = 0:dt4:(length(y4)*dt4)-dt4;

figure(1);
subplot(2,1,1);
plot(t,y); xlabel('Seconds'); ylabel('Amplitude'); %time domain
subplot(2,1,2);
plot(psd(spectrum.periodogram,y,'Fs',fs,'NFFT',length(y)));%frequency domain

[C1,lag1] = xcorr(y,y2);
C1_new = C1./max(abs(C1(:)));
[C2,lag2] = xcorr(y,y3);
C2_new = C2./max(abs(C2(:)));
[C3,lag3] = xcorr(y,y4);
C3_new = C3./max(abs(C3(:)));

figure(2);
subplot(3,1,1);
plot(lag1/fs2,C1_new,'k');
subplot(3,1,2);
plot(lag2/fs3,C2_new,'k');
subplot(3,1,3);
plot(lag3/fs4,C3_new,'k');

3 Cevap
sayginer Yönetici tarafından 3 yıl önce cevaplandı

Merhaba,
Bu tarz uygulamalar için findsignal adında bir fonksiyon varmış. Belki aradığınız şey olabilir:

https://it.mathworks.com/help/signal/ref/findsignal.html

Ayrıca:

https://it.mathworks.com/matlabcentral/answers/499681-how-to-find-starting-point-of-one-signal-in-another

 

kaanicyar tarafından 3 yıl önce cevaplandı

bu fonksiyonu denedim ancak işlem süresi çok uzun sürüyor hatta sonuna kadar gelemeden kapatmak zorunda kaldım.acaba findsignal fonksiyonuna sinyallerimi yanlış bir şekilde mi gönderdim emin değilim.

sayginer Yönetici tarafından 3 yıl önce cevaplandı

İsterseniz aşağıdaki bağlantıdaki örnekleri inceleyin fonksiyonu daha iyi anlarsınız. Duruma göre de sinyalinizi kısaltarak belki yine deneyebilirsiniz. Arama işleminin uzun sürebilir diye düşünüyorum.