2016-04-26 5 views
0

Ich versuche eine Spektrogrammanalyse an einem Song durchzuführen. Momentan habe ich einen 10 Sekunden Clip von einem Song und versuche die lokalen Peaks zu finden.Peaks in MATLAB im 3D-Spektrogramm richtig finden

Alles, was ich wirklich will lokale Maxima innerhalb einer NxN Nachbarschaft lohnt sich ein Streudiagramm haben, der Amplituden

zeigt
[y,fs] = audioread('audio_file.wav'); 
window = hamming(512); 
num_overlap = 256; 
nfft = 1024; 
[S,F,T,P] = spectrogram(y(:,1), window, num_overlap, nfft, fs, 'yaxis'); 
surf(T,F,10*log10(P), 'edgecolor', 'none'); axis tight; view(0, 90); colormap hot; 

Dies führt in das unten stehende Bild:

enter image description here

Wo die x -Achse ist natürlich Zeit [0, ~ 10], Y-Achse ist Frequenz [0,22.5 KHz] und die Z-Achse ist die Amplitude

Jetzt Was ich tun werde D ich mache gerne ein 3D-Streudiagramm über dieser Brandung, um zu zeigen, wo die Spitzen sind. Die Maße S, F, T, P sind
S: 513 x 1770 complex double
F: 513 x 1 double
T: 1 x 1770 double
P: 513 x 1770 double

Nun das ist, wo ich mir ziemlich sicher bin ich etwas tue, falsch oder nicht vollständig verstehen MATLAB.

msk = true(3,3,3); 
msk(2,2,2) = false; 
dil = imdilate(10*log10(P), msk); 
M = 10*log10(P) > dil; 

Mein Verständnis ist, dass mir ein 1 bekommen, wo meine lokale Spitze ist

Nun lasst uns einfach sagen, dass amp = 10*log10(P), würde Ich mag nur in der Lage sein scatter3 die gleiche Art und Weise zu nennen ich surfen genannt, wie so:

scatter3(T, F, amp(M)) 

aber natürlich bekomme ich X, Y and Z must be vectors of the same length. ich nehme an, dass macht Sinn für mich, so habe ich beschlossen, die Werte so oft zu wiederholen, wie sie die Achsen gleich erhalten werden mußten.

Tr = repelem(T, 513)'; 
Fr = repelem(F, 1770); 
Zr = reshape(amp, [908010, 1]); 
[pks, locs] = findpeaks(Zr); 
scatter3(Tr(locs), Fr(locs), Zr(locs)); 

Dies führt zu einem 3D-Streudiagramm wie folgt:

enter image description here

Und das ist definitiv nicht richtig, weil es viele lokalen Spitzen in der gesamten Amplitude gezeigt werden soll. Ich bin nicht wirklich sicher, was ich falsch mache, aber ich bin auch fast überzeugt, dass es einen einfacheren Weg gibt, um das zu erreichen, was ich will. Alles, was ich wirklich will, ist ein Streudiagramm lokale Maxima innerhalb einiger NxN Nachbarschaft Amplitudenwerte zu haben

+0

Wäre es möglich, den Zugriff auf diese Audio-Clip zu bekommen? Ich würde gerne in der Lage sein, Ihren Graphen zu reproduzieren und Ihnen dabei zu helfen, das zu zeichnen, was Sie wollen. Außerdem geben Sie die Maske nicht richtig an. Sie möchten eigentlich, dass das zentrale Element "wahr" und nicht "falsch" ist. Diese Technik wird als ** Nicht-Maxima-Unterdrückung ** bezeichnet, die sicherstellt, dass das zentrale Element eines Fensters der größte Wert ist, und wenn dies nicht der Fall ist, unterdrücken Sie diesen Punkt. Dies ist genau das, wonach Sie suchen, wenn Sie lokale Peaks in einer "N x N x N" 3D-Nachbarschaft von Elementen finden möchten. – rayryeng

Antwort

1

Wenn ich verstehe, wollen Sie wollen, haben Sie eine Matrix M mit lokalen Spitzen und Sie wollen streuen in die Standorte der Spitzen. Sie können die Zeile \ col jedes Peaks erhalten mit find und der lineare Index sub2ind mit:

[Fi,Ti] = find(10*log10(P) > dil); 
Pi = sub2ind(size(P),Fi,Ti); 

scatter3(T(Ti),F(Fi),amp(Pi)); 
+0

Arbeitete perfekt, danke! Mein 3x3x3 Viertel war zu kompakt, also habe ich es auf 15x15x15 geändert – ZWiki

Verwandte Themen