Giải mã các tín hiệu 1D bị làm mờ bởi hạt nhân Gaussian


12

Tôi đã kết hợp một tín hiệu ngẫu nhiên với aa Gaussian và thêm nhiễu (nhiễu Poisson trong trường hợp này) để tạo ra tín hiệu nhiễu. Bây giờ tôi muốn giải mã tín hiệu nhiễu này để trích xuất tín hiệu gốc bằng cách sử dụng cùng một Gaussian.

Vấn đề là tôi cần một mã thực hiện công việc giải mã trong 1D. (Tôi đã tìm thấy một số trong 2D nhưng mục tiêu chính của tôi là 1D).

Bạn có thể vui lòng gợi ý cho tôi một số gói hoặc chương trình có thể làm như vậy không? (Tốt nhất là trong MATLAB)

Xin được cảm ơn trước về sự giúp đỡ.


1
sử dụng hàm deconv trong MATLAB.
HƯỚNG DẪN GOEKHAN

không hoạt động với tiếng ồn được thêm vào ...
user1724

Bạn không thể giải mã tín hiệu . Bạn có thể ước tính tích chập ngược cho hai tín hiệu : đáp ứng xung của hệ thống và đầu ra hệ thống. Bạn đang cố gắng làm cái nào?
Phonon

2
@Phonon: Khá muộn với nhận xét này, nhưng có những phương pháp giải mã mù mà không đòi hỏi kiến ​​thức về đáp ứng xung của hệ thống. Như bạn có thể tưởng tượng, bạn có thể làm tốt hơn nếu bạn biết phản ứng thúc đẩy, mặc dù.
Jason R

1
@JasonR Điểm công bằng.
Phonon

Câu trả lời:


14

Tôi đã giải thích nó một lần trên StackOverflow .


Tín hiệu của bạn có thể được biểu diễn dưới dạng vectơ và tích chập là phép nhân với ma trận đường chéo N (trong đó N là chiều dài của bộ lọc). Tôi giả sử vì câu trả lời rằng bộ lọc nhỏ hơn nhiều so với tín hiệu

Ví dụ:

Vector / tín hiệu của bạn là:

V1
V2
...
Vn

Bộ lọc của bạn (yếu tố kết hợp) là:

  [b1 b2 b3];

Vậy ma trận là nxn: (Đặt tên là A):

[b2 b3 0  0  0  0.... 0]
[b1 b2 b3 0  0  0.... 0]
[0  b1 b2 b3 0  0.... 0]
.....
[0  0  0  0  0  0...b2 b3]

Kết luận là:

A*v;

Và khử chập là

A^(-1) * ( A) * v;

Rõ ràng, trong một số trường hợp không thể tích chập là không thể. Đây là những trường hợp khi bạn có số ít A. Ngay cả các ma trận không phải là số ít, nhưng gần với số ít, có thể có vấn đề, vì chúng sẽ có lỗi số lớn. Bạn có thể ước tính nó bằng cách tính số điều kiện của ma trận.

Nếu A có điều kiện thấp, bạn có thể tính toán nghịch đảo và áp dụng nó vào kết quả.


Bây giờ, hãy xem một số ví dụ trong Matlab:

Đầu tiên, tôi đã tạo một hàm tính toán ma trận chập.

function A = GetConvolutionMatrix(b,numA)
    A = zeros(numA,numA);
    vec = [b  zeros(1,numA-numel(b))];
    for i=1:size(A,1)
        A(i,:) = circshift(vec,[1 i]);
    end
end

Bây giờ, hãy thử xem điều gì xảy ra với các hạt nhân khác nhau:

    b = [1 1 1];
    A = GetConvolutionMatrix(b,10);
    disp(cond(A));

Số điều kiện là:

 7.8541

Đây là một vấn đề, như mong đợi. Sau khi lấy trung bình, thật khó để lấy lại tín hiệu ban đầu.

Bây giờ, chúng ta hãy thử một số trung bình nhẹ hơn:

