我在C ++中使用自相关方法实现音高跟踪,但我正在努力编写执行自相关的实际代码行。
我有一个数组,其中包含预先录制信号的幅度值的某个数字('values'),我正在对这些值的设定数(N)执行自相关函数。
为了执行自相关,我采用原始数组并将其反转,使点0 =点N,点1 =点N-1等,此数组称为 revarray
以下是我想用数学方法做的事情:
(array[0] * revarray[0])
(array[0] * revarray[1]) + (array[1] * revarray[0])
(array[0] * revarray[2]) + (array[1] * revarray[1]) + (array[2] * revarray[0])
(array[0] * revarray[3]) + (array[1] * revarray[2]) + (array[2] * revarray[1]) + (array[3] * revarray[0])
......等等。这将对阵列[900] - >阵列[1799]等重复进行,直到对阵列中的所有样本执行自相关为止。
执行自相关的次数是:
值/ N =测量值
到目前为止,这是我的代码的相关部分
for (k = 0; k = measurements; ++k){
for (i = k*(N - 1), j = k*N; i >= 0; i--, j++){
revarray[j] = array[i];
for (a = k*N; a = k*(N - 1); ++a){
autocor[a]=0;
for (b = k*N; b = k*(N - 1); ++b){
autocor[a] += //**Here is where I'm confused**//
}
}
}
}
我知道我想继续迭代地向autocor [a]添加新值,但我的问题是需要添加的值会不断变化。我尝试过使用越来越多的计数:
for (i = (k*N); i = k*(N-1); ++i){
autocor[i] += array[i] * revarray[i-1]
}
但是我清楚地知道这个不会工作,因为当新值被添加到前一个autocor时[i]这个先前的值将是不正确的,并且当i = 0时,它将是不可能的使用revarray计算[i-1]
有什么建议吗?现在已经挣扎了一段时间。我设法让它只在单个阵列上工作(一次不取N个样本),如here所示,但我认为使用倒置数组是一种更有效的方法,我只是在努力实现自相关通过拍摄整个信号的部分。
答案 0 :(得分:0)
我不是很清楚,但我会假设您需要执行迭代次数与该数组中的元素一样多次(如果确实只有一半那么多 - 相应地调整代码)。< / p>
此外,假设N
表示数组的大小,因此最后一个元素的索引为N-1
。
循环看起来像这样:
for(size_t i = 0; i < N; ++i){
autocorr[i] = 0;
for(size_t j = 0; j <= i; ++j){
const size_t idxA = j
, idxR = i - j; // direct and reverse indices in the array
autocorr[i] += array[idxA] * array[idxR];
}
}
基本上你运行外循环的次数与array
中的元素一样多,并且对于每个迭代,你运行一个较短的循环直到外部的当前最后一个索引阵列。
现在要做的就是正确计算array
和revarray
的索引以执行计算,并在当前外循环索引中累计运行总和。