Gtld linearInterpolate: различия между версиями

Материал из GTL-wiki
Перейти к навигации Перейти к поиску
 
Строка 17: Строка 17:
<pre>
<pre>
function linearInterpolate(arr, M) {
function linearInterpolate(arr, M) {
//Функция для уменьшения элементов исходного массива методом линейной интерполяции (применяется для обработки аудио оказывается)
  //Функция для уменьшения элементов исходного массива методом линейной интерполяции (применяется для обработки аудио оказывается)
//arr - исходный массив данных на низкой частоте
  //arr - исходный массив данных на низкой частоте
//M - длина целевого массива данных (на высокой частоте)
  //M - длина целевого массива данных (на высокой частоте)
const result = new Array(M); //результирующий массив ограниченной длины
  const result = new Array(M); //результирующий массив ограниченной длины
const N = arr.length; //длина исходного НЧ массива
  const N = arr.length; //длина исходного НЧ массива
if (M <= 0) return []; //если целевой массив пустой, то возвращаем пустой
  if (M <= 0) return []; //если целевой массив пустой, то возвращаем пустой
if (M === 1) return [arr[0]]; //если целевой содержит один элемент, то возвращаем первый из исходного
  if (M === 1) return [arr[0]]; //если целевой содержит один элемент, то возвращаем первый из исходного
if (arr.length === 1) return new Array(M).fill(arr[0]); //если исходный массив содержит только один элемент, заполняем весь результат этим значением
  if (arr.length === 1) return new Array(M).fill(arr[0]); //если исходный массив содержит только один элемент, заполняем весь результат этим значением


for (let j = 0; j < M; j++) {
  for (let j = 0; j < M; j++) {
const x = j * (N - 1) / (M - 1); //позиция элемента в исходном массиве
    const x = j * (N - 1) / (M - 1); //позиция элемента в исходном массиве
const i = Math.floor(x); //целая часть - индекс левого соседа
    const i = Math.floor(x); //целая часть - индекс левого соседа
const frac = x - i; //дробная часть - вес правого соседа (от 0 до 1): типа расстояние в % до него
    const frac = x - i; //дробная часть - вес правого соседа (от 0 до 1): типа расстояние в % до него


//если мы на последнем элементе исходного массива, то берем его, иначе получается NaN в конце массива
    //если мы на последнем элементе исходного массива, то берем его, иначе получается NaN в конце массива
if (i === N - 1) { result[j] = arr[i] }
    if (i === N - 1) { result[j] = arr[i] }
          else { result[j] = arr[i] * (1 - frac) + arr[i + 1] * frac } //формула линейной интерполяции
    else { result[j] = arr[i] * (1 - frac) + arr[i + 1] * frac } //формула линейной интерполяции
}
  }


return result;
  return result;
}
}
</pre>
</pre>

Текущая версия от 01:54, 12 августа 2026

Краткое описание

Функция предназначена для уменьшения количества данных массива методом линейной интерполяции. Функция возвращает массив с указанным количеством элементов.

Cодержание функции может дополняться!

Синтаксис

Стандартная конструкция выглядит таким образом:

let __inter = linearInterpolate(array, M);

Аргументы

array - исходный массив данных;
M - длина целевого массива;


Содержание функции

function linearInterpolate(arr, M) {
  //Функция для уменьшения элементов исходного массива методом линейной интерполяции (применяется для обработки аудио оказывается)
  //arr - исходный массив данных на низкой частоте
  //M - длина целевого массива данных (на высокой частоте)
  const result = new Array(M); //результирующий массив ограниченной длины
  const N = arr.length; //длина исходного НЧ массива
  if (M <= 0) return []; //если целевой массив пустой, то возвращаем пустой
  if (M === 1) return [arr[0]]; //если целевой содержит один элемент, то возвращаем первый из исходного
  if (arr.length === 1) return new Array(M).fill(arr[0]); //если исходный массив содержит только один элемент, заполняем весь результат этим значением

  for (let j = 0; j < M; j++) {
    const x = j * (N - 1) / (M - 1); //позиция элемента в исходном массиве
    const i = Math.floor(x); //целая часть - индекс левого соседа
    const frac = x - i; //дробная часть - вес правого соседа (от 0 до 1): типа расстояние в % до него

    //если мы на последнем элементе исходного массива, то берем его, иначе получается NaN в конце массива
    if (i === N - 1) { result[j] = arr[i] }
    else { result[j] = arr[i] * (1 - frac) + arr[i + 1] * frac } //формула линейной интерполяции
  }

  return result;
}