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
我想做一种频率直方图。我有一个二进制文件,描述了一首介于 -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