WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Grundfrequenz von Schlaginstrumenten bestimmen

 

DannyNRW
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 05.05.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.05.2019, 13:33     Titel: Grundfrequenz von Schlaginstrumenten bestimmen
  Antworten mit Zitat      
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!

frequenzspektrum_snare.jpg
 Beschreibung:

Download
 Dateiname:  frequenzspektrum_snare.jpg
 Dateigröße:  71.01 KB
 Heruntergeladen:  296 mal
Private Nachricht senden Benutzer-Profile anzeigen


DannyNRW
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 05.05.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2019, 00:08     Titel:
  Antworten mit Zitat      
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

matrix1.jpg
 Beschreibung:

Download
 Dateiname:  matrix1.jpg
 Dateigröße:  75.49 KB
 Heruntergeladen:  284 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.05.2019, 11:25     Titel:
  Antworten mit Zitat      
Hallo,

wenn ich die Frage richtig verstehe:
Code:
find(x(1:end-1) >= 1/3*x(2:end), 1)


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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
DannyNRW
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 05.05.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2019, 11:55     Titel:
  Antworten mit Zitat      
Hast natürlich Recht Harald. While passt hier besser, es war schon spät Wink.
Werde Deinen Code mal ausprobieren, Danke Dir schon mal.
Private Nachricht senden Benutzer-Profile anzeigen
 
DannyNRW
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 05.05.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2019, 13:25     Titel:
  Antworten mit Zitat      
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
Code:
[row,col,v] = find(pks(1:testlaeng-1) >= 1/3*pks(2:testlaeng),1);


Danke nochmal!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.05.2019, 13:36     Titel:
  Antworten mit Zitat      
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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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 | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 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.