b = [0.1 0.8 0.1];
A = GetConvolutionMatrix(b,10);
disp(cond(A));

Kết quả là:

1.6667

Điều đó phù hợp với trực giác của chúng tôi, trung bình nhẹ của tín hiệu gốc sẽ dễ dàng đảo ngược hơn nhiều.

Chúng ta cũng có thể thấy ma trận nghịch đảo trông như thế nào:

 figure;imagesc(inv(A));

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

Đây là một dòng từ ma trận:

  0.0003   -0.0026    0.0208   -0.1640    1.2910   -0.1640    0.0208   -0.0026    0.0003   -0.0001

Chúng ta có thể thấy rằng hầu hết năng lượng trong mỗi dòng được tập trung ở 3-5 hệ số xung quanh trung tâm. Do đó, để giải mã, chúng ta chỉ cần tạo lại tín hiệu một lần nữa với phép tính gần đúng này:

   [0.0208   -0.1640    1.2910   -0.1640    0.0208]

Hạt nhân này trông thú vị! Nó là một toán tử mài. Trực giác của chúng tôi là chính xác, sắc nét hủy bỏ mờ.


3
Câu trả lời này xứng đáng nhận được nhiều sự ủng hộ hơn
năng động vào

1
Tại sao bạn nghĩ rằng ma trận là tridia chéo? Đối với Thông tư Convolution nó sẽ được lưu hành. Trong hầu hết các trường hợp, nó sẽ là Toeplitz. Có một cái nhìn về giải pháp của tôi.
Royi

Đọc câu trả lời - Tôi đang phân tích một trường hợp trong đó bộ lọc có 3 phần tử. Trong hầu hết các trường hợp trong xử lý hình ảnh, bộ lọc nhỏ hơn nhiều so với tín hiệu. Vì vậy, có, nó là một ma trận Toepliz, nhưng nó cũng là đường chéo N, trong đó N là chiều dài của bộ lọc. Tích chập thông thường cũng khá vô dụng trong xử lý ảnh.
Andrey Rubshtein

Tôi đã cập nhật câu trả lời để tránh mọi nhầm lẫn.
Andrey Rubshtein

Bạn đã thấy Hạt nhân Gaussian được triển khai trong 3 mẫu chưa?
Royi

5

Nếu bạn đã thêm nhiễu ngẫu nhiên, bạn không thể nhận được tín hiệu gốc ... Bạn có thể thử tách các tín hiệu trong miền tần số (nếu nhiễu và tín hiệu có tần số khác nhau). Nhưng dường như những gì bạn đang tìm kiếm là một bộ lọc Wiener .


5

Tôi nghĩ rằng đây vẫn là một vấn đề mở.

Có rất nhiều tài liệu nghiên cứu cố gắng phục hồi tín hiệu ban đầu tốt nhất có thể.

Một cách tiếp cận cổ điển là thông qua các Phương pháp dựa trên Wavelet .

Cũng có những cách tiếp cận từ điển như thế này .

Bạn có thể có cái nhìn sâu sắc hơn về vấn đề bằng cách theo dõi nghiên cứu của David L. Donho, Michael Elad, Alfred M. Bruckstein, v.v.


1
Một bài báo gần đây sử dụng wavelet Morlet phức tạp của Nguyen, Farge & Schneider dường như mang lại kết quả tốt. Google mã thư mục này: 2012PhyD..241..186N Một người bạn của tôi đã sử dụng phương pháp này với các bước sóng 2D trên môi trường liên sao với kết quả tuyệt vời. Tôi vẫn chưa xem xét chi tiết.
PhilMacKay

3

Nếu tôi hiểu đúng vấn đề, chúng ta có thể chính thức hóa vấn đề như sau:

Chúng tôi có một mô hình tín hiệu,

y=Hx+η

Trong đó là quan sát, là toán tử tích chập và là nhiễu. Chúng tôi muốn ước tính bằng cách sử dụng quan sát và kiến ​​thức về các đặc tính của tiếng ồn.H η xyHηx

