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:
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:
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
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