Çapraz korelasyon kullanarak osiloskop sinyallerinin zaman gecikmesi tahmini


12

Bir oskoptan 2 sinyal kaydettim. Şuna benziyorlar: resim açıklamasını buraya girin

Matlab'da aralarındaki gecikmeyi ölçmek istiyorum. Her sinyalin örnekleme frekansı 2001000.5 olan 2000 örneği vardır.

Veriler bir csv dosyasındadır. Şimdiye kadar sahip olduğum şey bu.
Csv dosyasındaki zaman verilerini sildi, böylece csv dosyasında sadece voltaj seviyeleri var.

x1 = csvread('C://scope1.csv');
x2 = csvread('C://scope2.csv');  
cc = xcorr(x1,x2);
plot(cc);  

Bu şu sonucu verir: resim açıklamasını buraya girin

Okuduğum kadarıyla, bu sinyallerin çapraz korelasyonunu almam gerekiyor ve bu bana zaman gecikmesi ile ilgili bir zirve vermeli. Ancak bu sinyallerin çapraz korelasyonunu aldığımda 2000'de doğru olmadığını bildiğim bir zirve elde ediyorum. Çapraz bağıntı yapmadan önce bu sinyallere ne yapmalıyım? Sadece bir yön arıyorum.

EDIT: DC ofset kaldırdıktan sonra bu şimdi alıyorum sonucudur:
resim açıklamasını buraya girin

Daha tanımlanmış bir zaman gecikmesi elde etmek için bunu temizlemenin bir yolu var mı?

DÜZENLEME 2: İşte dosyalar:
http://dl.dropbox.com/u/10147354/scope1col.csv
http://dl.dropbox.com/u/10147354/scope2col.csv


Tam olarak, çapraz korelasyonu nasıl yapıyorsunuz? Doğrudan sorunuza yanıt olarak, çapraz korelasyondan önce sinyallerinize bir şey yapmanıza gerek yoktur, ancak bazı durumlarda filtreleme ilk önce sonuçları bozabilecek gürültüden kurtulmaya yardımcı olur.
Jim Clay

1
Lütfen kullandığınız kodu ve daha da önemlisi çapraz korelasyon sinyalinin bir grafiğini gönderin. Bazı araçlar / kütüphaneler (lag = 0) puanını grafiğin ortasına koyar; Matlab'ın bunu yapıp yapmadığını hatırlamıyorum.
pichenettes

@pichenettes: güncellenmiş yayın
Nick Sinas

@JimClay: güncellenmiş yayın
Nick Sinas

@NickS. Sinyalleriniz mükemmel bir şekilde hizalandıysa, cc grafiğinizin ortasında bir tepe elde edersiniz. Yani 2000'deki zirve gecikme anlamına gelmez. Şimdi 10 örnek gecikmeniz olduğunu varsayalım, bu sinyal2 sinyal1'den 10 örnek kapalı demektir. Bu, cc'deki zirvenizi 2000'den 2010'a (veya 1990) taşıyacaktır. Zaman gecikmeniz gerçek zirve konumunuz MINUS 2000'e karşılık gelir.
Spacey

Yanıtlar:


11

@NickS

Grafiklerdeki ikinci sinyalin aslında birincinin yalnızca geciktirilmiş bir versiyonu olduğu kesin olmaktan uzak olduğundan , klasik çapraz korelasyonun yanı sıra diğer yöntemlerin denenmesi gerekmektedir. Bunun nedeni, sinyallerinizin birbirinin gecikmeli versiyonları olması durumunda çapraz korelasyonun (CC) sadece bir maksimum olasılık tahmin edicisidir. Bu durumda, onların da durağan olmamaları hakkında hiçbir şey söylemeyeceklerdir.

Bu durumda, işe yarayabilecek şeyin sinyallerin önemli enerjisinin bir zaman tahmini olduğuna inanıyorum . Verilmiş, 'anlamlı' biraz öznel olabilir veya olamaz, ama inanıyorum ki sinyallerinize istatistiksel bir bakış açısıyla bakarak 'anlamlı' ölçebilir ve oradan gidebiliriz.

