Ước tính thời gian trễ của tín hiệu dao động sử dụng tương quan chéo


12

Tôi đã ghi lại 2 tín hiệu từ một kính viễn vọng. Họ trông như thế này: nhập mô tả hình ảnh ở đây

Tôi muốn đo thời gian trễ giữa chúng trong Matlab. Mỗi tín hiệu có 2000 mẫu với tần số lấy mẫu là 2001000.5.

Dữ liệu nằm trong tệp csv. Đây là những gì tôi có cho đến nay.
Tôi đã xóa dữ liệu thời gian ra khỏi tệp csv để chỉ các mức điện áp nằm trong tệp csv.

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

Điều này mang lại kết quả này: nhập mô tả hình ảnh ở đây

Từ những gì tôi đã đọc, tôi cần phải có mối tương quan chéo của các tín hiệu này và điều này sẽ cho tôi một đỉnh cao liên quan đến độ trễ thời gian. Tuy nhiên, khi tôi lấy tương quan chéo của các tín hiệu này, tôi đạt đỉnh ở mức 2000 mà tôi biết là không chính xác. Tôi nên làm gì với những tín hiệu này trước khi tôi tương quan chéo chúng? Chỉ cần tìm một số hướng.

EDIT: sau khi loại bỏ bù DC, đây là kết quả mà tôi hiện đang nhận được:
nhập mô tả hình ảnh ở đây

Có cách nào để dọn dẹp cái này để có được độ trễ thời gian xác định hơn không?

EDIT 2: Đây là các tệp:
http://dl.dropbox.com/u/10147354/scope1col.csv
http://dl.dropbox.com/u/10147354/scope2col.csv


Làm thế nào, chính xác, bạn đang làm tương quan chéo? Để trả lời câu hỏi trực tiếp của bạn, bạn không cần phải làm bất cứ điều gì với tín hiệu của mình trước khi tương quan chéo, mặc dù trong một số trường hợp, việc lọc trước giúp loại bỏ nhiễu có thể làm sai lệch kết quả.
Jim Clay

1
Vui lòng gửi mã bạn đã sử dụng và quan trọng hơn là biểu đồ của tín hiệu tương quan chéo. Một số công cụ / thư viện đặt điểm (lag = 0) ở giữa biểu đồ; Tôi không nhớ nếu Matlab làm điều đó.
pichenettes

@pichenettes: bài đăng được cập nhật
Nick Sinas

@JimClay: bài đăng được cập nhật
Nick Sinas

@NickS. Nếu tín hiệu của bạn được căn chỉnh hoàn hảo, bạn sẽ có được một đỉnh ở giữa âm mưu cc của bạn. Vì vậy, đỉnh điểm tại 2000 có nghĩa là không có độ trễ. Bây giờ hãy để chúng tôi nói rằng bạn có độ trễ 10 mẫu, có nghĩa là signal2 giảm 10 mẫu so với signal1. Điều này sẽ chỉ di chuyển đỉnh của bạn trong cc từ 2000 đến 2010 (hoặc 1990). Vì vậy, thời gian trễ của bạn tương ứng với vị trí cao điểm thực tế của bạn, MINUS 2000.
Spacey

Câu trả lời:


11

@NickS

Do không chắc chắn rằng tín hiệu thứ hai trong các ô trên thực tế là phiên bản bị trì hoãn duy nhất của phương thức thứ nhất, nên các phương pháp khác bên cạnh mối tương quan chéo cổ điển phải được thử. Điều này là do tương quan chéo (CC) chỉ là một công cụ ước tính khả năng tối đa nếu (các) tín hiệu của bạn là các phiên bản trễ của nhau. Trong trường hợp này, họ rõ ràng là không, không nói gì về sự không cố định của họ.

