Ich habe eine Frage bezüglich der Mathematik, die Apple in seinem speak here example verwendet.Die Mathematik hinter Apples Speak here Beispiel
Ein kleiner Hintergrund: Ich weiß, dass die durchschnittliche Leistung und Spitzenleistung von AVAudioRecorder und AVAudioPlayer in dB ist. Ich verstehe auch, warum die RMS-Leistung in dB ist und dass sie unter Verwendung von pow(10, (0.5 * avgPower))
in einen Verstärker umgewandelt werden muss.
Meine Frage Wesen:
Apple verwendet diese Formel ist es „Meter Table“
MeterTable::MeterTable(float inMinDecibels, size_t inTableSize, float inRoot)
: mMinDecibels(inMinDecibels),
mDecibelResolution(mMinDecibels/(inTableSize - 1)),
mScaleFactor(1./mDecibelResolution)
{
if (inMinDecibels >= 0.)
{
printf("MeterTable inMinDecibels must be negative");
return;
}
mTable = (float*)malloc(inTableSize*sizeof(float));
double minAmp = DbToAmp(inMinDecibels);
double ampRange = 1. - minAmp;
double invAmpRange = 1./ampRange;
double rroot = 1./inRoot;
for (size_t i = 0; i < inTableSize; ++i) {
double decibels = i * mDecibelResolution;
double amp = DbToAmp(decibels);
double adjAmp = (amp - minAmp) * invAmpRange;
mTable[i] = pow(adjAmp, rroot);
}
}
Was die Berechnungen sind alle zu schaffen - oder besser gesagt, was jeder dieser Schritte tun? Ich denke, dass mDecibelResolution
und mScaleFactor
verwendet werden, um 80dB Bereich über 400 Werte zu plotten (wenn ich mich nicht irre). Was ist jedoch die Bedeutung von , ampRange
, invAmpRange
und adjAmp
? Warum ist der i-te Eintrag in der Zähler-Tabelle "mTable[i] = pow(adjAmp, rroot);
"?
Jede Hilfe wird sehr geschätzt! :)
Vielen Dank im Voraus und Prost!
Danke für Ihre Antwort! Also, wenn ich das richtig verstehe, ist adjAmp im Wesentlichen der linear interpolierte Wert für -80 bis 0, der auf einer Skala von 0 bis 1 gezeichnet wird, um sicherzustellen, dass wir nur 400 Werte (in diesem Beispiel) auftragen? Und dann macht Rroot es im Grunde "nicht linear", aber eher eine gekrümmte Antwort? Vielen Dank! – codeBearer
Es ist falsch, eingestellte linear interpolierte Werte für -80db auf 0 zu setzen. Die linear interpolierten Werte sind für die Amplituden, die den Dezibelwerten entsprechen (mit einem Minimum bei -80). Die Umwandlung von Db zu Amp ist nicht linear (exponentiell). Die Amp-to-Adjusted Amp-Konvertierung ist eine lineare Interpolation. – Geebs
Hallo. Nochmals vielen Dank für Ihre Antwort. Ja, ich verstehe die logarithmische v/s lineare Skala und warum es wichtig ist, auf linear zu zeichnen. Was ich bestätigen wollte, war die "Antwortkurve" und die Anpassung, aber es scheint, als ob ich mich zu sehr auf die "Bedeutung der Var-Namen" konzentriert hätte. > _ <. Aber, nochmals vielen Dank für Ihre Antwort. :) – codeBearer