Bu amaçla aşağıdakileri yaptım:

ADIM 1: Sinyal zarflarını hesaplayın:

Sinyallerinizin her birinin Hilbert-Dönüşümünün çıkışının mutlak değeri hesaplandığından, bu adım basittir . Zarfları hesaplamak için başka yöntemler de vardır, ancak bu oldukça basittir. Bu yöntem esas olarak sinyalinizin analitik formunu, başka bir deyişle fazör temsilini hesaplar. Mutlak değeri aldığınızda, fazı ve yalnızca enerjiden sonra yıkıyorsunuz.

Ayrıca, sinyallerinizin enerjisinin bir zaman gecikmesi tahminini takip ettiğimiz için, bu yaklaşım gereklidir.

resim açıklamasını buraya girin

ADIM 2: Kenar koruyucu doğrusal olmayan Medial Filtreler ile gürültü giderme:

Bu önemli bir adım. Buradaki amaç, enerji zarflarınızı düzeltmektir , ancak kenarlarınızı ve hızlı yükselme sürelerinizi tahrip etmeden veya düzleştirmeden. Aslında buna adanmış bir alan var, ancak buradaki amaçlarımız için, basit bir doğrusal olmayan Medial filtre uygulamak için kullanabiliriz . (Medyan Filtreleme). Bu güçlü bir tekniktir, çünkü ortalama filtrelemenin aksine , medial filtreleme kenarlarınızı sıfırlamaz, ancak aynı zamanda önemli kenarlarda önemli bir bozulma olmadan sinyalinizi 'düzleştirir', çünkü hiçbir zaman sinyalinizde herhangi bir aritmetik yapılmaz. (pencere uzunluğunun tek olması şartıyla). Burada bizim durumumuz için, pencere boyutu 25 örnek bir medial filtre seçtim:

resim açıklamasını buraya girin

ADIM 3: Zamanı Kaldır: Gauss Çekirdek Yoğunluğu Tahmin Fonksiyonlarını Oluşturun:

Yukarıdaki plana normal yol yerine yanlara bakarsanız ne olur? Matematiksel olarak konuşursak, bu, gürültü sinyallerimizin her bir örneğini y-genlik eksenine yansıtırsanız ne elde edersiniz? Bunu yaparken, konuşmak için zamanı kaldırmayı başaracağız ve sadece sinyal istatistiklerini inceleyebileceğiz.

Sezgisel olarak yukarıdaki rakamdan ne çıkıyor? Gürültü enerjisi düşük olmakla birlikte, daha 'popüler' olması avantajına sahiptir. Buna karşılık, enerjiye sahip sinyal zarfı gürültüden daha enerjik olsa da, eşikler arasında parçalanır. Ya 'popülerliği' bir enerji ölçüsü olarak kabul edersek? Bu, Gauss Çekirdeği ile bir Çekirdek Yoğunluk Fonksiyonu (KDE) uygulamasıyla (kaba) yapacağımız şeydir .

Bunu yapmak için, her numune alınır ve ortalama olarak değeri kullanılarak bir gauss fonksiyonu oluşturulur ve önceden ayarlanmış bir bant genişliği (varyans) a-priori seçilir. Gaussianınızın varyansını ayarlamak önemli bir parametredir, ancak uygulamanıza ve tipik sinyallere göre gürültü istatistiklerine göre ayarlayabilirsiniz. (Devam etmek için sadece 2 dosyanız var). Daha sonra KDE Tahminini oluşturursak, aşağıdaki grafiği elde ederiz:

resim açıklamasını buraya girin

KDE'yi konuşmak için sürekli bir histogram formu ve varyansı bin genişliğiniz olarak düşünebilirsiniz. Bununla birlikte, daha sonra birinci ve ikinci türev hesabını gerçekleştirebileceğimiz pürüzsüz bir PDF'yi garanti etme avantajına sahiptir. Şimdi Gauss KDE'lerine sahip olduğumuza göre, gürültü örneklerinin popülerlikte nerede zirve yaptığını görebiliriz. Buradaki x ekseninin, verilerimizin genlik boşluğuna yansımalarını temsil ettiğini unutmayın. Böylece, gürültünün hangi eşiklerde en `` enerjik '' olduğunu görebiliriz ve bunlar bize hangi eşiklerden kaçınacağını söyler.

