互相关,0 处的尖峰?

信息处理 信号分析 傅里叶变换 互相关 C# 干涉
2022-01-30 19:41:53

首先,我必须强调,我不是编码专业的,只是信号处理的专业人士。我是一名化学家,碰巧正在从事一个涉及两者的项目。因此,请提前原谅我的问题,如果我的问题措辞不好,或者对您来说似乎微不足道(此外,我不是以英语为母语的人)。我有几个彼此不直接相关的问题,所以当我得到答案时,我可能会打开几个线程。

因此,我正在开展一个涉及激光干涉图案的项目,更重要的是,将这种图案沿水平 (x) 轴移动。这是我通过相机观察到的典型衍射图案: 典型衍射图案,1024*768 像素

我的目标是精确测量在我的实验过程中发生的这种模式的转变。为了更好地理解我的意思,我附上了一个信号从另一个偏移的例子。请记住,这里呈现的偏移大约为 40 像素,被认为是巨大的,并且在我的工作中永远不会真正发生,我通常观察到大约 0-5 像素的偏移。 两个移位信号

为了实现这个目标,我编写了一个 C# 代码来计算两个数组之间的互相关(我通过计算每个 768 像素行旁边的信号的平均值,将我的图像缩减为一条 1024 像素行)。已使用公式(使用 Accord 框架)计算了互相关:

corr(a, b) = ifft(fft(a_and_zeros) * conj(fft(b_and_zeros))).

该代码似乎有效,这是我得到的那种互相关图: 互相关图

这个特定的数字是在对两个相同的图像进行互相关时获得的(我想我可以称之为自相关,但我不确定,而且正如预期的那样,我发现了 0 个像素的偏移)。请记住,该数字是对互相关结果数组进行修改的产物,因为应用快速傅里叶变换会导致峰值在数组边缘“切成两半”。

当我放大峰值时,我的问题出现了: 放大峰值,无偏移

如您所见,峰很尖,我认为应该是平滑的。当我想观察低偏移时,这是一个问题,因为峰值的“锐度”隐藏了真正的最大值: 放大峰值,低偏移(大约 2 个像素)

当偏移变大时问题就消失了,但是我无法解释的一个非常尖锐的峰值的存在被暴露出来: 放大峰值,高偏移(大约 90 像素)

请注意,这个峰值不是来自我修改数组以使峰值居中,如果我不修改结果,它会出现在边缘。

这最终导致我的结果对于低班次(也就是我关心的班次)不现实,如下所示:

在此处输入图像描述

如您所见,事情并不完全正确(这是项目的开始,因此实验设置远非完美,代码也是如此),但趋势是存在的,我真的能够解决这个高峰问题再进一步。

所以我来找你是希望找出我的实验为什么会这样,以及我能做些什么!是否有与互相关工作方式或其他原因有关的原因?到目前为止,我在代码中找不到任何问题。

非常感谢 !

1个回答

由于您的移位将在 0-5 像素范围内,我假设您将需要一种能够为您提供子样本精度的方法。

我有一个建议让你试试。阅读我的文章Exponential Smoothing with a Wrinkle并将该技术应用于您的一维信号。在数据框中心附近的差异情况下寻找一些匹配的零交叉。您应该能够通过两个最近点的线性插值来确定过零,或者对最近的四个或五个点进行线性回归。线性插值应该足够了。您应该能够在几个过零处测量偏移。如果这是一个真正的转变,那么您计算的所有值都应该是相同的。平均它们以减轻噪音。

此方法易于编码,并且比您使用的方法所需的计算量更少。

顺便说一句,这是对您问题的一个很好的介绍。

赛德