我有一个使用 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
的情况。 ,这只会让我已经非常头疼。
如何用两个不同大小的数组计算插值(一个是分贝数据的范围,另一个是也可以改变的柱数。不过,两者都是 float 组)
在这里非常感谢以任何形式指向正确方向的一些指示。我的头脑就是不明白这一点..
最佳答案
好吧,考虑到您向我们提供的有关您的实际数据和结构的信息很少,我们无法给您明确的答案,但是这里是从源直方图插值到目标(输出)直方图的一般思路和方法:
直方图(条形图)由具有值 (Y) 的条组成,每个条代表一个输入范围(X(i) 到 X(i+1))。在目标中插入一个特定的柱:
- 对范围完全在目标柱范围内的所有源柱求和(这可能是零柱)
- 对可能仅部分在目标范围内的源的任何柱(在高端和低端)求和,但是根据它们的源范围在目标范围内的多少对每个柱进行加权目标范围
- 将此总数除以源条的数量,包括任何结束条的部分权重。
这就是用于目标柱的值。对目标直方图中的每个目标条重复此操作。
关于c# - 动态大小的数据插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32653383/