Я пытаюсь найти перекрестную корреляцию. Итак, я решаю сделать пример программы, в которой копирую данные 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 раза.
Теперь нормально? (Я не уверена..)
fprintf(pFile,"%f\n",arr3[tab]);
в начале цикла. Это нужно убрать. - person user3386109   schedule 13.02.2015