2016-04-23 16 views
1

Angenommen, ich habe zwei Eingangssignale f1 und f2. Ich könnte diese Signale hinzufügen, um ein drittes Signal f3 = f1 + f2 zu erzeugen. Ich würde dann das Spektrogramm von f3 als log(|stft(f3)|^2) berechnen.Spektrogramm von zwei Audiodateien (zusammen addiert)

Leider habe ich nicht die ursprünglichen Signale f1 und f2. Ich habe jedoch ihre Spektrogramme und B = log(|stft(f2)|^2). Was ich suche, ist eine Möglichkeit, log(|stft(f3)|^2) so genau wie möglich mit A und B anzunähern. Wenn wir etwas tun Mathe können wir ableiten:

log(|stft(f1 + f2)|^2) = log(|stft(f1) + stft(f2)|^2)

stft(f1) = x1 + i * y1 & stft(f2) = x2 + i * y2 express

... = log(|x1 + i * y1 + x2 + i * y2|^2)

... = log((x1 + x2)^2 + (y1 + y2)^2)

... = log(x1^2 + x2^2 + y1^2 + y2^2 + 2 * (x1 * x2 + y1 * y2))

zu schreiben

an dieser Stelle So konnte ich die Annäherung verwenden:

log(|stft(f3)|^2) ~ log(exp(A) + exp(B))

aber ich würde den letzten Teil 2 * (x1 * x2 + y1 * y2) ignorieren. Meine Frage ist also: Gibt es eine bessere Annäherung dafür?

Irgendwelche Ideen? Vielen Dank.

+1

Quadratische Operation ist nicht linear, und als Ergebnis erhalten Sie einen Cross-Term, der nicht separierbar ist (wie Sie herausgefunden haben). – SleuthEye

+0

Also gibt es keinen Weg? Kennst du eine kluge Annäherung? Oder etwas, das ich verwenden könnte, weil ich mit echten Audiodateien zu tun habe? – user667804

+0

Wenn die zwei Eingänge nicht korreliert sind, verschwindet der Kreuzterm. – SleuthEye

Antwort

0

Ich verstehe Ihre Notation nicht 100%, aber ich werde es versuchen. Die Addition im Zeitbereich entspricht der Addition im Frequenzbereich. Das Hinzufügen von zwei Zeitdomänensignalen x1 und x2 erzeugt ein drittes Zeitdomänensignal x3. x1, x2 und x3 haben alle ein Frequenzbereichsspektrum, F (x1), F (x2) und F (x3). F (x3) ist auch gleich F (x1) + F (x2), wobei die Addition durchgeführt wird, indem die reellen Teile von F (x1) zu den reellen Teilen von F (x2) addiert werden und die Imaginärteile von F (x1) zu den Imaginärteilen von F (x2). Wenn also x1 [0] 1 + 0j und x2 [0] 0,5 + 0,5j ist, dann ist die Summe 1,5 + 0,5j. Ausgehend von Ihrer Notation versuchen Sie, die Größen hinzuzufügen, die in diesem Beispiel | 1 + 0j | wären + | 0.5 + 0.5j | = sqrt (1 * 1) + sqrt (0,5 * 0,5 + 0,5 * 0,5) = sqrt (2) + sqrt (0,5). Offensichtlich nicht das Gleiche. Ich denke, dass Sie so etwas wie dies wollen:

log((|stft(a) + stft(b)|)^2) = log(|stft(a)|^2) + log(|stft(b)|^2) 
+0

Ich habe meine Frage umgeschrieben, um klarer zu machen, wo ich das Problem habe. Ich denke, du hast meine Frage richtig verstanden, aber deine letzte Zeile scheint falsch zu sein. Der absolute Operator ist nicht linear, oder? – user667804

0

die exp nehmen() der 2 log Größen, fügen Sie sie, dann nehmen Sie das Protokoll der Summe.

+0

Ich mache das gerade jetzt, aber es ist nicht korrekt. Ich vermisse den Kreuzterm 2 * (x1 * x2 + y1 * y2). Ich denke, dass die Annäherung gut genug sein könnte, aber wenn Sie etwas haben, das der Wahrheit ein bisschen näher ist, würde ich gerne wissen. – user667804