【问题标题】:What is a "good" R value when comparing 2 signals using cross correlation?使用互相关比较 2 个信号时,什么是“好的”R 值?
【发布时间】:2010-11-20 08:07:04
【问题描述】:

我很抱歉提前有点冗长:如果你想跳过所有的背景胡言乱语,你可以在下面看到我的问题。

这几乎是我之前发布的关于如何比较两个 1D(时间相关)信号的问题的后续。我得到的答案之一是我使用了互相关函数(MATLAB 中的 xcorr)。

背景资料

也许一些背景信息会很有用:我正在尝试实现独立分量分析算法。我的非正式测试之一是 (1) 通过 (a) 生成 2 个随机向量 (1x1000),(b) 将向量组合成 2x1000 矩阵(称为“S”),然后将其乘以 2x2 混合来创建测试用例矩阵(称为“A”),给我一个新的矩阵(我们称之为“T”)。

总之:T = A * S

(2) 然后我运行 ICA 算法来生成混合矩阵的逆矩阵(称为“W”),(3) 将“T”乘以“W”以(希望)给我原始信号的重建矩阵(称为“X”)

总之:X = W * T

(4) 我现在想比较“S”和“X”。虽然“S”和“X”是 2x1000,但我只是将 S(1,:)X(1,:)S(2,:)X(2,:) 进行比较,每个都是 1x1000,使它们成为一维信号。 (我还有另一个步骤来确保这些向量是相互比较的正确向量,并且我还对信号进行了归一化)。

所以我目前的难题是如何“评分”S(1,:)X(1,:) 的匹配程度,以及 S(2,:)X(2,:) 的匹配程度。

到目前为止,我使用过类似的东西:r1 = max(abs(xcorr(S(1,:), X(1,:)))

我的问题

假设使用互相关函数是比较两个信号相似度的有效方法,那么对信号相似度进行分级的 R 值是多少?维基百科说这是一个非常主观的领域,所以我听从那些可能在这个领域有经验的人的更好判断。

正如您可能意识到的那样,我根本不是来自 EE/DSP/统计背景(我是一名医科学生),所以我现在正在经历一种“火中的洗礼”,而且我感谢我能得到的所有帮助。谢谢!

【问题讨论】:

  • 对使用“火洗礼”的赞誉

标签: algorithm matlab statistics signal-processing


【解决方案1】:

编辑:直接回答您关于 R 值的问题,见下文)

解决此问题的一种方法是使用互相关。请记住,您必须对幅度进行归一化并校正延迟:如果您有信号 S1,并且信号 S2 的形状相同,但幅度只有一半并延迟了 3 个样本,那么它们仍然是完全相关的。

例如:

>> t = 0:0.001:1;
>> y = @(t) sin(10*t).*exp(-10*t).*(t > 0);
>> S1 = y(t);
>> S2 = 0.4*y(t-0.1);
>> plot(t,S1,t,S2);

这些应该具有完美的相关系数。一种计算方法是使用最大互相关:

>> f = @(S1,S2) max(xcorr(S1,S2));

f = 

    @(S1,S2) max(xcorr(S1,S2))

>>  disp(f(S1,S1)); disp(f(S2,S2)); disp(f(S1,S2));
   12.5000

    2.0000

    5.0000

xcorr() 的最大值负责处理信号之间的时间延迟。就幅度校正而言,您可以对信号进行归一化,使它们的自互相关为 1.0,或者您可以将等效步长折叠为以下:

