已编辑的问题
我有n个相同长度的信号。
X_signal
Y_signal
...
Z_signal
我计算这些信号的最小值,并将它们的位置(及时)存储在矢量
中X = [x1 x2 x3 x4 ... x100]
Y = [y1 y2 y3 y4 ... y150]
...
Z = [z1 z2 z3 z4 ... z110]
您可以将X,Y,.. Z视为可以具有不同长度的时间序列。 我假设原始信号是相似的,如果它们的最小值几乎在同一位置。
我想知道测量这种相似性的智能方法是什么,记住X,Y,Z中的一些最小值可能只是噪声。
例如,如果X = [1 5 8 12 15 20]且Y = [1.5 5.5 7.5 10 12 15.5 20.2],它们应该是相似的,因为几乎所有的点都具有相同的值,因为Y(4)= [10 ]
如果您对Matlab中的时间码或伪代码表示赞赏,另外建议,链接等也是超级好的。
由于
原始问题
我有n个不同长度的载体。
X = [x1 x2 x3 x4 ... x100]
Y = [y1 y2 y3 y4 ... y150]
...
Z = [z1 z2 z3 z4 ... z110]
矢量(X Y ... Z)表示相应信号(X_energy,Y_energy等)的能量的最小值。
从信号X_signal,Y_signal ... Z_signal开始重新计算我计算20个样本的窗口能量,并计算得到的能量信号的最小值。
假设2个或更多的矢量相似,如果它们具有几乎相等的值(即,如果x1~ = y1,x2~ = y2等,则X和Y相似)换句话说,我假设原始信号是相似的,如果它们在相同(或几乎相同)的瞬间具有最小能量。我想知道测量这种相似性的智能方法是什么。
PS。
(x1<x2<...<x100)
如果您对Matlab中的时间码或伪代码表示赞赏,另外建议,链接等也是超级好的。
由于
答案 0 :(得分:1)
一种可能的方法(特别是如果您没有统计和/或信号处理工具箱)是使用Matlab函数生成所有向量的相关矩阵 corrcoef
由于你的矢量大小不同,你必须
零填充较小的向量,使它们与最大的
或者采用小于或等于该数字的对齐样本值 最小矢量中的值,之前的每一个中的值 计算相关性。
这取决于您的应用程序哪个程序更合适。由于您的向量按升序排序,因此可能零填充是不合适的。
然后你需要创建一个矩阵M,其中的行对应于元素,列对应于每个(零填充或采样)向量。
你可以用Matlab函数 horzcat :
来做到这一点M=horzcat(V1,V2,...Vn)
其中V1,V2,.. Vn是相同大小的每个列向量。
最后,您可以使用 corrcoef 获取所有矢量的相关矩阵:
Cmat=corrcoef(M)
this link的corrcoef的matlab文档将帮助您了解如何统计解释结果。
请注意,此方法不会考虑矢量滞后版本之间的任何相关性。
答案 1 :(得分:1)
编辑回答
现在很清楚X
向量是信号'X'的所有最小值的时间位置,Y
向量是信号'Y'的所有最小值的时间位置等。这是一些更新的代码。
实际上这个想法仍然是一样的...我们在所有信号中从最小值的所有时间位置构建线性采样时间向量(+从一些时间采样精度)...然后我们构建新信号 0.0 ),> 1.0 无处不在...最后我们使用与以前相同的相关代码。
NB速度和内存优化版现已推出here
function [RMax] = MinimaCorrelation(c, ts)
%[
% Some default resolution and time-location of minima positions
if (nargin < 2), ts = 0.1; end
if (nargin < 1), c = { [1 3 8 7 3 4 12]; [3 8 7 3]; [4 12]; [5 3 8 -3 12]; [1 3 8 7 3 4 12]; }; end
% Number of channels
n = length(c);
% Build linearly sample time vector for all time locations
minTime = min(cellfun(@min, c));
maxTime = max(cellfun(@max, c));
timeVector = minTime:ts:maxTime;
timeVector(end+1) = timeVector(end) + ts; % just to really include min and max if step is not ok
% Build new signals being '1' everywhere except at minima locations (set to '0')
s = ones(n, length(timeVector));
for ni = 1:n
for mv = c{ni}
[~, ind] = min(abs(timeVector - mv));
s(ni, ind) = 0;
end
end
% Correlation (copied 3 times to avoid biased effect on sides ==> circular shifting is ok this way)
s = [s, s, s].';
RMax = max(xcorr(s, 'coeff'), [], 1);
% Put in R(i,j) format
RMax = reshape(RMax, [n n]);
%]
end
使用默认数据,可获得:
1.0000 0.9899 0.9866 0.9829 1.0000
0.9899 1.0000 0.9833 0.9865 0.9899
0.9866 0.9833 1.0000 0.9832 0.9866
0.9829 0.9865 0.9832 1.0000 0.9829
1.0000 0.9899 0.9866 0.9829 1.0000
小心,它是强力解决方案(时间和内存消耗随着信号和时间分辨率的增加而迅速增加)。现在这个问题更清楚了,也许有人会找到更明智的答案。
原始回答
以下是使用最大cross-correlation和xcorr
例程(在信号处理工具箱中)的方法的粗略代码:
function [RMax] = xcorrmax(c)
%[
% Default signals for test
if (nargin < 1),
c = cell(0,0);
c{end+1} = [1 3 8 7 3 4 12];
c{end+1} = [3 8 7 3];
c{end+1} = [4 12];
c{end+1} = [5 3 8 -3 12];
c{end+1} = [1 3 8 7 3 4 12];
end
% Number of channels
n = length(c);
% Padding to have vectors all of the same length
% See also `padarray` to do circular/symmetric padding (i don't have image toolbox)
maxlength = max(cellfun(@length, c));
c = cellfun(@(x)myquickpad(x, maxlength), c, 'UniformOutput', false);
c = cell2mat(c.').';
% Compute cross correlation (multichannel case) and keep max value
% NB1: May also use xcov if signal mean is not important
% NB2: Normalization at lag = 0
RMax = max(xcorr(c, 'coeff'), [], 1);
% Put in R(i,j) format
RMax = reshape(RMax, [n n]);
%]
end
function [a] = myquickpad(a, maxlength)
%[
if (length(a) < maxlength)
a(maxlength) = 0;
end
%]
end
对于以下信号:
(1) [1 3 8 7 3 4 12]
(2) [3 8 7 3]
(3) [4 12]
(4) [5 3 8 -3 12]
(5) [1 3 8 7 3 4 12]
它在ith
和jth
信号之间返回以下相关矩阵R(i,j):
1.0000 0.6698 0.7402 0.8016 1.0000
0.6698 1.0000 0.8012 0.4853 0.6698
0.7402 0.8012 1.0000 0.6587 0.7402
0.8016 0.4853 0.6587 1.0000 0.8016
1.0000 0.6698 0.7402 0.8016 1.0000
一些评论:
xcorrcoef
中的归一化,例如@paisanco所示)。 xcov
代替xcorr
。