此程序多用于滤波
程序思路:
查找数组中最高频的值分两步:
1、记录数组A中各个元素的出现次数
2、找出次数最高的那个元素
先看第一步,记录数组A中各个元素的出现次数。先另外新建一个用于记录频率的数组B,初始化为全0。然后对数组A的各个元素的值,都在数组B的对应元素的值上加1,例如A[0]=2,那么B[2]的值就+1,A[1]的值还是2,那么B[2]的值就又+1。如此,把数组A循环后,就可以得到数组A中各个元素在数组中出现的次数。假如扫描完成后,B[5]==3,那么意味着数字5出现了3次。
第二步,找出次数最高的那个元素。定义一个变量Bufer用来记录频率最大值,定义一个变量Value用来记录频率最大值。然后去查找数组B哪个元素的值最大。先把B[0]的值赋给Bufer(同时,Value赋值为0),然后判断B[1]是否大于Bufer,是 把B[1]的值赋给Bufer(同时,Value赋值为0),否 Bufer维持原值,然后判断B[2],...,直到把数组的最后一个元素判断完。判断完成后,Value就是出现次数最多的那个数字,Bufer就是他出现的次数
参考代码如下:
#include <stdio.h>
/*
名称:高频值查找函数(用于滤波)
参数1:Array,传入数组的名字
参数2:ArrayLength,传入数组的长度
注意:传入的数组,它的长度要<=40,超过40,则超出部分无效,不对超出部分做扫描
返回值:返回数组中最高频的元素。返回值分3种,0、40、1至39
功能:找出数组中出现次数最多的那个数字。从Array[ArrayLength]数组中找出出现次数最多的那个值。另外,如果它的出现次数小于总次数(数组长度)的一半,则找到的高频值丢弃,返回0。另外,如果最高频的数字是大于40的 且出现次数大于总次数的一半,则固定返回40
应用场景:可用于对ADC采集的数据做滤波;也可用于对按键键值做滤波
示例:unsigned char AdcValue = 0;
unsigned char ADC[20] = { 0x07,0x42,0x07,0x07,0x07,0x64,0x07,0x32,0x07,0x52,0x07,0x42,0x07,0x07,0x9,0x07,0x07,0x32,0x07,0x52 };
AdcValue = LookFor_HighestFrequencyValue(ADC, 20);
//AdcValue最后会得到0x07
*/
unsigned char LookFor_HighestFrequencyValue(unsigned char* Array, int ArrayLength)
{
int i = 0;
unsigned char HighestFrequency_of_Number = 0; //出现频率最高的数字
int HighestFrequency_of_Value = 0; //所有数字中,出现频率最高的那个数字的频率
int FrequencyRecord[41]; //此数组用于记录每个数字出现的频率
int FrequencyRecord_ArrayLength = 41;
if (ArrayLength > 40)
{
ArrayLength = 40;
}
for (i = 0; i < 41; i++) //频率记录数组初始化
{
FrequencyRecord[i] = 0;
}
for (i = 0; i < ArrayLength; i++) //确定各个数字出现的频率次数,并存到FrequencyRecord[i]数组中
{
if (Array[i] < 40) //如果数组元素的值不超过40
{
FrequencyRecord[Array[i]]++; //把每个值出现的次数(频率)记录下来,记录完成后,假如,FrequencyRecord[5]==3,那么意味着数字5出现了3次
}
else //如果数组元素的值超过40,不论是任何值
{
FrequencyRecord[FrequencyRecord_ArrayLength - 1]++; //数组的最后一个元素用来存放大于40的数字出现的频率次数
}
}
for (i = 0; i <= FrequencyRecord_ArrayLength; i++) //找出出现次数最高的那个数字
{
if (i > 0)
{
if (FrequencyRecord[i] > HighestFrequency_of_Value)
{
HighestFrequency_of_Number = i;
HighestFrequency_of_Value = FrequencyRecord[i];
}
}
else
{
HighestFrequency_of_Number = 0;
HighestFrequency_of_Value = FrequencyRecord[0];
}
}
if (HighestFrequency_of_Value < (ArrayLength / 2)) //如果出现频率最高的数字的出现次数不足总次数的一半,就丢弃
{
HighestFrequency_of_Number = 0;
}
return HighestFrequency_of_Number;
}
void main()
{
unsigned char ADC[20] = { 0x07,0x42,0x75,0x07,0x07,0x64,0x07,0x32,0x07,0x52,0x07,0x42,0x07,0x07,0x9,0x64,0x07,0x32,0x07,0x52 };
unsigned char AdcValue = LookFor_HighestFrequencyValue(ADC, 20);
printf("The highest frequency number is %d\n", AdcValue); //打印数组中最高频的值
}