Trong trường hợp này, được mô phỏng từ phân phối Poisson. Tuy nhiên, các cách tiếp cận từ điển được đề cập ở trên làm cơ sở cho giả định tiếng ồn Gaussian. Trong trường hợp này, Gaussian là toán tử tích chập, không phải là nhiễu.η

Tôi đã không làm việc trong việc phục hồi tín hiệu dưới nhiễu Poisson, nhưng tôi đã googled và thấy bài báo này có thể hữu ích. Cách tiếp cận tương tự trong bối cảnh đó có thể hữu ích cho vấn đề này.


3

Việc giải mã dữ liệu nhiễu được biết đến là một vấn đề không chính đáng, vì nhiễu được phóng to tùy ý trong tín hiệu được tái tạo. Do đó, một phương pháp chính quy là cần thiết để ổn định giải pháp. Tại đây, bạn có thể tìm thấy gói MATLAB giải quyết vấn đề này bằng cách triển khai thuật toán chính quy hóa của Tikhonov:

https://github.com/soheil-soltani/TranKin .


3

Tôi sẽ đi đến đầu câu hỏi. Có các hàm giải mã trong MATLAB được sử dụng cho các ứng dụng xử lý ảnh. Tuy nhiên, bạn cũng có thể sử dụng các chức năng này cho tín hiệu 1D. Ví dụ,

% a random signal
sig_clean = zeros(1,200); 
sig_clean(80:100)=100;

figure
subplot(1,3,1)
plot(sig_clean,'b-.','LineWidth',2)
legend('Clean Signal')

% convolve it with a gaussian
x=1:30;
h = exp(-(x-15).^2/20); h=h/sum(h);
sig_noisy = conv(sig_clean,h,'same');

% and add noise
sig_noisy = awgn(sig_noisy,0,'measured');

subplot(1,3,2)
plot(sig_noisy,'r')
hold on, plot(sig_clean,'b-.','LineWidth',3)
legend('Blurred and noise added signal','Clean Signal')

( sig_noisy = sig_clean * h + noise) Vậy tại sao không giải mã tín hiệu đầu ra với hchức năng và thu được tín hiệu đầu vào (gần như). Tôi đang sử dụng giải mã Wiener tại đây

sig_deconvolved=deconvwnr(sig_noisy,h,1);

subplot(1,3,3)
plot(sig_noisy,'r')
hold on, plot(sig_clean,'b-.','LineWidth',2)
hold on, plot(sig_deconvolved,'k--','LineWidth',2)
legend('Blurred and noise added signal','Clean Signal','Deconvolved Signal')

nhập mô tả hình ảnh ở đây Ngoài ra, nếu bạn không biết hchức năng, nhưng biết đầu vào và đầu ra, lần này tại sao không giải mã tín hiệu đầu vào với đầu ra sẽ cung cấp cho h^-1chức năng. Sau đó, bạn có thể sử dụng nó như một bộ lọc để lọc tín hiệu nhiễu. ( sig_clean = sig_noisy * h^-1)

h_inv=deconvwnr(sig_clean,sig_noisy,1);

figure;
subplot(1,2,1)
plot(h_inv)
legend('h^-^1')


sig_filtered=conv(sig_noisy,h_inv,'same');
subplot(1,2,2)
plot(sig_noisy,'r')
hold on, plot(sig_clean,'b-.','LineWidth',2)
hold on, plot(sig_filtered,'k--','LineWidth',2)
legend('Blurred and noise added signal','Clean Signal','Filtered Signal')

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

Tôi hy vọng nó sẽ giúp.


2

Convolution là phép nhân và tổng của hai tín hiệu này đến tín hiệu kia. Tôi đang nói về hai tín hiệu xác định. Nếu bạn muốn giải mã cái này từ cái kia thì cái này tương ứng với nghiệm của hệ phương trình. Như bạn có thể biết hệ phương trình không phải lúc nào cũng có thể giải được. Hệ thống các phương trình có thể được xác định quá mức, không xác định hoặc chính xác có thể giải được.