Trong trường hợp này, tôi tin rằng những gì có thể làm việc là ước tính thời gian của năng lượng đáng kể của các tín hiệu. Cấp, 'đáng kể' có thể hoặc không thể chủ quan, nhưng tôi tin rằng bằng cách nhìn vào tín hiệu của bạn từ quan điểm thống kê, chúng ta sẽ có thể định lượng 'đáng kể' và đi từ đó.

Để kết thúc này, tôi đã làm như sau:

BƯỚC 1: Tính toán các phong bì tín hiệu:

Bước này rất đơn giản, vì giá trị tuyệt đối của đầu ra của Hilbert-Transform của mỗi tín hiệu của bạn được tính toán. Có các phương pháp khác để tính toán phong bì, nhưng điều này khá dễ dàng. Phương pháp này về cơ bản tính toán hình thức phân tích tín hiệu của bạn, nói cách khác, biểu diễn phasor. Khi bạn lấy giá trị tuyệt đối, bạn đang phá hủy pha và chỉ sau năng lượng.

Hơn nữa vì chúng tôi đang theo đuổi ước tính thời gian trễ về năng lượng tín hiệu của bạn, phương pháp này được bảo hành.

nhập mô tả hình ảnh ở đây

BƯỚC 2: Khử nhiễu với Bộ lọc Medial phi tuyến bảo toàn cạnh:

Đây là một bước quan trọng. Mục tiêu ở đây là làm mịn các phong bì năng lượng của bạn, nhưng không phá hủy hoặc làm nhẵn các cạnh của bạn và thời gian tăng nhanh. Thực sự có toàn bộ lĩnh vực dành cho việc này, nhưng với mục đích của chúng tôi ở đây, chúng tôi chỉ đơn giản có thể sử dụng bộ lọc Medial phi tuyến tính dễ thực hiện . (Lọc trung bình). Đây là một kỹ thuật mạnh mẽ vì không giống như lọc trung bình , lọc trung gian sẽ không loại bỏ các cạnh của bạn, nhưng đồng thời 'làm mịn' tín hiệu của bạn mà không làm suy giảm đáng kể các cạnh quan trọng, vì không có lúc nào số học được thực hiện trên tín hiệu của bạn (với điều kiện chiều dài cửa sổ là số lẻ). Đối với trường hợp của chúng tôi ở đây, tôi đã chọn một bộ lọc trung gian có kích thước cửa sổ 25 mẫu:

nhập mô tả hình ảnh ở đây

BƯỚC 3: Xóa thời gian: Xây dựng các hàm ước tính mật độ hạt nhân Gaussian:

Điều gì sẽ xảy ra nếu bạn nhìn vào cốt truyện bên trên thay vì cách thông thường? Về mặt toán học, điều đó có nghĩa là, bạn sẽ nhận được gì nếu bạn chiếu từng mẫu tín hiệu bị khử của chúng tôi lên trục biên độ y? Khi làm điều này, chúng tôi sẽ quản lý để loại bỏ thời gian để nói và chỉ có thể nghiên cứu các số liệu thống kê tín hiệu.

Trực giác những gì bật ra khỏi hình trên? Mặc dù năng lượng tiếng ồn thấp, nhưng nó có ưu điểm là 'phổ biến' hơn. Ngược lại, trong khi đường bao tín hiệu có năng lượng mạnh hơn tiếng ồn, nó bị phân mảnh qua các ngưỡng. Điều gì xảy ra nếu chúng ta coi "mức độ phổ biến" là thước đo năng lượng? Đây là những gì chúng ta sẽ làm với (triển khai thô) của tôi về Hàm mật độ hạt nhân , (KDE), với Hạt nhân Gaussian.

Để làm điều này, mọi mẫu được lấy và một hàm gaussian được xây dựng bằng cách sử dụng giá trị của nó làm giá trị trung bình và băng thông được đặt trước (phương sai) được chọn a-prori. Đặt phương sai của gaussian của bạn là một tham số quan trọng, nhưng bạn có thể đặt nó dựa trên thống kê nhiễu dựa trên ứng dụng và tín hiệu điển hình của bạn. (Tôi chỉ có 2 tệp của bạn để tắt). Nếu sau đó chúng ta xây dựng Dự toán KDE, chúng ta sẽ có được biểu đồ sau:

nhập mô tả hình ảnh ở đây

Bạn có thể nghĩ về KDE như một dạng biểu đồ liên tục để nói và phương sai là chiều rộng bin của bạn. Tuy nhiên, nó có lợi thế là đảm bảo một bản PDF mượt mà mà sau đó chúng ta có thể thực hiện phép tính đạo hàm thứ nhất và thứ hai trên đó. Bây giờ chúng ta có các KDE Gaussian, chúng ta có thể thấy các mẫu nhiễu phổ biến ở đâu. Hãy nhớ rằng trục x ở đây biểu thị các hình chiếu của dữ liệu của chúng ta lên không gian biên độ. Do đó, chúng ta có thể thấy ngưỡng nào là tiếng ồn 'mạnh mẽ nhất' và chúng cho chúng ta biết nên tránh ngưỡng nào.

Trong âm mưu thứ hai, đạo hàm thứ nhất của KDE Gaussian được lấy và chúng tôi chọn mẫu bỏ qua mẫu đầu tiên sau đạo hàm thứ nhất sau đỉnh của hỗn hợp Gaussian để đạt giá trị nhất định gần bằng 0. (Hoặc vượt qua đầu tiên). Chúng ta có thể sử dụng phương pháp này và 'an toàn' vì KDE của chúng tôi được xây dựng bằng các Gaussian mịn có băng thông hợp lý và đạo hàm đầu tiên của chức năng không nhiễu và không nhiễu này đã được thực hiện. (Thông thường các dẫn xuất đầu tiên có thể có vấn đề trong bất cứ điều gì ngoại trừ tín hiệu SNR cao vì chúng phóng đại nhiễu).

Các đường màu đen hiển thị sau đó ở ngưỡng nào chúng ta sẽ khôn ngoan khi 'phân đoạn' hình ảnh tại, sao cho chúng ta tránh được toàn bộ tầng nhiễu. Sau đó, nếu chúng ta áp dụng cho các tín hiệu ban đầu của mình, chúng ta đạt được các ô sau, với các vạch đen biểu thị sự bắt đầu năng lượng của các tín hiệu của chúng ta:

nhập mô tả hình ảnh ở đây

δt= =241

Tôi hy vọng điều này sẽ giúp.


ồ Cảm ơn bạn rất nhiều. Đây là tất cả các kỹ thuật mới đối với tôi mà tôi sẽ bắt đầu nghiên cứu. Có cách nào tôi có thể xem mã MATLAB mà bạn đã sử dụng không?
Nick Sinas

Vì vậy, tôi đã thực hiện các bước # 1 và # 2 trong Matlab và kết quả của tôi khớp với bạn, nhưng tôi gặp vấn đề với bước # 3. Những chức năng bạn đã sử dụng?
Nick Sinas

@NickS. Hỏi, .. và bạn sẽ nhận được, bắn email cho tôi và tôi có thể gửi cho bạn mã tôi đã sử dụng.
Spacey

@Mohammed Bạn có thể vui lòng gửi mã của bạn để ước tính thời gian trễ. Tôi đã gửi cho bạn một email liên quan đến vấn đề này vì vậy hãy giúp đỡ

6

