头文件
#include<stdio.h>
#include<math.h>
最大值、最小值和均值
// a是所需要计算的数组
// len是数组长度
//最大值计算
double max(double a[128], double len)
{
//定义最大值
double max_array = 0;
max_array = a[0];
//遍历数组,获取数组最大值
for (int i = 0; i < len; i++)
{
if (a[i] >= max_array)
{
max_array = a[i];
}
}
return max_array;
}
//最小值计算
double min(double a[128], double len)
{
//定义最小值
double max_array = 0;
max_array = a[0];
//遍历数组,获取数组最小值
for (int i = 0; i < len; i++)
{
if (a[i] <= max_array)
{
max_array = a[i];
}
}
return max_array;
}
//均值计算
double mean(double a[128], double len)
{
double sum = 0;
double mean = 0;
//求和
for (int i = 0; i < len; i++)
{
sum += a[i];
}
//计算均值
mean = sum / len;
return mean;
}
标准差、峰值因子和方差的计算
// a是所需要计算的数组
// len是数组长度
//标准差计算
double std_c(double a[128], double len)
{
//平均值
double mean_std;
mean_std = mean(a, len);
double temp = 0;
double Spow = 0;
for (int i = 0; i < len; i++)
{
Spow += (a[i] - mean_std)*(a[i] - mean_std);//平方累加
}
//printf("如果是总体,则标准偏差为:%lf\n", sqrt(Spow / len));
//printf("如果是样本,则标准偏差为:%lf\n", sqrt(Spow / (len - 1)));
return sqrt(Spow / (len - 1));
}
double rms(double a[128], double len)
{
double sum = 0;
double rms = 0;
for (int i = 0; i < 128; i++)
{
sum += pow(fabs(a[i]),2);
}
rms = sqrt(sum / len);
return rms;
}
// 峰值因子计算
double fengzhiyinzi(double a[128], double len)
{
double rms_f = rms(a, len);
double pk = max(a, len) - min(a, len);
double f = pk / rms_f;
return f;
}
//方差计算
double var(double a[128], double len)
{
double mean_var = 0;
double sum = 0;
double var_result = 0;
//均值
mean_var = mean(a, len);
for (int i = 0; i < 128; i++)
{
sum += pow(fabs(a[i]-mean_var), 2);
}
var_result = sum / (len - 1);
return var_result;
}
百分位数的计算好像不止一种,这里采用方式和matlab中计算百分数的方式一致
double prctile(double copy_a[128], double b[128], double len, double pcr)
{
double pcr_result = 0;
for (int p = 0; p < int(len); p++)
{
if ((b[p] <= pcr) & (b[p + 1] >= pcr))
{
pcr_result = copy_a[p] + ((pcr - b[p]) / (b[p + 1] - b[p]))*(copy_a[p + 1] - copy_a[p]);
}
}
return pcr_result;
}