Trong trường hợp bạn thêm một số tiếng ồn, sau đó bạn mất một số thông tin và bạn không thể lấy lại thông tin này. Những gì bạn có thể làm là một lần nữa để giải quyết hệ phương trình tuyến tính xem xét thực tế rằng mỗi hệ số được thêm một thuật ngữ nhiễu. Hoặc như bạn có thể thấy trong một câu trả lời khác cho câu hỏi của mình, trước tiên bạn có thể muốn ước tính tín hiệu gốc từ tín hiệu nhiễu và sau đó thử giải hệ phương trình.

Điều quan trọng cần lưu ý là tiếng ồn được thêm vào các hệ số nhân và tổng. Do đó, nó thậm chí có thể là trường hợp hệ phương trình của bạn cuối cùng không thể giải được duy nhất. Để chắc chắn rằng nó có thể giải được duy nhất ma trận hệ số của bạn phải là hình vuông và có thứ hạng đầy đủ.


2

Điều này sẽ khó thực hiện. Kết hợp với Gaussian tương đương với phép nhân với Biến đổi Fourier của Gaussian trong miền tần số. Đây thực sự cũng là một Gaussian về bản chất đây là bộ lọc thông thấp và là bộ lọc thực sự hiệu quả ở đó. Khi bạn thêm nhiễu, tất cả thông tin trong "dải dừng" của Gaussian sẽ bị hủy. Không có cách nào để phục hồi điều đó.

Khử nhiễu về cơ bản là nhân với nghịch đảo của đáp ứng tần số. Đây là vấn đề: Nghịch đảo của đáp ứng tần số thực sự rất lớn, trong đó Gaussian ban đầu rất nhỏ. Ở những tần số này, về cơ bản bạn sẽ khuếch đại nhiễu bằng một lượng lớn. Ngay cả khi mọi thứ sẽ hoàn toàn không có tiếng ồn, rất có thể bạn sẽ gặp phải các vấn đề về số.


2

Phương pháp tiếp cận

Có nhiều phương pháp cho Deconvolution (Cụ thể là toán tử suy biến là tuyến tính và bất biến thời gian / không gian) ngoài kia.
Tất cả trong số họ cố gắng đối phó với thực tế vấn đề là Ill Poised trong nhiều trường hợp.

Các phương pháp tốt hơn là những phương pháp thêm một số chính quy vào mô hình dữ liệu sẽ được khôi phục.
Nó có thể là mô hình thống kê (Priors) hoặc bất kỳ kiến ​​thức nào.
Đối với hình ảnh, một mô hình tốt là mảnh mịn hoặc độ thưa của độ dốc.

Nhưng vì mục đích của câu trả lời, một phương pháp tham số đơn giản sẽ được thực hiện - -Minimizing Lỗi tối thiểu bình phương giữa dữ liệu được khôi phục trong mô hình cho các phép đo.

Mô hình

Mô hình bình phương nhỏ nhất là đơn giản.
Hàm mục tiêu là một hàm của dữ liệu được cho bởi:

f(x)=12hxy22

Vấn đề tối ưu hóa được đưa ra bởi:

argminxf(x)=argminx12hxy22

Trong đó là dữ liệu được khôi phục, là Hạt nhân làm mờ (Gaussian trong trường hợp này) và là tập hợp các phép đo đã cho. Mô hình giả định các phép đo chỉ được đưa ra cho phần hợp lệ của tích chập. Cụ thể là nếu và thì trong đó .h y x R n h R k y R m m = n - k + 1xhy
xRnhRkyRmm=nk+1

Đây là một hoạt động tuyến tính trong không gian hữu hạn do đó có thể được viết bằng Biểu mẫu ma trận:

argminxf(x)=argminx12Hxy22

Trong đó là ma trận tích chập.HRm×n

Giải pháp

Giải pháp Least Squares được đưa ra bởi:

x^=(HTH)1HTy

