解读以下代码,解释一下percent的作用是干嘛的
void fft(const unsigned short arr[], unsigned int allfre_info[][2], unsigned int Fs, int num, int percent)
{
#define PI 3.14159265358979323846
int NUM = 1 << num; // 根据输入参数num计算FFT的长度,即FFT点数。
float *XI = (float *)testsram; // 定义两个浮点型数组,分别用于存储实部和虚部。这里使用了共享内存testsram,XR存储实部,XI存储虚部。
float *XR = (float *)(testsram + NUM * 4);
int i, j, k;
for (i = 0; i < 50; i++)//初始化置零 这是存储峰值信息的
{
allfre_info[i][0] = 0;
allfre_info[i][1] = 0;
}
for (i = 0; i < NUM; i++)
{
XR[i] = (float)arr[i];
// printf("%d,", arr[i]);
}
for (i = 0; i < NUM; i++)
{
k = 0;
for (j = 0; j < num; j++)
{
if (((i >> j) & 0x01) == 1)
k = k + (1 << (num - j - 1));
}
XI[k] = XR[i];
}
for (i = 0; i < NUM; i++)
{
XR[i] = XI[i];
}
int TR, TI, WR, WI;
for (int i = 0; i < num; i++)
{
int B = 1 << i;
for (int j = 0; j < B; j++)
{
int p = j * (1 << (num - i - 1)); // //旋转因子的系数
for (int k = j; k < NUM; k = k + 2 * B)
{
TR = XR[k];
TI = XI[k];
WR = XR[k + B] * FFT_COS_13[p] + XI[k + B] * FFT_COS_13[(p + (NUM / 4))]; // 旋转因子是有虚部的
WI = -XR[k + B] * FFT_COS_13[(p + (NUM / 4))] + XI[k + B] * FFT_COS_13[p];
// printf("p = %d %lf %lf %d\n\r", p, cos( (2*PI*p)/NUM ), FFT_COS_13[p], (cos( (2*PI*p)/NUM ) == FFT_COS_13[p]));
// WR= XR[k+B]*cos((2*PI*p)/NUM)+XI[k+B]*sin((2*PI*p)/NUM);//旋转因子是有虚部的
// WI=-XR[k+B]*sin((2*PI*p)/NUM)+XI[k+B]*cos((2*PI*p)/NUM);
XR[k] = (TR + WR);
XI[k] = TI + WI;
XR[k + B] = (TR - WR);
XI[k + B] = TI - WI;
}
}
}
for (i = 0; i < NUM; i++)
{
XR[i] = sqrt((XR[i] * XR[i]) + (XI[i] * XI[i]));//求模
}
{
float max = 0;
int index = 0;
float old_max;
for (int i = 1; i < NUM / 2; i++)//寻找最大值
{
index = (max > XR[i]) ? index : i;
max = (max > XR[i]) ? max : XR[i];
}
// printf("\n\n");
// for(int i = 1; i < NUM / 2; i++)
// printf("%d,", (int)XR[i]);
// printf("\n\n");
for (int i = 1; i < NUM / 2; i++)
XR[i] = XR[i] - max / percent;
old_max = max;
max = 1;
allfre_info[0][0] = 1;
allfre_info[0][1] = XR[0]; // / (NUM * pow(2, 0.5));
for (int index = 1, info_index = 1, edge_state = 0; index < NUM / 2; index++)//寻峰算法 代码的主要目的是计算特定频率范围内的能量谱,并在循环过程中更新最大值和边缘状态。
{
if (XR[index] > 0)
{
if (XR[index] >= max)
{
max = XR[index];
edge_state = 1;
}
else if (XR[index] < max && edge_state == 1)
{ //索引位置的信息存储到allfre_info数组中某点n所表示的频率为:fn=(n-1)*fs/N
allfre_info[info_index][0] = (index - 1) * (float)Fs / NUM;
// allfre_info[info_index][0] = (index);
allfre_info[info_index][1] = old_max / percent + XR[index - 1];
for (int i = 0; i < 1; i++)
{
if (index - 2 - i > 0)
allfre_info[info_index][1] += 2 * old_max / percent + XR[index + i] + XR[index - 2 - i];
}
allfre_info[info_index][1] = allfre_info[info_index][1] / (NUM / 2);//归一化幅值
info_index++;
edge_state = 0;
}
}
else
{
if (edge_state)
{
allfre_info[info_index][0] = (index - 1) * (float)Fs / NUM;
// allfre_info[info_index][0] = (index);
allfre_info[info_index][1] = ((3 * old_max / percent) + XR[index] + max + XR[index - 2]) / (NUM / 2);
info_index++;
edge_state = 0;
}
max = 1;
if (info_index >= 49)
{
break;
}
}
}
// printf("allfre_info[1][0] = %d\n\r", allfre_info[1][0]);
// if(allfre_info[1][0] <= 320 && Fs == 25000) {
// return;
// }
// printf("\n\r\n\r");
//double SUM = 0;
//int a[50] = {0};
for (int i = 1; i < 50; i++)
{
if (allfre_info[i][0])
{
// printf(" Fre = %d vpp = %d \n\r", allfre_info[i][0], allfre_info[i][1]);
// SUM += allfre_info[i][1] * abs(((int)allfre_info[i][0] - 100048) / 300);
// a[i - 1] = allfre_info[i][1];
}
else
{
// printf(" i = %d SUM = %f\n\r", i, SUM);
// allfre_info[0][1] = (u32)SUM;
// printf(" avg = %d\n\r", avg(a, i - 1, allfre_info[0][1] / (i - 1)));
// printf(" Fre = %d\n\r", allfre_info[i][0] - allfre_info[i - 1][0]);
// printf(" mf = %f\n\r", (float)(allfre_info[i][0] - allfre_info[1][0]) / 2 / (float)(allfre_info[i][0] - allfre_info[i - 1][0]) );
return;
}
}
}
}