前段时间项目需要根据收到的频谱信号数据包解析出用来画频谱图的数据,解析之后的的数据点至少有3000多个,而对于要求来说,频谱图只是给人一个大概的趋势即可,用户不可能注意到真实数据的每一个细节,经过实验验证,频谱图只需要800多个照样能够真实反映信号的趋势,这就需要进行数据点的抽取。
抽取的大概思路是,假如要从3000个点中抽取800个点,需要将3000个点分出800份,每一份取值最高的点。
c#实现部分代码如下:
double[] newstr = new double[801];//结果数组
double k = Convert.ToDouble(800) / newlist.Count;//newlist为原数组,此段为计算个数之比
for (int i = 0; i < newlist.Count; i++)
{
double data = Convert.ToDouble(newlist[i]);
int index = Convert.ToInt32(Math.Round(Convert.ToDouble(i) * k));
if (newstr[index] == 0)
{
newstr[index] = data;
}
else
{
if (data > Convert.ToDouble(newstr[index]))//判断是否为此间隔的最大信号值
{
newstr[index] = data;
}
}
}