16-Bit-Audio ist per Konvention normalerweise signiert.
Denken Sie darüber nach, was PCM-Audio ist: Jedes Maß ist, wie weit der Lautsprecher in diesem Moment physisch ruhen sollte. Daher ist perfekte Stille absolut jeder sich wiederholende Wert - das bedeutet, dass sich der Sprecher nicht bewegt.
0 ist dann das Zentrum der Palette, und in der Regel, wo ein Mikrofon ohne Eingabe sein sollte. -32768 ist der Sprecher so nahe wie möglich an einem Ende seiner Achse, 32767 ist es am anderen Ende.
Der sicherste Weg, Stille zu erkennen, wäre, eine Spektralanalyse über den relevanten Bereich durchzuführen und nach Perioden zu suchen, in denen keine Aktivität in irgendeinem hörbaren Frequenzbereich auftritt.
Wenn Sie Pausen zwischen Sprache suchen, dann wäre die einfachste Sache wahrscheinlich zu irgendwo wie this gehen, einen akzeptablen Frequenzbereich für Sprache (es wird angenommen, um 300Hz bis etwa 3500Hz in der Telefonie sein), Ihre Abtastrate und wie viele Multiplikationen Sie denken, dass Sie sich leisten können. Kopiere die gelieferten Koeffizienten. Z.B. Ich nahm man 37 Taps mit einem 44100 Hz Eingang über den Sprachbereich zu tun, und in C-Array umgewandelt, ich habe:
double coefficients[] = {
-0.000560, -0.001290, -0.002332, -0.003606, -0.004911, -0.005921, -0.006201,
-0.005256, -0.002610, 0.002106, 0.009059, 0.018139, 0.028924, 0.040691, 0.052479,
0.063203, 0.071794, 0.077351, 0.079274, 0.077351, 0.071794, 0.063203, 0.052479,
0.040691, 0.028924, 0.018139, 0.009059, 0.002106, -0.002610, -0.005256, -0.006201,
-0.005921, -0.004911, -0.003606, -0.002332, -0.001290, -0.000560};
Wenn es double
eingegeben wurde, für jeden Eingangsabtastwert c
Ich würde dann berechnen ein Abtastwert:
double *inputWave = ... input, an infinite array for the purposes of the example ...
double sampledValue = 0.0;
for(size_t coeff = 0; coeff < numberOfTaps; coeff++) {
sampledValue += coefficients[coeff] * inputWave[c + coeff];
}
// (where numberOfTaps = sizeof(coefficients)/sizeof(coefficients[0]),
// i.e. the number of coefficients: 37 with the array given above)
Was ich dann habe, ist ein Bandpassfilter. Nur der Teil des Signals, der den Ton im Frequenzbereich 300-3500 Hz darstellt, sollte in den Ausgangswerten verbleiben. Im wirklichen Leben ist kein solcher Filter perfekt; Erhöhen Sie die Anzahl der Koeffizienten, um die Qualität Ihres Filters zu erhöhen.
Nach dem Schneiden irrelevanter Teile des Signals konnte ich dann für längere Zeiträume von 10 suchen.
Vielen Dank, Tommy. Ich dachte, ich müsste nur die PCM-Daten mit einer Zahl direkt vergleichen, um die Pausen zwischen Sätzen zu finden. Entschuldige meine Ignoranz, aber was bedeutet "taps"? Warum sollte es 37 Wasserhähne geben?Bezieht sich das Array inputWave [] auf die PCM-Daten wie die 16-Bit-Ganzzahlen, die ich erwähnt habe? Und soll Ihr Beispielcode bestimmen, ob das Beispiel inputWave [c] Stille darstellt? Sorry für so viele Fragen und mein schlechtes Englisch. – xiaokaoy
Taps ist der Signalverarbeitungsterm für die Anzahl der Eingangsabtastwerte, die kombiniert werden, um eine Ausgangsabtastung durchzuführen. Es kommt mehr aus der Hardware-Tradition Seite der Dinge. Es muss nicht 37 sein, das ist nur der Standard auf dieser Seite. Sie sollten wahrscheinlich basierend auf subjektive Leistung wählen - mehr = besser, im Allgemeinen. Was die CPU-Leistung angeht, schauen Sie sich die SIMD-Einheit Ihres Prozessors für das Ganze an (was bedeuten kann, dass Sie eher Kurzschlüsse als Doppelpunkte verwenden, aber was auch immer). Die Ausgabe ist eine gefilterte Welle. Sie können es direkt hören. Suchen Sie längere Zeit in der Nähe von 0, um Stille zu finden. – Tommy