İkinci grafikte, Gauss KDE'lerinin ilk türevi alınır ve sıfıra yakın belirli bir değere ulaşmak için Gaussian karışımının zirvesinden sonra ilk türevden sonra ilk örneğin apsisini seçeriz . (Veya ilk sıfır geçişi). Bu yöntemi kullanabilir ve 'güvenli' olabiliriz çünkü KDE'miz makul bant genişliğine sahip pürüzsüz Gaussianlardan yapılmıştır ve bu pürüzsüz ve gürültüsüz fonksiyonun ilk türevi alınmıştır. (Tipik olarak birinci türevler, gürültüyü büyüttüklerinden yüksek SNR sinyalleri dışında herhangi bir şeyde sorunlu olabilir).

Siyah çizgiler daha sonra görüntüyü hangi eşiklerde "segmentlere ayırmak" akıllıca olacağını gösterir, böylece tüm gürültü tabanından kaçınırız. Daha sonra orijinal sinyallerimize başvurursak, aşağıdaki grafiklere ulaşırız, siyah çizgiler sinyallerimizin enerjisinin başladığını gösterir:

resim açıklamasını buraya girin

Böylece bir örnek elde edilir.δt=241

Umarım bu yardımcı olmuştur.


vay. Çok teşekkür ederim. Bunların hepsi benim için araştırmaya başlayacağım yeni teknikler. Kullandığınız matlab koduna bakmamın bir yolu var mı?
Nick Sinas

Matlab'da 1. ve 2. adımları tamamladım ve sonuçlarım sizinkilerle eşleşiyor, ancak 3. adımla ilgili sorunlar yaşıyorum. Hangi işlevleri kullandınız?
Nick Sinas

@NickS. Sor, .. ve alacaksın, bana bir e-posta gönder ve sana kullandığım kodu gönderebilirim.
Spacey

@Mohammed Zaman gecikmesini tahmin etmek için lütfen kodunuzu gönderir misiniz? Bu konuyla ilgili size bir e-posta gönderdim, bu yüzden lütfen yardım edin

6

Otokorelasyon ile bunu yapmak için birkaç sorun var

  1. Büyük DC ofseti (zaten sabit)
  2. Zaman penceresi: Matlab'ın xcorr () yöntemi, zaman gecikmesini kaydırdıkça sinyalin her iki uçta da "sıfır ped" olması için can sıkıcı bir kurala sahiptir. Yani veri penceresi gecikme süresinin bir fonksiyonudur. Bu, herhangi bir sabit sinyal (sinüs dalgaları dahil) için üçgen bir şekil oluşturacaktır. Daha iyi seçenekler, bir korelasyon penceresi seçmek, böylece pencere boyutu artı maksimum zaman gecikmesi toplam veri pencerenize sığacak veya çapraz korelasyonu yastıklı olmayan örnek sayısına göre normalleştirecektir.
  3. İki sinyal benimle özellikle ilişkili görünmüyor. Şekil biraz benzerdir, ancak piklerin ve düşüşlerin spesifik aralığı oldukça farklıdır, bu yüzden uygun bir oto-korelasyonun bile burada çok fazla fikir vereceğinden şüpheliyim.

Çok daha basit bir yaklaşım, başlangıç ​​noktalarını bulmak için bir eşik dedektörü kullanmak ve bu noktalar arasındaki farkı gecikme olarak kullanmak olacaktır.


4

Pichenette'in belirttiği gibi, bu durumda çıktının ortasındaki bir tepe noktası 0 gecikmeyi gösterir. Zirvenin orta noktadan uzaklığı zaman gecikmenizdir.

