|
|
Grundfrequenz von Schlaginstrumenten bestimmen |
|
DannyNRW |
Forum-Anfänger
|
|
Beiträge: 12
|
|
|
|
Anmeldedatum: 05.05.19
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 18.05.2019, 12:33
Titel: Grundfrequenz von Schlaginstrumenten bestimmen
|
|
|
|
|
Hallo zusammen,
ich weiß, dass es hier schon einiges zum Thema Grundfrequenz gibt und habe die Threads dazu durchgelesen.
Ich habe mir für ein Kleinprojekt die Aufgabe gestellt, die Grundfrequenz von Schlagzeugtrommeln anhand einer gegebenen mp3-Datei zu ermitteln.
Habe also zunächst die mp3-Datei eingelesen und daraus eine FFT erzeugt sowie nach dem größten Maximum gesucht. Da dieses aber nicht zwingend der Grundton sein muss (bei der Bassdrum war dies der Fall, bei einer Snare jedoch leider nicht), stellt sich mir die Frage, wie ich nun weiter vorgehe.
Meine Überlegung wäre hier, die ganzzahligen Vielfachen bzw. Teiler des Maximums nach einem weiteren Maximum zu durchsuchen, was aufgrund der vielen Werte nicht ganz so einfach ist (meine Abtastfrequenz liegt bei 44,1kHz). Ich müsste also um die ganzzahligen Vielfachen/Teiler einen Sektor spannen, in dem ich nach weiteren Maxima suche, richtig?
Hier ein Beispiel:
Die Grafik im Anhang zeigt das Spektrum einer Snare. Das ermittelte Maximum liegt bei ca. 577Hz. Die Grundfrequenz liegt jedoch bei ca. 185Hz, die Amplitude ist dort jedoch etwas niedriger als bei 577Hz.
Ich würde nun folgendes versuchen:
Maximum aus 577Hz :2 +-29Hz,
Maximum aus 577Hz :3 +-20Hz,
Maximum aus 577Hz :4 +-15Hz,
Maximum aus 577Hz :5 +-10Hz,
Somit wäre die Anzahl der gefundenen Maxima duetlich beschränkt. Allerdings habe ich jetzt beim Schreiben dieser Nachricht das Gefühl, dass mich dies auch nicht wirklich weiterbringt, denn die Grundfrequenz soll ja automatisch ausgewertet und als Zahlenwert angezeigt werden.
Würde es mir etwas bringen, wenn ich versuche, die Hüllkurve aus dem Spektrum zu bestimmen? Sobald hier die erste Ableitung=0 ist, liegt ja ein Maximum vor. Zudem müsste wahrscheinlich die Hüllkurve vorher geglättet werden, oder?
Gar nicht so einfach... Bin für jeden guten Tipp dankbar!
Beschreibung: |
|
Download |
Dateiname: |
frequenzspektrum_snare.jpg |
Dateigröße: |
71.01 KB |
Heruntergeladen: |
328 mal |
|
|
|
|
|
DannyNRW |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 12
|
|
|
|
Anmeldedatum: 05.05.19
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 18.05.2019, 23:08
Titel:
|
|
|
|
|
So, habe mich jetzt für den Weg mit der Hüllkurve entschieden und diese auch erzeugen können. Diese liefert mir nun deutlich weniger Maxima als die Ausgangs-FFT. Mit Hilfe der Funktion findpeaks ist die Matrix aus dem angehängten Bild entstanden.
Ich möchte nun die Matrix "pks" folgendermaßen auswerten, die alle Maximalamplituden enthält (meine Grundfrequenz steckt in Index 2):
Mit dem Index 1 angefangen soll jeder weitere Amplitudenwert überprüft werden.
Wenn Wert von Index 1 kleiner als 1/3*Index 2, dann gehe weiter zu Index 2.
Wenn Wert von Index 2 kleiner als 1/3*Index 3, dann gehe weiter zu Index 3.
Wenn Wert von Index 3 kleiner als 1/3*Index 4, dann gehe weiter zu Index 4.
usw.
Da bereits die zweite Abfrage unwahr ist, soll Index 2 als Ergebnis geliefert werden.
Mit dem Ergebnis-Index wiederrum würde ich auf die Matrix "locs" zugreifen wollen, die mir den Zeiger auf die entsprechende Grundfrequenz liefern kann.
Das lässt sich doch sicher mit einer for-Schleife lösen (unser Dozent meinte, for-Schleifen sind in matlab verpönt)? Oder geht das irgendwie einfacher bzw. eleganter? Ich hoffe, ich habe mein Problem verständlich darstellen können und wäre da für Tipps dankbar.
Allen noch einen angenehmen Abend.
Daniel
Beschreibung: |
|
Download |
Dateiname: |
matrix1.jpg |
Dateigröße: |
75.49 KB |
Heruntergeladen: |
312 mal |
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 19.05.2019, 10:25
Titel:
|
|
Hallo,
wenn ich die Frage richtig verstehe:
Ansonsten klingt das eher nach while als nach for, weil du ja abbrechen willst, sobald die Bedingung einmal erfüllt war.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
|
|
|
DannyNRW |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 12
|
|
|
|
Anmeldedatum: 05.05.19
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 19.05.2019, 10:55
Titel:
|
|
Hast natürlich Recht Harald. While passt hier besser, es war schon spät .
Werde Deinen Code mal ausprobieren, Danke Dir schon mal.
|
|
|
DannyNRW |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 12
|
|
|
|
Anmeldedatum: 05.05.19
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 19.05.2019, 12:25
Titel:
|
|
Also, das ganze scheint funktioniert zu haben. Das Ausgangsargument col liefert mir den Wert 2.
Aber nochmal zum Verständnis, wie die Funktion arbeitet:
Zunächst werden die Werte in Index 1 und Index 2 verglichen.
44,5 >= 1/3*394,26 ist unwahr (die Routine läuft also weiter).
Nun werden die Werte von Index 2 und 3 miteinander verglichen.
394,26 >= 1/3*507 ist wahr (die Routine endet und liefert col=2).
Richtig interpretiert?
Was bedeutet eigentlich die 1 hinter dem Komma? Habe diese mal verändert, aber
in der Funktion scheint sich nichts zu ändern. Anbei mein Code
Danke nochmal!
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 19.05.2019, 12:36
Titel:
|
|
Hallo,
die 1 bedeutet, dass du nur das erste Mal, an dem die Bedingung erfüllt ist, wissen willst. Das steht übrigens auch in der Doku ;)
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2025
goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.
|
|