gpt4 book ai didi

objective-c - Apple 的 Speak here 示例背后的数学原理

转载 作者:技术小花猫 更新时间:2023-10-29 11:03:36 28 4
gpt4 key购买 nike

我对 Apple 在 speak here example 中使用的数学有疑问.

一点背景知识:我知道 AVAudioRecorder 和 AVAudioPlayer 返回的平均功率和峰值功率以 dB 为单位。我也理解为什么 RMS 功率以 dB 为单位并且需要使用 pow(10, (0.5 * avgPower)) 将其转换为放大器。

我的问题是:

Apple 使用这个公式来创建它的“仪表表”

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);
}
}

所有的计算是什么 - 或者更确切地说,这些步骤中的每一个是做什么的?我认为 mDecibelResolutionmScaleFactor 用于绘制超过 400 个值的 80dB 范围(除非我弄错了)。但是,inRootampRangeinvAmpRangeadjAmp有什么意义呢?此外,为什么仪表表中的第 i 个条目是“mTable[i] = pow(adjAmp, rroot);”?

非常感谢任何帮助! :)

提前致谢并干杯!

最佳答案

我问这个问题已经一个月了,感谢 Geebs 的回复! :)

所以,这与我一直在从事的一个项目有关,并且基于此的功能是在提出该问题后大约 2 天实现的。显然,我在发布结束回复时懈怠了(对此感到抱歉)。我也在 1 月 7 日发表了评论,但回想起来,我似乎对 var 名称感到困惑。 >_<。以为我会逐行回答这个问题(带图片)。 :)

所以,这里是:

//mDecibelResolution is the "weight" factor of each of the values in the meterTable.
//Here, the table is of size 400, and we're looking at values 0 to 399.
//Thus, the "weight" factor of each value is minValue / 399.


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;
}

//Allocate a table to store the 400 values
mTable = (float*)malloc(inTableSize*sizeof(float));

//Remember, "dB" is a logarithmic scale.
//If we have a range of -160dB to 0dB, -80dB is NOT 50% power!!!
//We need to convert it to a linear scale. Thus, we do pow(10, (0.05 * dbValue)), as stated in my question.

double minAmp = DbToAmp(inMinDecibels);

//For the next couple of steps, you need to know linear interpolation.
//Again, remember that all calculations are on a LINEAR scale.
//Attached is an image of the basic linear interpolation formula, and some simple equation solving.

Linear Interpolation Equation

    //As per the image, and the following line, (y1 - y0) is the ampRange - 
//where y1 = maxAmp and y0 = minAmp.
//In this case, maxAmp = 1amp, as our maxDB is 0dB - FYI: 0dB = 1amp.
//Thus, ampRange = (maxAmp - minAmp) = 1. - minAmp
double ampRange = 1. - minAmp;

//As you can see, invAmpRange is the extreme right hand side fraction on our image's "Step 3"
double invAmpRange = 1. / ampRange;

//Now, if we were looking for different values of x0, x1, y0 or y1, simply substitute it in that equation and you're good to go. :)
//The only reason we were able to get rid of x0 was because our minInterpolatedValue was 0.

//I'll come to this later.
double rroot = 1. / inRoot;

for (size_t i = 0; i < inTableSize; ++i) {
//Thus, for each entry in the table, multiply that entry with it's "weight" factor.
double decibels = i * mDecibelResolution;

//Convert the "weighted" value to amplitude using pow(10, (0.05 * decibelValue));
double amp = DbToAmp(decibels);

//This is linear interpolation - based on our image, this is the same as "Step 3" of the image.
double adjAmp = (amp - minAmp) * invAmpRange;

//This is where inRoot and rroot come into picture.
//Linear interpolation gives you a "straight line" between 2 end-points.
//rroot = 0.5
//If I raise a variable, say myValue by 0.5, it is essentially taking the square root of myValue.
//So, instead of getting a "straight line" response, by storing the square root of the value,
//we get a curved response that is similar to the one drawn in the image (note: not to scale).
mTable[i] = pow(adjAmp, rroot);
}
}

响应曲线图像:如您所见,“线性曲线”并不完全是一条曲线。 >_< Square root response image

希望这能以某种方式帮助社区。 :)

关于objective-c - Apple 的 Speak here 示例背后的数学原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13938768/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com