EDIT: Beni ilgilendiren neredeyse mükemmel bir üçgen olması beni ilgilendiriyor. Bu bana çapraz korelasyonun güç normalizasyonu yapmadığını gösteriyor. Bu, daha büyük gecikmelerdeki daha küçük gecikmelere haksız bir önyargı verir. Xcorr çağrınızı "cc = xcorr (x1, x2, 'neutral');" olarak değiştiririm.

Bu, unutmayın, mükemmel bir çözüm çünkü büyük gecikmeli sonuçlar artık düşük gecikmeli sonuçlardan daha kararsızdır çünkü daha az veriye dayanmaktadırlar. Ekstremitelerde büyük bir zirve, aynı sebepten ötürü,% 100 kafa elde edebileceğiniz ve sadece birkaç bozuk para atağında kuyruk bulunamayacağınız için sahte olabilir, ancak pek çok fırında gerçekleşmesi son derece düşüktür.


Yani sinyaller gecikmiyor mu?
Nick Sinas

Emin değilim - zirve nerede? Ortaya yakın olduğunu görebiliyorum, ama aslında ortada olduğu belli değil. Ayrıca, cevabımın bir düzenlemesinde ele alacağım bir güç normalleştirme sorunu var.
Jim Clay

'tarafsız' parametre kesinlikle daha iyi görünmesini sağlar. beklediğimden daha fazla. Buna bakmaya devam edeceğim. Teşekkürler.
Nick Sinas

@JimClay Belki Nick S, gerçek sinyallerle değil, sinyallerinin zarflarını ilişkilendiriyor (Nick bu doğru mu?). Bu, (kabaca) hayal ettiğim bu üçgen şekle yol açacaktır.
Spacey

2
@NickS. Mohammad'ın yorumu bana, sonuçlarınızı berbat eden büyük bir DC ofsetiniz olduğunu görün ve fark etti. Ortalamayı her iki sinyalden de çıkarın ve ardından xcorr'u çalıştırın. Önce "tarafsız" seçeneği olmadan denemek istiyorum.
Jim Clay

4

Diğerlerinin işaret ettiği ve sorudaki son düzenlemenize dayanarak gerçekleştirdiğiniz görülüyor, çapraz korelasyonun gösterilen veri kümeleri için size iyi bir zaman gecikmesi tahmini vereceği görülmüyor. Korelasyon, bir dizi zaman gecikmesi için birbirini kaydırarak ve her bir gecikmede iki seri arasında bir iç ürün hesaplayarak iki zaman serisi arasındaki benzerliği ölçer. İki seri niteliksel olarak benzer olduğunda veya birbirleriyle "ilişkili" olduklarında sonuç büyük bir büyüklüğe sahip olacaktır. Bu, iki vektör aynı yöne bakıldığında iki vektörün iç çarpımının en büyük olduğu şekle benzer.

Gösterdiğiniz verilerle ilgili sorun (en azından görebildiğimiz parçacıklar için) şekil olarak çok fazla benzerlik olmadığı görülüyor. Sinyallerden birine diğerine benzemesi için uygulayabileceğiniz bir gecikme yoktur, bu da çapraz korelasyonlarını hesaplayarak tam olarak yaptığınız şeydir.

Bununla birlikte, çapraz korelasyonun faydalı olduğu durumlar vardır. İkinci sinyalin, ek gürültü eklenmiş olsa bile, orijinalin zaman kaydırmalı bir sürümü olduğunu varsayalım:

a = csvread('scope1col.csv');
a = a - mean(a);               % to remove DC offset
b = a(200:end) + sqrt(0.05)*randn(1801,1);
figure; subplot(211); plot(a); subplot(212); plot(b)

resim açıklamasını buraya girin

Şimdi iki sinyalin bir zaman gecikmesi ile ilişkili olduğu hemen anlaşılamıyor. Ancak, çapraz korelasyonu alırsak, şunu elde ederiz:

[c,lags] = xcorr(a,b);
igure; plot(lags,c); grid on; xlabel('Lag'); ylabel('Cross-correlation');

resim açıklamasını buraya girin

