Уменьшение выборки двойного массива до другой длины

#c# #.net #math #interpolation

#c# #.net #математика #интерполяция

Вопрос:

У меня есть источник данных, который предоставляет множество (4096) двойных значений в массиве. Они измеряются с высоким разрешением и являются результатом БПФ. Для целей визуализации их необходимо уменьшить. (Повторное применение БПФ к необработанному сигналу здесь невозможно.) Я мог бы просто усреднить каждые n выборок и получить результирующий массив значений длины / n. Однако, чтобы обеспечить более гибкий выбор количества результирующих значений, мне нужна интерполяция.

Я просмотрел некоторую базовую информацию об этом в Википедии. Я уже знаком с 2D уменьшающей дискретизацией / интерполяцией с точки зрения пользователя в редакторах растровых изображений. Теперь мне нужно это в 1D в коде C #. Думайте об этом как об изменении (уменьшении) размера растрового изображения изображения штрихкода в формате 1D или повторной выборке файла аудиоволн.

Одна библиотека, которую я нашел рекомендуемой, — это Math.ЧИСТЫЕ цифры. Это уже используется для других задач в моем приложении, поэтому я мог бы легко использовать это. Там есть CubicSpline класс, но я понятия не имею, как его использовать.

Вопрос: Каким был бы подход к уменьшению количества выборок в double[] до произвольного числа с использованием интерполяции?

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

Может быть, использование функций растрового изображения и размера растрового изображения 1 * n является хорошим решением вместо того, чтобы напрямую обращаться к математике? Однако это потребовало бы большого преобразования данных, что снижает производительность и, вероятно, также точность. Или какая-нибудь библиотека из поля автоматической обработки?

Комментарии:

1. Существует множество способов уменьшения выборки данных, и наилучший способ часто зависит от характеристик данных, которые вы уменьшаете. Однако алгоритм «Наибольшего треугольника с тремя ячейками» обычно эффективен для уменьшения выборки для отображения. Смотрите здесь пример реализации — но есть и другие, которые вы можете поискать в Google.

2. @MatthewWatson Спасибо, эта статья очень теоретическая, и я не могу применить ее в коде. Я отредактировал свой вопрос, чтобы лучше объяснить, что я делаю.

3. Я неправильно истолковал ваш комментарий и обнаружил, что пример реализации, который вы дали, дает разумные результаты.

4. Я бы, вероятно, использовал double , а не float в реализации, имейте в виду. Я думаю, вы, возможно, уже изменили это.