Có một vài vấn đề khi làm điều này với autocorrelation

  1. Độ lệch cực lớn DC (đã được sửa)
  2. Cửa sổ thời gian: Matlab 'xcorr () có quy ước gây khó chịu về cơ bản là "zero pad" tín hiệu ở cả hai đầu khi bạn trượt độ trễ thời gian. Tức là cửa sổ dữ liệu là một hàm của độ trễ thời gian. Điều này sẽ tạo ra một hình tam giác cho bất kỳ tín hiệu đứng yên (bao gồm cả sóng hình sin). Các lựa chọn tốt hơn là chọn cửa sổ tương quan sao cho kích thước cửa sổ cộng với độ trễ thời gian tối đa phù hợp với tổng cửa sổ dữ liệu của bạn hoặc bình thường hóa mối tương quan chéo theo số lượng mẫu không đệm.
  3. Hai tín hiệu trông không tương quan đặc biệt với tôi. Hình dạng có phần giống nhau nhưng khoảng cách cụ thể của các đỉnh và đỉnh khá khác nhau, vì vậy tôi nghi ngờ rằng ngay cả một mối tương quan tự động thích hợp cũng sẽ mang lại nhiều cái nhìn sâu sắc ở đây.

Một cách tiếp cận đơn giản hơn nhiều sẽ là sử dụng bộ phát hiện ngưỡng để tìm điểm bắt đầu và chỉ cần sử dụng sự khác biệt giữa các điểm này làm độ trễ.


4

Như pichenettes đã chỉ ra, trong trường hợp này, một đỉnh ở giữa đầu ra biểu thị 0 độ trễ. Điểm bù của đỉnh từ điểm giữa là độ trễ thời gian của bạn.

EDIT: Nó liên quan đến tôi rằng mối tương quan gần như là một tam giác hoàn hảo. Điều đó cho tôi thấy rằng mối tương quan chéo đang không thực hiện bình thường hóa điện. Điều đó mang lại sự thiên vị không công bằng cho độ trễ nhỏ hơn độ trễ lớn hơn. Tôi sẽ sửa đổi cuộc gọi xcorr của bạn thành "cc = xcorr (x1, x2, 'không thiên vị');".

Điều đó không phải, làm phiền bạn, một giải pháp hoàn hảo bởi vì các kết quả độ trễ lớn hiện không ổn định hơn so với kết quả độ trễ thấp vì chúng dựa trên ít dữ liệu hơn. Một đỉnh lớn ở các điểm cực trị có thể là không có thật vì lý do tương tự là bạn có thể nhận được 100% đầu và không có đuôi chỉ bằng một vài lần tung đồng xu, trong khi điều đó cực kỳ khó xảy ra trên nhiều lần tung.


Có nghĩa là các tín hiệu không bị trì hoãn?
Nick Sinas

Tôi không chắc chắn - đỉnh cao ở đâu? Tôi có thể thấy rằng nó ở gần giữa, nhưng không rõ là nó thực sự ở giữa. Ngoài ra, có một vấn đề bình thường hóa điện mà tôi sẽ giải quyết trong phần chỉnh sửa câu trả lời của mình.
Jim Clay

Tham số 'không thiên vị' chắc chắn làm cho nó trông tốt hơn. nhiều hơn những gì tôi mong đợi. Tôi sẽ tiếp tục xem xét điều này. Cảm ơn.
Nick Sinas

@JimClay Có lẽ Nick S, đang tương quan các phong bì tín hiệu của anh ấy chứ không phải tín hiệu thực tế, (Nick này có đúng không?). Điều này sẽ mang lại (khoảng) hình dạng tam giác này tôi tưởng tượng.
Spacey

2
@NickS. Nhận xét của Mohammad khiến tôi nhìn và nhận ra rằng bạn có một khoản bù DC rất lớn đang làm rối tung kết quả của bạn. Trừ trung bình từ cả hai tín hiệu của bạn và sau đó chạy xcorr trên chúng. Tôi sẽ thử nó mà không có tùy chọn "không thiên vị" trước.
Jim Clay

4

