C中的一种非视觉频率直方图

kind of non-visual frequency histogram in C

我想做一种频率直方图。我有一个二进制文件,描述了一首介于 -1 和 1 之间的歌曲(例如 -0.001235 ),我想制作一个函数,例如给我 0.9 和 1 之间的值的数量。但是哪里不好呢,就是space的区间可以改变。

这就像,我想要在 -1 和 1 之间有 40 或 50 或 100 个间隔,并计算这些间隔中的双倍数。都清楚了吗? ^^'

例如:[-1,-0.9] -> 152 个值.... [-0.9,-0.8] -> 34 个值....

我已经有一个1024频率的数组了double (*tab)[1024];谢谢大家的帮助:)

首先你需要一个函数来计算 table:

一个区间内的所有频率
int countinterval( double *tab, int tabsize, double min, double max )
{
    int count = 0;
    for ( int i = 0; i < tabsize; i ++ )
    {
        if ( tab[i] >= min && tab[i] < max ) // test if frequency is in interval [min,max[
        // if ( tab[i] >= min && tab[i] <= max ) // test if frequency is in interval [min,max]
            count ++;
    }
    return count;
}

接下来你需要一个函数来对每个 table.

的结果求和
int counttabsinterval( double *tab[], int tabsize, int tabcount, double min, double max )
{
    int count = 0;
    for ( int i = 0; i < tabcount; i ++ )
        count += countinterval( tab[i], tabsize, min, max ); // sums results
    return count;
}

为您想知道频率数的每个间隔调用该函数。

double *tab[1024];
int tabsize = ???; // <- init with size of one table
int count1 = counttabsinterval( tab, tabsize, 1024, -1.0, -0.9 );
int count2 = counttabsinterval( tab, tabsize, 1024, -0.9, -0.8 );

这是一个函数,它计算长度为 table tabsize 的 table tab 的定量频率分布,并将结果存储在数组 dist 长度 distcount.

void QuantitativeFrequencyDistribution( double *tab, int tabsize, double *dist, int distcount )
{
    int count = 0;
    double intervallAmount = 2.0 / distcount;
    for ( int i = 0; i < distcount; i ++ )
    {                            
        double min = -1.0 + i*intervallAmount;
        double max = min + intervallAmount;
        dist[i] = countinterval( tab, tabsize, min, max );
    }
}

int sizeOfTab = ?;// <- init with size of table
double *tab; // <- your table
int distcount = 20; // for example
double dist[distcount];
QuantitativeFrequencyDistribution( tab, sizeOfTab, dist, distcount );

如果你有不同的 tables 和不同的长度,你想知道所有 tables 的定量频率分布,你必须为每个 [=] 调用 QuantitativeFrequencyDistribution 29=]并计算结果之和。

我实现了这两个功能。计算 N 区间值在 -1 和 1

之间出现的频率
int countInterval(double *tab, double min, double max){
    int i, count = 0;
    for (i = 0; i < POINTS; i++){
        if (tab[i] >= min && tab[i] < max) {
            count++;
        }
    }
    return count;
}

int *countWindow(double *tab){
    // interval +1
    double interv = INTERVALLES;
    int *interval = (int*)malloc(sizeof(INTERVALLES)), i, debug = 0;
    double lb = 2/interv;
    double min = -1;
    double max = min + lb;

    if (debug==1) {
        printf("lb : %f\n",lb);
    }

    for(i = 0; i < INTERVALLES; i++){
        interval[i] = countInterval(tab, min, max);
        if (debug==1) {
            printf("min = %f - max = %f - count = %d\n", min, max, interval[i]);
        }
        min += lb;
        max = min + lb;
    }
    return interval;
}

我给一个double *tab(比如10):

0.004517
0.030243
0.014862
0.005188
0.002289
0.026917
-0.013641
0.017395
0.032867
0.036072

我得到了这样的结果:

lb : 0.400000
min = -1.000000 - max = -0.600000 - count = 0
min = -0.600000 - max = -0.200000 - count = 0
min = -0.200000 - max = 0.200000 - count = 10
min = 0.200000 - max = 0.600000 - count = 0
min = 0.600000 - max = 1.000000 - count = 0