我有一个使用FFT显示音频可视化的程序。我从FFT得到的数据转换为分贝并加权。
稍后将绘制此数据,给出类似的结果:
我遇到的问题是我希望能够选择条显示的频率范围,以及显示数据的条数。
假设我想绘制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 :(得分:0)
嗯,鉴于你给我们提供的关于你的实际数据和结构的信息很少,我们无法给你一个明确的答案,但是这里有一个从源直方图到目标(输出)直方图插值的一般思路和方法:
直方图(条形图)由具有值(Y)的条组成,每个条表示输入范围(X(i)至X(i + 1))。要在目标中插入特定的条形码:
这是用于目标栏的值。对目标直方图中的每个目标条重复此操作。