2017-03-04 34 views
6

Za pomocą MATLAB stosuję Matching Pursuit w celu przybliżenia sygnału. Mój problem polega na tym, że walczę o wizualizację reprezentacji czasowo-częstotliwościowych wybranych atomów. Próbuję stworzyć fabułę Wignera podobną do poniższego obrazu (source).MATLAB Działka Wignera dla pasujących atomów ataku

enter image description here

Szukałem w Wavelet Toolbox, Signal Processing Toolbox, jak i open source Toolbox czasowo-częstotliwościowej, ale jestem ewentualnie tylko przy użyciu niewłaściwych parametrów, ponieważ moje doświadczenie z przetwarzaniem sygnału jest dość ograniczony.

Przykład

Korzystanie this data mój cel jest do odtworzenia fabuły z góry.

% fit the signal using MP 
itermax = 50; 
signal = load('signal.txt'); 
dict = wmpdictionary(length(signal)); 
[signal_fit, r, coeff, iopt, qual, X] = wmpalg('OMP', signal, dict, ... 
               'itermax', itermax); 

% wigner plot of the simulated signal 
tfrwv(signal_fit) % wigner-ville function from time-frequency toolbox 

% wigner plot of each atom 
atoms = full(dict(:, iopt)) % selected atoms 
for i = 1:itermax 
    tfrwv(atoms(:, i)) 
end 

Niestety, żaden z powstałych wykresów nie zbliża się do docelowej wizualizacji. Zauważ, że w tym przykładzie używam tfrwv ze standardowymi parametrami, które dostosowuję do GUI, który otwiera.

Będę bardzo wdzięczny za pomoc.

Aktualizacja

myślę, że teraz zrozumiał, że trzeba używać węgla Gabor uzyskać plamy z kształtów przypominających rozciągnięte gaussians. Niestety, nie ma funkcji Gabora w predefiniowanych dyktaturach Zestawu do Przetwarzania Sygnału. Jednak this question pomógł mi w realizacji potrzebnych słowniki, takie że dostanę węgla, które wyglądają dość podobny do przykładu:

tf-representation of selected of atoms

Od moich działek zbliżyć, ale nie są doskonałe, istnieją jeszcze dwa pytania otwarte:

  • Czy wszystkie bloby, które widzimy w pierwszym przykładzie, są modelowane tylko przez atomy Gabora, czy też potrzebuję innego słownika funkcji?
  • Jak połączyć wykresy pojedynczych obrazów w jedną wizualizację?
+0

Może użyć napisu do napisania własnego kodu wizualizacji zamiast "tfrwv". "Każdy piksel na mapie ciepła (na górze) reprezentuje atom (falę wyśrodkowaną w czasie w zależności od pozycji poziomej i częstotliwości odpowiadającej wysokości) .Kolor piksela daje produktowi wewnętrznemu odpowiedniego atomu falkowego z sygnałem (Dolny)." Masz swoje atomy, więc teraz musisz wziąć wewnętrzny produkt. – Cecilia

+0

Dzięki za komentarz. Wykreślanie atomów nie jest moim głównym problemem. Zobacz aktualizację mojego obecnego stanu. – imant

Odpowiedz

3

Aby odpowiedzieć na drugie pytanie "Jak mogę połączyć się indidividual działek imagesc w jednej wizualizacji?

Jeśli masz wiele macierzy 2d, które chcesz nałożyć i wyświetlić przy użyciu imagesc, proponuję przyjąć wartość maksymalną.

Na przykład generuję dwie siatki 31x31 z gausami o różnej średniej i wariancji.

function F = generate2dGauss(mu, Sigma) 
    x1 = -3:.2:3; x2 = -3:.2:3; 
    [X1,X2] = meshgrid(x1,x2); 
    F = mvnpdf([X1(:) X2(:)],mu,Sigma); 
    F = reshape(F,length(x2),length(x1)); 
end 

F1 = generate2dGauss([1 1], [.25 .3; .3 1]); 
F2 = generate2dGauss([-1 -1], [.1 .1; .1 1]); 

