从稀疏采样数据中确定频率

时间:2011-07-21 12:20:25

标签: algorithm math statistics

我正在观察正弦变化的源,即f(x)= a sin(bx + d)+ c,并且想要确定幅度a,偏移c和周期/频率b - 偏移d是不重要的。测量稀疏,每个源的测量通常在6到12次之间,观测在(有效)随机时间,观测间隔大致在周期的四分之一到十倍之间(仅对应力,观测间隔不是恒定的)为每个来源)。在每个源中,偏移量c通常与测量误差相比非常大,而幅度变化 - 在一个极端,它们仅在测量误差的量级上,而在另一个极端,它们是误差的约二十倍。希望完全概述这个问题,如果没有,请询​​问,我会澄清。

对该问题天真地思考,测量的平均值将是对偏移c的良好估计,而测量的f(x)的最小值和最大值之间的范围的一半将是幅度的合理估计,特别是随着测量次数的增加,观察到平均值的最大偏差的前景有所改善。但是,如果振幅很小,那么在我看来,准确确定b的可能性很小,而大振幅源的前景应该更好,即使它们只观察到最小次数。

无论如何,我编写了一些代码来对周期范围内的数据进行最小二乘拟合,并且它为较大幅度的源非常有效地识别a,b和d的最佳拟合值。然而,我发现它找到了许多可能的时期,而在大多数情况下,一个是“最佳”(尽管它给出了最小误差加权残差),不同候选时期的残差差异不大大。所以我现在要做的是量化衍生期间是“假阳性”的可能性(或者,稍微不同的是,我可以得到导出期间正确的信心)。

有人对如何最好地进行有任何建议吗?我有一个想法是使用蒙特卡罗算法构建大量具有已知a,b和c值的源,构造对应于我的测量时间的样本,使得我的拟合代码拟合样本,并看看是什么我恢复正确时期的百分比。但这似乎是相当重量级的,而且我不确定除了对假阳性率给出一般感觉之外它还特别有用。

对框架的任何建议可能会有所帮助吗?我觉得这可能是Mathematica中的一两行,但(a)我不知道,(b)无法访问它。我能说流利的Java,能胜任IDL并且可以找出其他的东西......

3 个答案:

答案 0 :(得分:4)

这看起来是为在频域工作而量身定做的。应用Fourier transform并根据功率的位置确定频率,对于正弦信号源应该清楚。

ADDENDUM为了了解您的估算有多准确,我会尝试resampling方法,例如交叉验证。我认为这是你走向蒙特卡罗理念的方向;很多工作都在那里,所以希望这是一个你不需要重新发明的轮子。

答案 1 :(得分:1)

这里的诀窍是尽一切可能看起来使问题更加困难。以类似的形式重写f:

f(x) = a1*sin(b*x) + a2*cos(b*x) + c

这是基于罪的身份(u + v)。

认识到如果b已知,则估计{a1,a2,c}的问题是一个简单的LINEAR回归问题。因此,您需要做的就是使用1变量最小化工具,处理b的值,以最小化该线性回归模型中残差的平方和。有许多这样的单变量优化器可以找到。

一旦有了这些参数,很容易在原始模型中找到参数a,因为这就是你所关心的。

a = sqrt(a1^2 + a2^2)

我所描述的方案称为分区最小二乘法。

答案 2 :(得分:1)

如果您对噪音的大小和性质有合理的估计(例如带有SD西格玛的白高斯),您可以

(a)反转Hessian矩阵以估算您所在位置的误差

(b)应该能够轻松地得出适合残留物的显着性统计量。

对于(a),比较http://www.physics.utah.edu/~detar/phys6720/handouts/curve_fit/curve_fit/node6.html 对于(b),假设您的测量误差是独立的,因此它们的总和的方差是它们的方差的总和。