Wie kann ich meinen Viterbi -Algorithmus für die Akkorderkennung optimieren?JavaScript

Javascript-Forum
Anonymous
 Wie kann ich meinen Viterbi -Algorithmus für die Akkorderkennung optimieren?

Post by Anonymous »

Ich baue eine digitale Audio -Workstation in FL Studio und habe einen Akkorderkennungsalgorithmus. Es funktioniert so wie es ist, ist aber äußerst ineffizient, für die ich optimieren muss.[
['C', 'E'],
['E', 'G'],
['G']
]
< /code>
BeachtenG --------
E --------------
C ---------
< /code>
Der alogrithmus, den ich ausgewählt habe// Base chords; example after combination: Cmaj, Cmin .... BMaj, Bmin
const chordList: ChordInformation[] = [
{ label: 'maj', keys: [0,4,7], bias: -0.2 },
{ label: 'min', keys: [0,3,7], bias: -0.2 },
{ label: 'dim', keys: [0,3,6], bias: 0.0 },
{ label: 'maj7', keys: [0,4,7,11], bias: -0.1 },
{ label: '7', keys: [0,4,7,10], bias: 0.0 },
{ label: 'm7', keys: [0,3,7,10], bias: 0.0 },
];
< /code>
Dann gehen wir den Viterbi -Algorithmus durch, testen jeden Akkord vor (72) mit jedem Akkord nach (72), berechnen Sie das Beste und wählen Sie das als Akkordinterpretation: < /p>
// N === templates.length
for (let newSpace = 0; newSpace < N; newSpace++) {
let bestScore = Infinity, prevSpaceOfBest = -1;
for (let prevSpace = 0; prevSpace < N; prevSpace++) {
const candidate = this.chordPath[prevX][prevSpace].bestScore
+ (prevSpace === newSpace ? 0 : this.params.switchCost)
+ this.chordScores[x][newSpace];
if (candidate < bestScore) {
bestScore = candidate;
prevSpaceOfBest = prevSpace;
}
}
this.chordPath[x][newSpace] = {bestScore: bestScore, prevSpace: prevSpaceOfBest};
}
< /code>
Wie Sie auch mit nur 6 Akkorden sehen können, sind es für jede Berechnung bereits> 5000 (72x72) Vorgänge, und obwohl ich die Arrays als globales Objekt verwalte, wenn sich eine Notiz an einer Position ändert, müssen alle Positionen nach ihren Werten aktualisiert werden. Dies bedeutet, dass in einem Projekt mit 1000 Eimer-Eingaben, wenn sich die Bucket-Nummer 15 ändert, die Eimer 15-1000 aktualisiert werden muss, was zu kostspielig ist. Dies funktioniert anfangs, wir berechnen zunächst jede Emit -Punktzahl mit allen 12 Offsets, die es o (n) machen, und speichern den besten Offset für später, dann skaliert der Akkordad mit der viel kleineren Chordlistlänge in diesem Fall 6, also 6x6 für jede Interpretation. Diese Pause, wenn zwei Akkorde die gleiche kalkulierte Punktzahl haben. Hier könnte es eine Lösung mit Backtracking geben, aber ich konnte keine finden. Der 72x72 -Algorithmus funktioniert dort, wo dies fehlschlägt, da er immer jeden Pfad bis zum Ende berechnet, während der 6x6 nur einen an jedem Teil zulassen muss. Dieses Unentschieden tritt oft auf, zum Beispiel wird ein Eimer mit ['C'] für FMAJ, CMAJ, F#DIM usw. dasselbe erzielt. Ich werde dies nicht tun, weil es mir nicht klang ist. Ich habe darüber nachgedacht, nach einem Transformatoransatz zu suchen, aber ich weiß nicht, wo ich einen ausgebildeten und Open Source finden kann.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post