我正在尝试找到互相关。因此,我决定制作一个示例程序,在其中将64个样本的数据复制到一个数组(arr1 [])中,现在我将这10个样本的数据进行移位并将其存储在另一个数组(arr3 [])中。因此,我得到了两个相似的样本数组,但有十个样本滞后。然后,我将arr1 []和arr3 []的每个样本相乘,并将所有64个结果相加。我将arr3 []移位了64次,每次将arr1 [[和arr3 [])相乘并相加。我将结果值存储在csv文件中,以便最终检查图形。这是我的程序:-

    #include "stdafx.h"
    #include<stdio.h>
    #include<Windows.h>
    int _tmain()
    {
        //taking data of 64 samples.
        float arr1[64] = { 0.98822 ,0.98822 ,0.98822 ,0.98822 ,0.98822 ,0.98822 ,1.00391, 0.98822 ,0.98822 ,0.972534 ,1.00391 ,1.01959 ,1.00391, 0.956848, 0.98822, 1.00391 ,1.06665 ,1.22351 ,1.03528 ,0.925476 ,0.862732 ,0.643127 ,0.611755 ,0.956848, 1.09802, 1.12939 ,1.09802 ,1.03528 ,0.98822, 0.98822 ,0.98822 ,1.00391 ,0.98822 ,1.00391 ,0.98822 ,1.00391 ,0.98822 ,0.98822 ,0.98822, 1.00391 ,0.98822 ,1.00391 ,1.00391 ,0.98822 ,1.00391 ,0.98822 ,0.98822 ,0.98822 ,0.972534 ,0.972534 ,0.98822 ,0.972534 ,0.98822 ,0.98822 ,1.00391 ,0.98822 ,1.00391 ,0.98822 ,1.00391 ,0.972534 ,0.98822 ,0.98822 ,0.972534 ,0.98822};

float arr3[64];


float res,result[64];
int count,tab,com;
//copying arr1[] into arr3[] but with 10 samples lag
        for(count = 0;count<54;count++)
        {
            arr3[count] = arr1[count+10];
        }
        for(count=0;count<10;count++)
        {
        arr3[count+54] = arr1[count];
        }
//clearing result[] so that fresh result can be store here
        for(count=0;count<64;count++)
        {

        result[count]=0;
        }
// declaring file pointer to store arr1[] in csv file
        FILE * qFile;
           qFile = fopen ("ar1.csv","w");
// storing arr1[] into csc file.
           for(tab=0;tab<64;tab++)
           {
               fprintf (qFile, "%f\n",arr1[tab]);
           }
// declaring file pointer to store arr3[] in csv file
           FILE * rFile;
           rFile = fopen ("ar3.csv","w");
// storing arr3[] into csc file.
           for(tab=0;tab<64;tab++)
           {
               fprintf (rFile, "%f\n",arr3[tab]);
           }
// declaring file pointer to store arr3[] in csv file
           FILE * pFile;
           pFile = fopen ("myfile.csv","w");

// applying cross correlation and storing it in csv file
           for(tab=0;tab<64;tab++)
           {
               fprintf (pFile, "%f\n",arr3[tab]);
                for(count=0;count<64;count++)
                {


                    if(count<(64-tab))
                    {
                    // multiplying arr1[] sample with arr3[] sample
                    res= ((arr1[count]-1)) * ((arr3[count+tab]-1));
                    // adding result in result[]
                    result[tab] += res;
                    }
                    else
                    {
                     result[tab] += res;
                    }

                }
                result[tab]= result[tab];
                // storing result in csv file
                    fprintf (pFile, "%f\n",result[tab]);

           }


        fclose(pFile);fclose(qFile);fclose(rFile);
        system("pause");
        return 0;
    }


这是我的最终图形:-



在这里,系列1是arr1 [],系列2是arr [3],系列3是最终输出。
所以,请告诉我为什么我得到了这个输出的随机图。

删除“ fprintf(pFile,”%f \ n“,arr3 [tab]);”如user3386109建议,我得到了以下结果:

这是我的代码的算法:

步骤1:-将两个信号(arr1 []和arr3 [])的每个样本都减去1。

步骤2:-从arr1 []和arr3 []中获取所有64个样本,然后将arr1 []的每个样本与arr3 []的相应样本相乘。

步骤3:-将所有64个结果样本相加(此处的结果表示arr1 []和arr3 []的样本之间相乘的结果),并将其视为互相关的最终样本

步骤4:-将arr3 []移至左侧1个位置,然后重复上述步骤。

步骤5:-重复步骤4 64次。

现在可以吗? (我不确定..)

最佳答案

您的算法是错误的。您实际上实施了错误的样本滑动。

您可以尝试与Google搜索有关x相关算法的信息。我找到了这个:

http://www.jot.fm/issues/issue_2010_03/column2.pdf

以防它对您有帮助。

08-04 09:42