Ich habe an einer einfachen Einrichtung zur Frequenzerkennung auf dem iPhone gearbeitet. Die Analyse im Frequenzbereich unter Verwendung von FFT-Ergebnissen hat sich bei Vorhandensein von Oberwellen als etwas unzuverlässig erwiesen. Ich hatte gehofft, Cepstrum-Ergebnisse zu verwenden, um zu entscheiden, welche Grundfrequenz gespielt wird.
Ich arbeite mit AudioQueues im AudioToolbox Framework und führe die Fourier-Transformationen mit dem Accelerate Framework durch.
Mein Verfahren entspricht genau dem, was im Wikipedia-Artikel Cepstrum für das Real Power Cepstrum aufgeführt ist, nämlich: signal FT abs() square log FT abs() square power cepstrum.
Das Problem, das ich habe, ist, dass die Cepstrum-Ergebnisse extrem verrauscht sind. Ich muss die ersten und letzten 20 Werte weglassen, da sie im Vergleich zu den anderen Werten astronomisch hoch sind. Selbst nach der "Bereinigung" der Daten gibt es immer noch eine enorme Schwankungsbreite - weit mehr, als ich angesichts der ersten Grafik erwarten würde. Die Bilder unten zeigen die Visualisierungen des Frequenzbereichs und des Währungsbereichs. FFT Cepstrum
Wenn ich im Frequenzbereich einen so klaren Sieger sehe wie in diesem Diagramm, erwarte ich ein ähnlich klares Ergebnis im Währungsbereich. Ich habe A440 gespielt und würde erwarten, dass etwa Feld 82 den höchsten Wert aufweist. Die dritte Spitze des Diagramms entspricht dem Bereich 79, was nahe genug ist. Wie ich schon sagte, sind die ersten 20 oder so Bins so astronomisch groß, dass sie unbrauchbar sind, und ich musste sie aus dem Datensatz löschen, um etwas zu sehen. Eine weitere merkwürdige Eigenschaft der Cepstrum-Daten ist, dass die geraden Bins viel höher zu sein scheinen als die ungeraden Bins. Hier sind die Häufigkeitsbins von 77-86:
77: 151150.0313
78: 22385.92773
79: 298753.1875
80: 56532.72656
81: 114177.4766
82: 31222.88281
83: 4620.785156
84: 13382.5332
85: 83.668259
86: 1205.023193
Meine Frage ist, wie ich den Frequenzbereich bereinigen kann, damit meine Ergebnisse im Cepstrum-Bereich nicht so wild sind. Oder helfen Sie mir, besser zu verstehen, wie diese Ergebnisse zu interpretieren sind, wenn sie so sind, wie man es von einer Cepstrum-Analyse erwarten würde. Ich kann Beispiele für den Code, den ich verwende, posten, aber er verwendet hauptsächlich vDSP-Aufrufe und ich weiß nicht, wie hilfreich das wäre.