Như có thể thấy nó đòi hỏi một ma trận đảo ngược.
Khả năng giải quyết vấn đề này phụ thuộc đầy đủ vào số điều kiện của toán tử tuân theo . cond ( H ) =HTHcond(H)=cond(HTH)

Phân tích số điều kiện

Điều gì đằng sau con số điều kiện này?
Người ta có thể trả lời nó bằng Đại số tuyến tính.
Nhưng theo tôi, một cách tiếp cận trực quan hơn sẽ nghĩ về nó trong Miền tần số.

Về cơ bản, toán tử suy giảm làm suy giảm năng lượng, nói chung, tần số cao.
Bây giờ, vì về tần số, đây về cơ bản là một phép nhân phần tử, người ta sẽ nói cách dễ dàng để đảo ngược nó là phân chia phần tử khôn ngoan bằng bộ lọc nghịch đảo.
Vâng, đó là những gì được thực hiện ở trên.
Vấn đề phát sinh với các trường hợp bộ lọc làm suy giảm năng lượng thực tế thành không. Sau đó, chúng tôi có vấn đề thực sự ...
Đây cơ bản là những gì mà Số điều kiện cho chúng tôi biết, một số tần số bị suy giảm so với các tần số khác.

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

Ở trên người ta có thể thấy Số điều kiện (Sử dụng đơn vị [dB]) là một hàm của tham số STD của Bộ lọc Gaussian.
Như mong đợi, STD càng cao thì số điều kiện càng tệ vì STD càng cao đồng nghĩa với LPF càng mạnh (Giá trị đi xuống ở cuối là các vấn đề về số).

Giải pháp số

Bộ đồng phục của hạt nhân Gaussian Blur đã được tạo.

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

Các tham số là , và . Dữ liệu là ngẫu nhiên và không có tiếng ồn được thêm vào.k = 31 m = 270n=300k=31m=270

Trong MATLAB, Hệ thống tuyến tính đã được giải quyết bằng cách pinv()sử dụng Pseudo Inverse và \toán tử dựa trên SVD .

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

Như người ta có thể thấy, sử dụng SVD, giải pháp ít nhạy hơn nhiều so với dự kiến.

Tại sao có lỗi?
Nhìn vào một giải pháp (Đối với STD cao nhất):

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

Như người ta có thể thấy tín hiệu được phục hồi rất tốt ngoại trừ bắt đầu và kết thúc.
Điều này là do việc sử dụng Kết hợp hợp lệ cho chúng ta biết rất ít về các mẫu đó.

Tiếng ồn

Nếu chúng ta thêm tiếng ồn, mọi thứ sẽ khác!
Lý do kết quả tốt trước đây là do thực tế MATLAB có thể xử lý DR của dữ liệu và giải các phương trình mặc dù chúng có số điều kiện lớn.

Nhưng số điều kiện lớn có nghĩa là bộ lọc nghịch đảo khuếch đại mạnh (Để đảo ngược suy giảm mạnh) một số tần số.
Khi những cái đó chứa tiếng ồn, điều đó có nghĩa là tiếng ồn sẽ được khuếch đại và sự phục hồi sẽ rất tệ.

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

Như người ta có thể thấy ở trên, bây giờ việc tái thiết sẽ không hoạt động.

Tóm lược

Nếu một người biết chính xác Toán tử suy thoái và SNR rất tốt, các phương pháp giải mã đơn giản sẽ hoạt động.
Vấn đề chính của quá trình giải mã là mức độ khó của Toán tử suy giảm tần số.
Càng suy giảm thì càng cần nhiều SNR để khôi phục (Về cơ bản, đây là ý tưởng đằng sau Bộ lọc Wiener ).
Các tần số được đặt thành 0 không thể được khôi phục!

Trong thực tế, để có kết quả ổn định, nên thêm một số linh mục.

Mã này có sẵn tại Kho lưu trữ tín hiệu StackExchange của tôi Q2969 GitHub .


2

