Алгоритмы для эффективного «масштабирования» или «изменения размера» массива чисел (передискретизация звука)

Выполнение обработки звука (хотя это также может быть обработка изображений) У меня есть одномерный массив чисел. быть 16-битными целыми числами со знаком, представляющими аудиосэмплы, этот вопрос может в равной степени применяться к числам с плавающей запятой или целым числам разного размера.)

Чтобы сопоставить аудио с разными частотами (например, смешать образец 44,1 кГц с отсчетом 22 кГц), Мне нужно либо растянуть, либо сжать массив значений до определенной длины.

Уменьшить массив вдвое просто: отбросить каждый второй образец.

[231, 8143, 16341, 2000, -9352, ...] => [231, 16341, -9352, ...]

Удвоение ширины массива немного менее просто: удвоить каждую запись на месте (или при желании выполнить некоторую интерполяцию между соседними «реальными» выборками).

[231, 8143, 16341, 2000, -9352, ...] => [231, 4187, 8143, 12242, 16341, ...]

Мне нужен эффективный, простой алгоритм, который обрабатывает любой коэффициент масштабирования и (в идеале) необязательно поддерживает выполнение интерполяции того или иного типа в процессе.

В моем случае используются массивы Ruby, но я с радостью возьму ответы практически на любом языке или псевдокоде.

17
задан jfs 10 December 2010 в 23:01
поделиться