2015-09-18 3 views
1

У меня есть программа, которая отображает аудио визуализации с использованием FFT. Данные, которые я получаю от БПФ, преобразуются в децибелы и взвешиваются.Интерполяция данных с динамическим размером

Эти данные впоследствии будут нанесены дает аналогичный результат этого:

enter image description here

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

Скажем, я хочу обратить 100-1500Hz и отображать эти данные на 256 баров, я получаю индексы этих частот с этой формулой:

(int)(desiredFrequency/(samplerate/FFTsize/2.0)); // samplerate usually 44100Hz, and FFTsize can vary, but in my case 2048 

можно затем легко подключить значения и получить мой индекс -изменять из массива децибел.

В этом примере мой начальный индекс будет 100/(44100/2048/2) округленным вниз, что дает мне 9. Индекс конца будет 1500/.... = 140 (я округлю здесь, так как хочу убедиться, что частота присутствует) ,

public float[] Interpolate(float[] inData) 
{ 
    int upperFrequencyIndex = 140; 
    int lowerFrequencyIndex = 9; 
    int barCount = 256; 
    int count = upperFrequencyIndex - lowerFrequencyIndex; 

    float[] data = inData.Skip(lowerFrequencyIndex).Take(count).ToArray(); 
    // now I have the desired range in a float array. This is the decibel data which will be interpolated. 

    float[] outData = new float[barCount]; 
    // and here is the array which will hold the interpolated data. 

    // ???? 

    return outData; 
} 

Обратите внимание, что barCount > count что означает, что больше полос на каждую точку данных и что соотношение между ними почти всегда не быть целым числом. Следует отметить, что могут быть сценарии, где barCount < count, что только добавляет к моей уже обширной головной боли.

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

Некоторые указатели в правильном направлении в любой форме будут действительно оценены здесь. Мой разум просто этого не понимает.

ответ

0

Ну, учитывая, как мало информации вы дали нам о ваших фактических данных и структурах, мы не можем дать вам явный ответ, однако вот общая идея и подход к интерполяции из гистограмма источника к гистограмме цели (выходного):

Гистограмма (гистограмма) состоит из полос, которые имеют значение (Y), и каждый из них представляет входной диапазон (X (i) - X (i + 1)), , Для того, чтобы интерполировать конкретный бар в мишени:

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

Это значение, которое должно использоваться для целевой панели. Повторите это для каждой целевой панели в целевой гистограмме.

+0

Привет @rbarryyoung, я получаю, что мне нужно взять среднее значение между двумя числами в моем децибельном массиве и подключить их к выходу. Хотя я не понимаю, как это будет работать, когда количество элементов в массиве децибел, деленное на количество баров, не является целым числом.Я уточню свой вопрос с дополнительной информацией о том, что я имею в виду. – Tokfrans

Смежные вопросы