Nói chung, một phương pháp để xử lý vấn đề khái quát hóa cho vấn đề trích xuất hai hoặc nhiều thành phần là lấy phổ G¹, G², Gⁿ của các tín hiệu # 1, # 2, ..., #n, lập bảng tổng hợp bình phương Γ (ν) = | G¹ (ν) | ² + | G² (ν) | ² + ⋯ + | Gⁿ (ν) | ² ở mỗi tần số ν và bình thường hóa G₁ (ν) G¹ (ν) * / (ν), G₂ (ν) G² (ν) * / Γ (ν), ..., G_n (ν) Gⁿ (ν) * / Γ (ν). Vấn đề với độ không xác định và nhiễu tương ứng với thực tế là Γ (ν) ~ 0 có thể xảy ra đối với một số tần số ν. Để xử lý điều này, hãy thêm vào một "tín hiệu" khác để trích xuất G⁰ (ν) = hằng số - tín hiệu "nhiễu". Bây giờ (ν) sẽ được giới hạn dưới đây. Điều này gần như chắc chắn được kết nối với chính quy hóa Tikhonov, nhưng tôi chưa bao giờ tìm thấy hoặc thiết lập bất kỳ kết quả tương đương hoặc thư nào khác. Nó đơn giản hơn và trực tiếp và trực quan hơn.

Ngoài ra, bạn có thể coi G là các vectơ được trang bị một sản phẩm bên trong phù hợp, ví dụ «G, G '» G (ν) * G' (ν) dν và lấy (G₀, G₁, ⋯, G_n) làm kép (ví dụ: nghịch đảo tổng quát) của (G⁰, G¹, ⋯, Gⁿ) - giả sử, tất nhiên, các vectơ thành phần là độc lập tuyến tính.

Để giải mã Gaussian, người ta sẽ thiết lập n = 1, G⁰ = tín hiệu "nhiễu" và G¹ = tín hiệu "Gaussian".


1

Câu trả lời được cung cấp bởi Andrey Rubshtein sẽ thất bại thảm hại khi có tiếng ồn, vì vấn đề được mô tả là rất nhạy cảm với tiếng ồn và lỗi mô hình hóa. Đó là một ý tưởng tốt để xây dựng một ma trận tích chập, nhưng việc sử dụng chính quy trong nghịch đảo là một điều tuyệt đối phải có trong một vấn đề như thế này. Một phương pháp chính quy hóa rất đơn giản và dễ dàng (mặc dù tốn kém về mặt tính toán) là Phân tách giá trị số đơn (TSVD). Các phương pháp như Chính quy hóa Tikhonov và Chính quy hóa tổng thểđáng để kiểm tra Chính quy hóa Tikhonov (và hình thức chung của nó) có một hình thức xếp chồng rất thanh lịch, dễ thực hiện trong Matlab. Kiểm tra cuốn sách: Các vấn đề nghịch đảo tuyến tính và phi tuyến với các ứng dụng thực tế của Samuli Siltanen và Jennifer Mueller.


1

Thật ra, câu hỏi không rõ ràng. Nhưng câu trả lời đã làm rõ những gì bạn yêu cầu. Bạn có thể xây dựng một hệ thống các phương trình đại số tuyến tính như một số người khuyên, điều đó là chính xác, nhưng ma trận được xây dựng trên tín hiệu đã biết được gọi là điều kiện kém. Điều đó có nghĩa là khi bạn cố gắng đảo ngược nó, các lỗi cắt xén sẽ giết giải pháp và bạn nhận được các số ngẫu nhiên. Cách tiếp cận phổ biến là cực hạn. Bạn giảm thiểu định mức của giải pháp | | x | | với giới hạn | | Ax - y | | <đồng bằng. Vì vậy, bạn đang tìm kiếm x với định mức nhỏ nhất không cho phép chênh lệch giữa Ax và y lớn. Rất đơn giản, bạn cần thêm cái gọi là tham số chính quy trên đường chéo chính của ma trận thu được khi áp dụng các bình phương tối thiểu. Nó được gọi là chính quy Tikhonov. Tôi có các mẫu mã hóa làm điều đó,

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.