如何从加权数列表中获得更精确的值?

时间:2011-03-30 04:53:46

标签: math audio

A是增加固定值(频率)的列表。它没有均匀分步,但价值观永远不会改变。

A = 5,10,17,23,30

A中的每个值都由列表B(体积)中的相应值加权。

B = 2.2,3.5,4.4,3.2,1.1

我想计算最响的频率(A)。问题是最响亮的频率可能是14但我无法从这个数据集中得知。如何根据列表B计算列表A中最响亮的频率?

2 个答案:

答案 0 :(得分:1)

以下是解决方案的大致轮廓:我没有为你解决所有的数学问题,但我希望它有所帮助。

使用插值样条近似频率幅度。 这将为您提供每对相邻频率采样点之间的函数,作为该对周围频率值的基函数之和。

这意味着您在每个间隔上定义了函数f(x)。

f(x) = A phi_0(x) + B phi_1(x) + C phi_2(x) + D phi_3(x)

最多

0 = f'(x) = A phi_0'(x) + B phi_1(x) + C phi_2(x) + D phi_3(x)

如果使用三次样条插值,则导数将在x中为二次方。因此,您可以为每个间隔获得2个潜在极值。

扫描所有间隔,计算该极值。检查它是否落在间隔内..如果不是它真的不是潜在的极值。您现在拥有所有潜在内部最大值的列表。将每个节点的值添加到此列表中。此列表中的最大值将是插值样条曲线的最大值。

答案 1 :(得分:1)

你在这里并不是很清楚(恕我直言)。我不知道A中B的“权重”值意味着什么。我们是否假设我们将B视为A的函数?因此,我们正在寻找频率(A)使得B达到其最大值,作为A的函数?

如果是这样,这只是插值的问题,然后最大化插值。根据您可以使用的工具,您可以进行样条插值,如图所示。然后,这只是找到该样条曲线的最大值的问题。

Interpolated relationship B(A)

此样条模型表明最大值为Bmax = 4.4132,发生在A = 16.341。

或者,可以通过这些点简单地拟合插值多项式。你的曲线并不是一个4度多项式不适合的嘈杂。 (如果你有更多的观点,高阶多项式将是一个可怕的想法。那么你可以使用分段拉格朗日插值。)在MATLAB中完成,

>> P = polyfit(A,B,4)
P =
   6.6992e-05   -0.0044803     0.084249     -0.34529       2.3384

我将绘制多项式本身。

>> ezplot(@(x) polyval(P,x),[5,30])

enter image description here

我们可以通过查找导数函数的根(零值)找到最大值。由于导数是三次多项式,因此有三个根。其中只有一个是有意义的。

>> roots(polyder(P))
ans =
       31.489
       16.133
       2.5365

感兴趣的根是16.133,这与插值样条的预测一致。