кросскорреляционная программа C не работает

Я пытаюсь найти перекрестную корреляцию. Итак, я решаю сделать пример программы, в которой копирую данные 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]);" как предложил пользователь 3386109, я получил такой результат: - введите здесь описание изображения

Вот алгоритм моего кода: -

Шаг 1: - Вычтите каждую выборку обоих сигналов (arr1 [] и arr3 []) на 1.

Шаг 2: Возьмите все 64 образца из arr1[] и arr3[], затем умножьте каждый образец из arr1[] на соответствующий образец из arr3[].

Шаг 3: - Добавьте все 64 образца результатов (здесь результат означает результат умножения между образцами arr1 [] и arr3 []) и считайте его окончательным образцом взаимной корреляции.

Шаг 4: - сдвиньте arr3[] на 1 позицию влево и повторите вышеуказанные шаги.

Шаг 5: повторите шаг 4 64 раза.

Теперь нормально? (Я не уверена..)


person Tabish Saifullah    schedule 13.02.2015    source источник
comment
Пожалуйста, правильно отформатируйте свой код и удалите все лишнее — никто не хочет тратить время на то, чтобы разобраться в беспорядочном, плохо отформатированном коде.   -  person Paul R    schedule 13.02.2015
comment
В цикле, применяющем взаимную корреляцию, у вас есть fprintf(pFile,"%f\n",arr3[tab]); в начале цикла. Это нужно убрать.   -  person user3386109    schedule 13.02.2015


Ответы (1)


Ваш алгоритм неверен. Вы фактически реализуете неправильное скольжение сэмплов.

Вы можете попробовать поискать в Google об алгоритмах x-корреляции. Я нашел это:

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

в случае, если это поможет вам.

person Xxxo    schedule 13.02.2015