数据插值与动态大小

时间:2015-09-18 13:34:29

标签: c# algorithm interpolation

我有一个使用FFT显示音频可视化的程序。我从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的情况,这只会增加我已经非常痛苦的头痛。

如何使用两个不同大小的数组计算插值(一个是来自分贝数据的范围,另一个是可以改变的条数'。但是,这两个数组都是一个浮点数组)

在这里,我们真的很感激任何形式的正确方向。我的想法只是不明白这一点..

1 个答案:

答案 0 :(得分:0)

嗯,鉴于你给我们提供的关于你的实际数据和结构的信息很少,我们无法给你一个明确的答案,但是这里有一个从源直方图到目标(输出)直方图插值的一般思路和方法:

直方图(条形图)由具有值(Y)的条组成,每个条表示输入范围(X(i)至X(i + 1))。要在目标中插入特定的条形码:

  1. 求和范围完全在目标条范围内的所有源条(这可能是零条)
  2. 求源的任何柱(在高端和低端)可能只是部分在目标范围内,根据它们的源范围在目标范围
  3. 将此总数除以源条数,包括任何结束条的部分权重。
  4. 这是用于目标栏的值。对目标直方图中的每个目标条重复此操作。