I am trying to calculate the correlation between two signals, where it returns 1 if both are the same and it will return between 0 and 1 otherwise. The problem that the two signals have different sizes so resampling is needed. I already did it but the output is not correct. Can anyone help me to implement it in an efficient way.
My code:
MaxRow = max(size(A,1),size(B,1));MaxCol = max(size(A,2),size(B,2));
NewA = resample(A,MaxRow,size(A,1));
NewB = resample(B,MaxRow,size(B,1));
NewA = resample(NewA',MaxCol,size(A,2))';
NewB = resample(NewB',MaxCol,size(B,2))';
for s = 1:MaxRow
a = NewA(s,:);
b = NewB(s,:);
c(s)=real(corr(a',b'));
end
c(isnan(c)) = 0 ;
score = mean(c);
Here is a toy example.
% Example Data
x = 0:9;
y = 1:0.1:10;
% Check if y is longer
if length(x) < length(y)
x = interp1( x, linspace( 1, length(x), length(y) ) ); % Resample x
else
y = interp1( y, linspace( 1, length(y), length(x) ) ); % Resample y
end
% Get corrcoeff
c = abs( corrcoef( x, y ) ); % Corrcoeff solution here
c = c(2,1);
% Get MSE
m = mse( x - y ); % MSE solution here
linespace
will generate indicies between 1
and length(x)
with length(y)
number of divisions.
Essentially interp1
will resample the variable to the length of the other one. The if statement will check which one needs resampling. The function corrcoef
will get the correlation coefficient of the coefficient of the 2 signals. Since corrcoef
is between 0 and 1, we need an absolute value. If you don't care about scaling and bias corrcoef
will work for you.
If you plan to use MSE
instead, then you can use the MSE
function on the error (x-y)
but it will not be between 0 and 1. Any comparison method will work with this resampling code.