mogę wykreślić je z wątków jak w przykładzie,

figure; 
subplot(1,2,1); 
title('Atom 1'); 
imagesc(F1); 

subplot(1,2,2); 
title('Atom 2'); 
imagesc(F2); 

Two subplots with a gaussian distribution in each

Albo mogę wykreślić maksimum na pierwiastek z dwóch siatek.

figure; 
title('Both Atoms'); 
imagesc(max(F1, F2)); 

The per element maximum of the two gaussian distributions

Można również eksperymentować z elementem mądry sposób, sum, itp, ale w oparciu o przykład dajesz, myślę, że maksymalna daje najczystszy patrząc wynik.

Ewentualne wady i zalety różnych funkcji:

  1. Maksymalna działa najlepiej jeśli atomy zawsze mieć wartości zerowej tła i nie ma wartości ujemne. Jeśli tło ma wartość zerową, ale atomy zawierają również wartości ujemne, wartości ujemne mogą zostać zasłonięte przez tło innych atomów. Jeśli twój atom nakłada się, wyższa wartość oczywiście będzie dominować.
  2. Średnia spowoduje, że Twoje szczyty będą mniej wysokie, ale mogą być bardziej intuicyjne w przypadku nakładania się atomów.
  3. Suma sprawi, że obszary nakładające się będą miały większą wartość.
  4. Jeśli masz niezerowe tła, możesz również spróbować użyć indeksowania logicznego. Będziesz musiał podjąć pewne decyzje dotyczące tego, co robić w nakładających się obszarach, ale ułatwi to odfiltrowanie tła.
+0

Dziękuję, maksimum elementarne działa dobrze, jeśli ustawię limity kolorów odwzorowujące ujemne wartości na zero. Czy masz pojęcie, jak mogę zapobiec "ściśnięciu" wyświetlania atomów na granicy działki, jak widać w lewym górnym i prawym dolnym panelu mojej aktualizacji? – imant

+0

Przykro mi, że nie wiem wystarczająco dużo o atomach gabor, aby udzielić porady na temat "ściśniętych" atomów. Wyobrażam sobie, że dla pewnych wartości parametrów * a *, * b *, * g *, funkcja [gabor] (https://en.wikipedia.org/wiki/Gabor_atom) po prostu pokazuje to zachowanie. – Cecilia

+0

Ponieważ pomogłeś mi znacznie w wizualizacji w Matlab, akceptuję twoją odpowiedź, która wraz z aktualizacją mojego pytania rozwiązuje mój problem prawie całkowicie. Dzięki jeszcze raz. – imant

-2

P. W jaki sposób mogę połączyć wykresy pojedynczych obrazów w jedną wizualizację?

A. Użyj wykresu pomocniczego, aby narysować wiele wykresów, znajdź poniżej próbki z 2 na 2 działkami na rysunku. Zmień swoje równania w kodzie

x = linspace(-5,5); 
y1 = sin(x); 
subplot(2,2,1) 
plot(x,y1) 
title('First subplot') 

y2 = sin(2*x); 
subplot(2,2,2) 
plot(x,y2) 
title('Second subplot') 

y3 = sin(4*x); 
subplot(2,2,3) 
plot(x,y3) 
title('Third subplot') 

y4 = sin(6*x); 
subplot(2,2,4) 
plot(x,y4) 
title('Fourth subplot') 
+0

Jeśli przyjrzysz się uważnie, zauważysz, że już to zrobiłem. Zamiast tego chcę pokazać wszystkie atomy na jednym wykresie, jak w pierwszym przykładzie. – imant

+0

Możesz użyć 'hold on', a następnie narysuj wszystkie cztery wykresy na jednej figurze. 'hold on' zachowuje poprzedni wykres. Gdy wszystkie zostaną narysowane, użyj 'hold off'. Podwójny przykład fali sinusoidalnej [tutaj] (https://in.mathworks.com/help/matlab/ref/hold.html?requestedDomain=www.mathworks.com) – SACn

+1

Niestety, nie jest to łatwe w przypadku wykresów imagesc. – imant