Как я могу получить более точное значение из списка взвешенных чисел? - PullRequest
0 голосов
/ 30 марта 2011

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 ]

1 голос
/ 30 марта 2011

Тебе здесь не очень ясно (ИМХО). Я не знаю, что значит «взвешивать» значения в 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, что согласуется с прогнозом от интерполяционного сплайна.

1 голос
/ 30 марта 2011

Вот примерное решение: я не вычеркнул все математические расчеты для вас, но надеюсь, что это поможет.

Приблизьте амплитуду частоты, используя интерполяционные сплайны.Это даст вам функцию между каждой соседней парой точек выборки частоты в виде суммы базовых функций для значений частоты, окружающих пару.

Это означает, что у вас есть функция 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 потенциальных экстремумов для каждого интервала.

Сканирование по всем интервалам, вычисление этого экстремума.Проверьте, попадает ли он в интервал ... если это не так, то на самом деле это не потенциальный экстремум.Теперь у вас есть список всех потенциальных внутренних максимумов.Добавьте в этот список значения на каждом узле.Максимум из этого списка будет максимальным значением интерполяционного сплайна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...