두 신호 사이의 교차 상관을 (희망 적으로) 계산하는 프로그램을 작성했습니다. 계산을 수행하는 방법에 대한 좋은 검색을 수행했지만 몇 가지 중요한 세부 사항을 파악할 수는 없었습니다. 나는 평균 계산에 특히 관심이있다. 일부 알고리즘은 모든 시프트 (또는 지연)에 대해 상관 계산을 수행하기 위해 전체 데이터 세트의 평균을 사용하는 것으로 보입니다. 즉, 그들은 일정한 평균을 사용합니다. 나는 한 번만 분모를 계산하는 알고리즘을 발견하여 나머지 지연에 대한 상수 값으로 사용했습니다. 그러나 평균 및 분모는 중첩 범위 내의 데이터 만 고려하여 반복 계산되어야한다고 생각합니다. 따라서, 나는이 프로그램을 위해 두 가지 버전을 썼다. 그들은 더 작은 지연에서 매우 유사한 결과를 나타내는 것처럼 보입니다. 어느 것이 옳은지 알고 싶습니다.상호 상관을 올바르게 계산하는 방법은 무엇입니까?
반복 평균 :
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
FILE *input1, *input2, *output;
int m = 0, n = 0, t;
float *VarA, *VarB, *Results, *Results2;
void open_inputs_and_output();
void count_and_check_lines();
void allocate_memory();
void read_data();
void allocate_memory2();
void write_output();
int main()
{
float SumAverageA = 0, SumAverageB = 0, AverageA, AverageB, SubA, SubB, SumAB = 0, SumAs = 0, SumBs = 0, Correl;
int p = 0, i, delay;
open_inputs_and_output();
count_and_check_lines();
rewind(input1);
rewind(input2);
allocate_memory();
read_data();
fclose(input1);
fclose(input2);
printf("How many lag steps from the origin do you want to calculate?\nIf you want as many steps as the number of input points, type -1.\n");
scanf("%i", &p);
if(p < -1)
{
printf("Bad number!\n");
exit(1);
}
else if(p == -1)
t = n;
else
t = p;
allocate_memory2();
printf("\nWait...\n\n");
for(delay = 0; delay < t; delay++)
{
for(i = delay; i < n; i ++)
{
SumAverageA += VarA[i];
SumAverageB += VarB[(i - delay)];
}
AverageA = SumAverageA/(n - delay);
AverageB = SumAverageB/(n - delay);
for(i = delay; i < n; i++)
{
SubA = VarA[i] - AverageA;
SubB = VarB[(i - delay)] - AverageB;
SumAB += (SubA * SubB);
SumAs += (SubA * SubA);
SumBs += (SubB * SubB);
}
Correl = SumAB/(sqrt(SumAs * SumBs));
Results[delay] = Correl;
SumAverageA = 0;
SumAverageB = 0;
SumAB = 0;
SumAs = 0;
SumBs = 0;
for(i = delay; i < n; i++)
{
SubB = VarB[i] - AverageB;
SubA = VarA[(i - delay)] - AverageA;
SumAB += (SubA * SubB);
SumAs += (SubA * SubA);
SumBs += (SubB * SubB);
}
Correl = SumAB/(sqrt(SumAs * SumBs));
Results2[delay] = Correl;
SumAverageA = 0;
SumAverageB = 0;
SumAB = 0;
SumAs = 0;
SumBs = 0;
}
printf("Calculations performed.\n");
free(VarA);
free(VarB);
write_output();
free(Results);
free(Results2);
fclose(output);
return 0;
}
void open_inputs_and_output()
{
input1 = fopen("C:\\...\\test.txt","r");
if (input1 == NULL)
{
printf("Error! Could not open input 1.\n");
exit(1);
}
else
printf("Input1 opening: OK.\n");
input2 = fopen("C:\\...\\test2.txt","r");
if (input2 == NULL)
{
printf("Error! Could not open input 2.\n");
exit(1);
}
else
printf("Input2 opening: OK.\n");
output = fopen("C:\\...\\out.txt","w");
if (output == NULL)
{
printf("Error! Could not open output.\n");
exit(1);
}
else
printf("Output opening: OK.\n");
}
void count_and_check_lines()
{
float k;
while(fscanf(input1,"%f",&k) == 1)
n++;
printf("n = %i\n", n);
while(fscanf(input2,"%f",&k) == 1)
m++;
printf("m = %i\n", m);
if(m != n)
{
printf("Error: Number of rows does not match!\n");
exit(1);
}
else
printf("Number of rows matches.\n");
}
void allocate_memory()
{
VarA = calloc(n, sizeof(float));
if(VarA == NULL)
{
printf("Could not allocate memory for VarA.\n");
exit(1);
}
VarB = calloc(m, sizeof(float));
if(VarA == NULL)
{
printf("Could not allocate memory for VarB.\n");
exit(1);
}
}
void read_data()
{
int i;
for(i = 0; i < n; i++)
fscanf(input1,"%f",&VarA[i]);
printf("Data A successfully read.\n");
for(i = 0; i < m; i++)
fscanf(input2,"%f",&VarB[i]);
printf("Data B successfully read.\n");
}
void allocate_memory2()
{
Results = calloc(t, sizeof(float));
if(Results == NULL)
{
printf("Could not allocate memory for Results.\n");
exit(1);
}
Results2 = calloc(t, sizeof(float));
if(Results2 == NULL)
{
printf("Could not allocate memory for Results2.\n");
exit(1);
}
}
void write_output()
{
int i;
for(i = t - 1; i > 0; i--)
fprintf(output,"-%i %f\n", i , Results2[i]);
for(i = 0; i < t; i++)
fprintf(output,"%i %f\n", i , Results[i]);
printf("Results written.\n");
}
상수 평균 :
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
FILE *input1, *input2, *output;
int m = 0, n = 0, t;
float *VarA, *VarB, *Results, *Results2;
void open_inputs_and_output();
void count_and_check_lines();
void allocate_memory();
void read_data();
void allocate_memory2();
void write_output();
int main()
{
float SumAverageA = 0, SumAverageB = 0, AverageA, AverageB, SubA, SubB, SumAB = 0, SumAs = 0, SumBs = 0, Correl;
int p = 0, i, delay;
open_inputs_and_output();
count_and_check_lines();
rewind(input1);
rewind(input2);
allocate_memory();
read_data();
fclose(input1);
fclose(input2);
printf("How many lag steps from the origin do you want to calculate?\nIf you want as many steps as the number of input points, type -1.\n");
scanf("%i", &p);
if(p < -1)
{
printf("Bad number!\n");
exit(1);
}
else if(p == -1)
t = n;
else
t = p;
allocate_memory2();
printf("\nWait...\n\n");
for(i = 0; i < n; i ++)
{
SumAverageA += VarA[i];
SumAverageB += VarB[i];
}
AverageA = SumAverageA/n;
AverageB = SumAverageB/n;
for(delay = 0; delay < t; delay++)
{
for(i = delay; i < n; i++)
{
SubA = VarA[i] - AverageA;
SubB = VarB[(i - delay)] - AverageB;
SumAB += (SubA * SubB);
SumAs += (SubA * SubA);
SumBs += (SubB * SubB);
}
Correl = SumAB/(sqrt(SumAs * SumBs));
Results[delay] = Correl;
SumAverageA = 0;
SumAverageB = 0;
SumAB = 0;
SumAs = 0;
SumBs = 0;
for(i = delay; i < n; i++)
{
SubB = VarB[i] - AverageB;
SubA = VarA[(i - delay)] - AverageA;
SumAB += (SubA * SubB);
SumAs += (SubA * SubA);
SumBs += (SubB * SubB);
}
Correl = SumAB/(sqrt(SumAs * SumBs));
Results2[delay] = Correl;
SumAverageA = 0;
SumAverageB = 0;
SumAB = 0;
SumAs = 0;
SumBs = 0;
}
printf("Calculations performed.\n");
free(VarA);
free(VarB);
write_output();
free(Results);
free(Results2);
fclose(output);
return 0;
}
void open_inputs_and_output()
{
input1 = fopen("C:\\...\\test.txt","r");
if (input1 == NULL)
{
printf("Error! Could not open input 1.\n");
exit(1);
}
else
printf("Input1 opening: OK.\n");
input2 = fopen("C:\\...\\test2.txt","r");
if (input2 == NULL)
{
printf("Error! Could not open input 2.\n");
exit(1);
}
else
printf("Input2 opening: OK.\n");
output = fopen("C:\\...\\out.txt","w");
if (output == NULL)
{
printf("Error! Could not open output.\n");
exit(1);
}
else
printf("Output opening: OK.\n");
}
void count_and_check_lines()
{
float k;
while(fscanf(input1,"%f",&k) == 1)
n++;
printf("n = %i\n", n);
while(fscanf(input2,"%f",&k) == 1)
m++;
printf("m = %i\n", m);
if(m != n)
{
printf("Error: Number of rows does not match!\n");
exit(1);
}
else
printf("Number of rows matches.\n");
}
void allocate_memory()
{
VarA = calloc(n, sizeof(float));
if(VarA == NULL)
{
printf("Could not allocate memory for VarA.\n");
exit(1);
}
VarB = calloc(m, sizeof(float));
if(VarA == NULL)
{
printf("Could not allocate memory for VarB.\n");
exit(1);
}
}
void read_data()
{
int i;
for(i = 0; i < n; i++)
fscanf(input1,"%f",&VarA[i]);
printf("Data A successfully read.\n");
for(i = 0; i < m; i++)
fscanf(input2,"%f",&VarB[i]);
printf("Data B successfully read.\n");
}
void allocate_memory2()
{
Results = calloc(t, sizeof(float));
if(Results == NULL)
{
printf("Could not allocate memory for Results.\n");
exit(1);
}
Results2 = calloc(t, sizeof(float));
if(Results2 == NULL)
{
printf("Could not allocate memory for Results2.\n");
exit(1);
}
}
void write_output()
{
int i;
for(i = t - 1; i > 0; i--)
fprintf(output,"-%i %f\n", i , Results2[i]);
for(i = 0; i < t; i++)
fprintf(output,"%i %f\n", i , Results[i]);
printf("Results written.\n");
}
참고 :
http://www.jot.fm/issues/issue_2010_03/column2.pdf
http://paulbourke.net/miscellaneous/correlate/
스택 오버플로에 오신 것을 환영합니다. 5 시간 이상 후에 응답을받지 못해 죄송합니다. 그것은 비교적 드문 일입니다. 당신은 각각의 방식으로 일을하는 몇 가지 알고리즘을 발견 한 것 같기 때문에, 아마도 "알고리즘이 사용되어야 할 때 각각이 맞습니다"라고 대답 할 수도 있습니다. 그리고 당신의 문제는 당신이 당신의 알고리즘에서 사용해야 할 알고리즘이 확실하지 않다는 것입니다. 상태. 어떤 참고 문헌을 읽습니까? 알고리즘이 적용될 때 그들은 무엇에 관해 말했습니까? 그들은 대안에 대해 말했고 왜 다른 것을 사용해서는 안되는가? (추가 정보를 질문에 입력하십시오. 설명이 아닙니다.) –
그들은 대체 방법에 대해 많이 말하지 않습니다. 내 방법은 상관 방정식과 상호 상관 개념의 분석에 기초한 논리적 추론 일뿐입니다. 그것은 정확할 수도 있지만 올바르지 않을 수도 있습니다. 데이터 처리 및 통계가 내 분야가 아닙니다. – user3277482