200 numunenin doğru gecikmesinde bir tepe noktası gösterir. Korelasyon, doğru tip benzerlik içeren veri setlerine uygulandığında gecikme süresini belirlemek için yararlı bir araç olabilir.


Başka ne yapabileceğim hakkında bir fikrin var mı? Belki çapraz korelasyondan başka bir teknik veya belki bir çeşit filtre? Teşekkürler.
Nick Sinas

@NickS. Ben de baktım ve bunlar birbirlerinin gecikmeli kopyaları değil. Bununla birlikte, enerjinin gecikmesini tahmin etmek ister misiniz ? Bu durumda, VS sinyallerin gecikmesi daha mantıklı olacağını düşünüyorum . Bize yayınladığınız temel kanal / deneme hakkında daha fazla bilgi verirseniz, size olası yollar hakkında daha fazla bilgi verebiliriz.
Spacey

@Mohammad Teşekkürler. Alttaki kanal çeliktir. Enerjinin gecikmesini nasıl tahmin edeceğiniz hakkında bir fikriniz var mı?
Nick Sinas

@Mohammad, sinyallerin bozulmasının filtreleme ile temizlenebilen bir tür yankı olabileceğini düşünüyor musunuz?
Nick Sinas

@NickS. Orada bazı yankı temizleme hileleri olabilir (bunların nasıl başarılacağını bilmiyorum), ama bir göz atmak istiyorsanız, bir enerji tahmincisi olacak basit bir şeyle birlikte Arnavut kaldırımı yaptım.
Spacey

0

Muhammed'in önerisine dayanarak bir Matlab senaryosu yapmaya çalıştım. Ancak, varyanslara dayalı bir Gauss dağılımı oluşturup ardından bir KDE tahmini alıp almadığı veya Gauss varsayımı ile bir KDE tahmini yapıp yapmadığını belirleyemiyorum.

Ayrıca, KDE ofset zamanını zaman alanına nasıl çevirdiğini çıkarmak zordur. İşte benim girişimim. Komut dosyasını kullanmakla ilgilenen herhangi bir kullanıcı, mümkünse geliştirilmiş sürümü ücretsiz olarak güncelleyebilir ve güncelleyebilir.

%% Initialising data

Ws1 = data1;
Ws2 = data2;
mWs1 = nanmean(Ws1);
mWs2 = nanmean(Ws2);
sdWs1 = nanstd(Ws1);
sdWs2 = nanstd(Ws2);

%% Computing the signal envelopes
Ws1d = Ws1 - mWs1;
Ws2d = Ws2 - mWs2;
h1 = abs(hilbert(Ws1d));
h2 = abs(hilbert(Ws2d));
figure();
subplot(211)
plot([Ws1d, h1])
subplot(212)
plot([Ws2d, h2])

%% Denoise the signal with edge preserving nonlinear medial filtering
w = 25;
mf1 = medfilt1(h1, w);
mf2 = medfilt1(h2, w);
figure();
subplot(211)
plot(mf1)
subplot(212)
plot(mf2)

<%% Remove time: construct the gaussian kernel density estimation functions>
% Using the kde from Matlab central directly on the filtered data
data1 = mf1;
[bw1, den1, xmesh1, cdf1] = kde(data1, 2^14);
der1 = diff(den1);
data2 = mf2;
[bw2, den2, xmesh2, cdf2] = kde(data2, 2^14);
der2 = diff(den2);
figure();
plot([der1, der2]);
legend('Sig1', 'Sig2')

% the other method as explained in Muhammad's post
for i = 1:length(mf1)
gf1(:,i) = mf1(i) + sdWs1*randn(1000,1);
gf2(:,i) = mf2(i) + sdWs2*randn(1000,1);
end
[bwM1, denM1, xmeshM1, cdfM1] = kde(gf1(:,1), 2.^11);
dd1 = diff(denM1);
[bwM2, denM2, xmeshM2, cdfM2] = kde(gf2(:,1), 2.^11);
dd2 = diff(denM2);
figure();
plot([dd1, dd2]);
legend('Sig1', 'Sig2')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.