互相关 C 程序不工作

标签 c arrays visual-studio-2010 signal-processing cross-correlation

我正在尝试寻找互相关性。因此,我决定制作一个示例程序,其中将 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;
    }

这是我的最终图表:-

enter image description here

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

删除“fprintf(pFile,"%f\n",arr3[tab]);”后正如 user3386109 所建议的,我得到了这个结果:- enter image description here

这是我的代码的算法:-

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

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

Step3:- 将所有 64 个结果样本相加(这里的结果是指 arr1[] 和 arr3[] 样本相乘的结果),并将其视为互相关的最终样本

第四步:- 将 arr3[] 向左侧移动 1 个位置,然后重复上述步骤。

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

现在还好吗? (我不确定..)

最佳答案

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

您可以尝试使用 google 搜索 x 相关算法。我发现了这个:

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

如果对你有帮助。

关于互相关 C 程序不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28493860/

相关文章:

c - 如何 #ifdef __builtin_prefetch 函数

Javascript获取矩阵数组的对 Angular 线

JavaScript - 设置包含数组中变量的数组

java - 我的错误在哪里?

c++ - 在动态模板数组中使用 ADT 时程序崩溃

c++ - Visual Studio C++ 多行注释

c - 除以大数后得到小数值

c++ - 堆栈溢出 - 内存中的缓冲区位置

visual-studio-2008 - 使用Visual Studio 2008和2010进行一个ASP.NET-MVC-2项目?

我可以在线程中调用函数吗? C