Như những người khác đã chỉ ra, và có vẻ như bạn đã nhận ra dựa trên lần chỉnh sửa cuối cùng của mình cho câu hỏi, có vẻ như mối tương quan chéo sẽ cho bạn một ước tính tốt về độ trễ thời gian cho các bộ dữ liệu được hiển thị. Sự tương quan đo lường sự tương đồng về hình dạng giữa hai chuỗi thời gian bằng cách trượt cái này qua cái kia trong một khoảng thời gian trễ và tính toán một sản phẩm bên trong giữa hai chuỗi ở mỗi độ trễ. Kết quả sẽ có cường độ lớn khi hai chuỗi tương tự nhau về mặt chất lượng hoặc chúng có "tương quan" với nhau. Điều này tương tự như cách một sản phẩm bên trong của hai vectơ lớn nhất khi hai vectơ được chỉ cùng hướng.

Vấn đề với dữ liệu bạn đã trình bày là (ít nhất là đối với các đoạn mà chúng ta có thể thấy) dường như không có nhiều điểm tương đồng về hình dạng. Không có độ trễ mà bạn có thể áp dụng cho một trong các tín hiệu để làm cho nó trông giống như tín hiệu kia, đó chính xác là những gì bạn đang làm bằng cách tính toán tương quan chéo của chúng.

Tuy nhiên, có những trường hợp tương quan chéo là hữu ích. Giả sử tín hiệu thứ hai của bạn thực sự là phiên bản thay đổi theo thời gian của bản gốc, ngay cả khi có thêm một số nhiễu:

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)

nhập mô tả hình ảnh ở đây

Bây giờ không rõ ràng rằng hai tín hiệu có liên quan đến nhau bởi thời gian trễ. Tuy nhiên, nếu chúng ta có mối tương quan chéo, chúng ta sẽ nhận được:

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

nhập mô tả hình ảnh ở đây

trong đó cho thấy một đỉnh ở độ trễ chính xác của 200 mẫu. Tương quan có thể là một công cụ hữu ích để xác định độ trễ thời gian, khi được áp dụng cho các bộ dữ liệu có chứa loại tương tự đúng.


Bất cứ ý tưởng cho những gì khác tôi có thể làm? Có thể một kỹ thuật khác ngoài tương quan chéo hoặc có thể một số loại bộ lọc? Cảm ơn.
Nick Sinas

@NickS. Tôi cũng đã xem xét nó và chúng không phải là bản sao của nhau. Điều đó đang được nói, bạn có muốn ước tính độ trễ của năng lượng ? Tôi nghĩ rằng điều đó sẽ có ý nghĩa hơn trong trường hợp này, VS trì hoãn các tín hiệu . Nếu bạn cho chúng tôi biết thêm về kênh / thử nghiệm cơ bản bạn đang chạy, chúng tôi có thể cho bạn biết thêm về các đường dẫn có thể.
Spacey

@Mohammad Cảm ơn. Các kênh cơ bản là thép. Bất kỳ ý tưởng làm thế nào để ước tính sự chậm trễ của năng lượng?
Nick Sinas

@Mohammad Bạn có nghĩ rằng sự biến dạng của các tín hiệu có thể là một loại âm vang có thể được làm sạch bằng bộ lọc?
Nick Sinas

@NickS. Có thể có một số thủ thuật làm sạch âm vang ngoài kia (tôi không biết làm thế nào chúng sẽ được hoàn thành), nhưng tôi đã cùng nhau tìm ra thứ gì đó đơn giản sẽ là công cụ ước tính năng lượng nếu bạn muốn xem.
Spacey

0

Dựa trên đề nghị của Muhammad, tôi đã cố gắng tạo ra một kịch bản Matlab. Tuy nhiên, tôi không thể suy luận nếu anh ta xây dựng phân phối Gaussian dựa trên phương sai và sau đó lấy ước tính KDE hoặc anh ta thực hiện ước lượng KDE với giả định Gaussian.

Ngoài ra, rất khó để suy ra cách anh ta dịch thời gian bù KDE sang miền thời gian. Đây là nỗ lực của tôi với nó. Bất kỳ người dùng nào quan tâm đến việc sử dụng tập lệnh đều được miễn phí và cập nhật phiên bản cải tiến nếu có thể.

%% 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')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.