使用C实现暴力自相关方法

时间:2017-01-23 15:18:41

标签: c for-loop

我正在尝试使用C来实现本维基百科文章中提到的第一个自相关公式 - https://en.wikipedia.org/wiki/Autocorrelation#Properties

我确切地知道我需要用数学术语做什么,但试图将其作为一个迭代过程来实现是非常棘手的。

最终我将使用从CSV文件导入的振幅值到数组中来确定音符的音高,但是现在我使用测试数组:

int sig[] = { 0, 2, 6, 14, 25, 13, 11, 10, 5, 1 };
int N = sizeof(sig) / sizeof(sig[0]);

我现在需要像这样计算输出数组:

(sig[0] * sig[N-1]) 
(sig[0] * sig[N-2]) + (sig[1] * sig[N-1])
(sig[0] * sig[N-3]) + (sig[1] * sig[N-2]) + (sig[2] * sig[N-1])

依旧......

我尝试使用for循环实现此功能,但我不确定如何每次都添加新值。 sig [0]总是乘以sig [Nx],每次添加一个新的迭代时增加1,然后这个新的迭代将保留,并且乘以的sig [Nx]也将开始减少由1。

我知道诸如

之类的东西
int n=0;
int m=0;
int a[N];

for(m = 0; m = N-1; m++)
    for(n = N-m; n = 0; n--)
        a[N] = a[N-1] + sig[m] * sig[n-1]; 

不会工作,因为这只会将之前的计算添加到新计算中,当实际发生的是两个值相乘时,每次都会改变

有没有人有任何建议?我的主要问题是它并不是真正的迭代,因为每次迭代之间没有类似的值。

1 个答案:

答案 0 :(得分:0)

也许是这样的:

int i, j
int a[N];

for (i = 0; i <= N-1; i++) {
    a[i] = 0; 
    for (j = 0; j <= i; j++) {
        a[i] = a[i] + sig[j] * sig[N-i+j-1]; 
    }
}

与我的问题相比:

  • 将循环条件从分配更改为条件并修复了开始/结束值
  • 将输出数组的初始化添加到0
  • 修复了输出数组赋值以匹配示例公式