ρ2 = f(S1,S2)2 / (f(S1,S1)*f(S2,S2);

在这种情况下 ρ2 = 5 * 5 / (12.5 * 2) = 1.0

您可以求解 ρ 本身,即 ρ = f(S1,S2)/sqrt(f(S1,S1)*f(S2,S2)),请记住 1.0 和 -1.0 完全相关(-1.0 有相反的符号)

试试你的信号!


关于接受/拒绝使用什么阈值,这实际上取决于您拥有什么样的信号。 0.9 及更高版本相当不错,但可能会产生误导。我会考虑查看减去相关版本后得到的残余信号。您可以通过查看 xcorr() 最大值的时间索引来做到这一点:

>> t = 0:0.001:1;
>> y = @(a,t) sin(a*t).*exp(-a*t).*(t > 0);
>> S1=y(10,t);
>> S2=0.4*y(9,t-0.1);
>> f(S1,S2)/sqrt(f(S1,S1)*f(S2,S2))

ans =

    0.9959

这看起来非常适合相关性。但是让我们尝试用 S1 的缩放/移位倍数来拟合 S2:

>> [A,i]=max(xcorr(S1,S2)); tshift = i-length(S1);
>> S2fit = zeros(size(S2)); S2fit(1-tshift:end) = A/f(S1,S1)*S1(1:end+tshift);
>> plot(t,[S2; S2fit]); % fit S2 using S1 as a basis

>> plot(t,[S2-S2fit]);  % residual

残差中有一些能量;要了解多少,您可以使用它:

>> S2res=S2-S2fit;
>> dot(S2res,S2res)/dot(S2,S2)

ans =

    0.0081

>> sqrt(dot(S2res,S2res)/dot(S2,S2))

ans =

    0.0900

这表示残差的能量约为原始信号 S2 的 0.81%(均方根幅度的 9%)。 (一维信号与自身的点积将始终等于该信号与自身的互相关的最大值。)

我认为没有灵丹妙药可以回答两个信号彼此之间的相似程度,但希望我已经为您提供了一些可能适用于您的情况的想法。

【讨论】:

  • Jason S,非常感谢,这绝对是我希望得到的最彻底的答案!
  • 顺便说一句,关于时移的警告:首先,我所拥有的适用于负时移,而不是正时移。第二:我认为 xcorr() 在时间索引上使用环绕(例如,数组索引取模数组长度,因此中间有一个脉冲的样本向量与另一个具有脉冲前半部分的向量完全相关结束和开始的后半个脉冲)。当您比较信号时,这可能不是您想要的,因此您可能需要在开始/结束时用零填充向量以避免回绕。
【解决方案2】:

通常在这种情况下人们会谈论“错误接受率”和“错误拒绝率”。 第一个描述了算法对非相似信号说“相似”的次数,第二个则相反。

因此,选择阈值成为这些标准之间的权衡。要使 FAR=0,阈值应为 1,要使 FRR=0,阈值应为 -1。

因此,您可能需要确定在您的情况下可以接受 FAR 和 FRR 之间的哪种权衡,这将为阈值提供正确的值。

从数学上讲,这可以用不同的方式表达。举几个例子: 1. 将一些费率固定在可接受的值并最小化其他费率 2. 最小化 max(FRR,FAR) 3. 最小化aFRR+bFAR

【讨论】:

    【解决方案3】:

    这是一个完整的猜测 - 但我猜 max(abs(xcorr(S(1,:),X(1,:)))) > 0.8 意味着成功。只是出于好奇,max(abs(xcorr(S(1,:),X(2,:)))) 的值是多少?

    另一种验证算法的方法可能是比较 A 和 W。如果 W 计算正确,它应该是 A^-1,那么你能计算出像 |A*W - I| 这样的度量吗?也许你必须通过A*W的踪迹来归一化。

    回到你原来的问题,我来自 DSP 背景,所以我可以处理相当无噪声的信号。我知道这不是您在生物学中获得的奢侈品 :) 所以我的 0.8 猜测可能非常乐观。也许查看您所在领域的一些文献,即使它们没有完全使用互相关,也可能有用。

    【讨论】:

    • 实际上,现在,因为我只使用均匀分布的随机数的随机向量作为我的测试用例,我得到的 R 值大于 0.9(当重建数据与原始数据相当匹配时eye),当数据明显没有正确对齐时小于 0.7。我的问题是试图弄清楚是否有一种更正式的方式来描述“看起来不错”和“看起来很糟糕”,而不是说“我在比较图表时注意到了它”(因为我确信我无法逃脱)关于我必须提交的项目状态文件的某种论据)
    • 很抱歉我不能给你一个直接的数字答案。这似乎是经验无法替代的案例之一。
    【解决方案4】:

    我同意结果是主观的。涉及逐个元素的差异平方和的东西将具有一定的价值。两个相同的数组将以该形式给出 0 值。您必须决定什么值会变成“坏”。组成 2 个“还不错”的不同向量,并找到它们的互相关系数作为指导。

    (顺便说一句:如果您正在做一个相关系数,其中 1 或 -1 会很好,而 0 会很糟糕,生物统计学家告诉我,0.7 的实际值非常好。我明白这不完全是你正在做的事情,但对相关系数的评论更早出现了。)

    【讨论】:

      【解决方案5】:

      一个好的起点是通过计算每个信号的自相关执行“交叉-每个信号与其自身的相关性)。

      【讨论】:

        【解决方案6】:

        由于它们应该相等,因此相关系数应该很高,介于 0.99 和 1 之间。我也会将 max 和 abs 函数从您的计算中剔除。

        编辑: 我说得太早了。我将互相关与相关系数混淆了,这是完全不同的。我的回答可能不值钱。

        【讨论】:

        • 你的意思是评论tom10的回答吗?
        猜你喜欢
        • 1970-01-01
        • 2011-09-27
        • 2017-05-20
        • 2015-10-28
        • 2011-02-21
        • 2019-06-15
        • 2013-11-08
        • 1970-01-01
        • 2017-06-01
        相关资源
        最近更新 更多