Gtld linearInterpolate

Материал из GTL-wiki
Версия от 05:55, 31 июля 2026; AlekseyCube (обсуждение | вклад) (Новая страница: «== Краткое описание == Функция предназначена для уменьшения количества данных массива методом линейной интерполяции. Функция возвращает массив с указанным количеством элементов. <p style="color: red>Cодержание функции может дополняться!</p> == Синтаксис == Стан...»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

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

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

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