我有一大堆浮点数。这些数字代表某些音高。
如何检测“相似”数字的序列。就像找到相同的数字,说“小于 10”。
例如,我的列表可能看起来像这样。
0:1000
1:2100
2:2000
3:440
4:440
5:430
6:450
7:440
8:435
9:445
10:90
11:200
12:10
13:50
14:16
15:880
16:885
16:880
17:870
18:875
从索引 3 到 9 的条目非常相似(最大差异为 10)。同样,索引 15 - 18 非常相似。
我如何能够处理这样的数组并获得一些输出,告诉我每组相似数字的索引。
例如:
Sequence 1 : Start index = 3 End Index=9
Sequence 2 : Start index = 15 End Index=18
编辑1:
我第一次尝试这样做是在填充列表时这样做。我有一个长度为 5 个索引的数组。如果正在处理的下一个数字在误差范围内,我会将其添加到该数组中。当阵列已满时,我有了我的序列。这确实有效,但它非常不灵活。一个序列可以持续超过数组长度,我不知道。
float dominant=bin*(THIS->samplerate/bufferCapacity);
float closestFloat=FREQ_WITHIN_RANGE;
concurrent_note.currentfrequency=dominant;
int index= concurrent_note.count;
float lastfreq=concurrent_note.frequencylist[index];
float check=fabsf(lastfreq-concurrent_note.currentfrequency);
concurrent_note.frequencylist[index]=dominant;
if (check<=closestFloat) {
concurrent_note.currentfrequency=dominant;
concurrent_note.frequencylist[concurrent_note.count]=dominant;
concurrent_note.count++;
if (concurrent_note.count>=CONSECTUTIVE_SIMILAR_FREQ_THRESHOLD) {
//it is likely this is the same note
float averagenote=0;
for (int i=0; i<CONSECTUTIVE_SIMILAR_FREQ_THRESHOLD; i++) {
float note=concurrent_note.frequencylist[i];
averagenote+=note;
concurrent_note.frequencylist[i]=0;
}
averagenote=averagenote/CONSECTUTIVE_SIMILAR_FREQ_THRESHOLD;
[THIS frequencyChangedWithValue:averagenote attime:(inTimeStamp->mSampleTime-fft.starttime) ];
concurrent_note.count=0;
}
}else
{
concurrent_note.count=0;
}