第二章 抖动原理与数学模型
大家好,我是你们的老朋友。今天咱们聊聊抖动的本质。
做光学防抖这些年,我最大的感触就是——你得先懂你的敌人是谁。手持抖动,说白了就是人拿着设备时,手部肌肉不自主的微小颤动。别小看这个颤动,它足以让一张清晰的照片变成模糊的影子。
2.1 手持抖动的频谱分析
先问个问题:人的手抖到底有多快?
我早年做项目时,第一件事就是拿陀螺仪去测各种人的手抖数据。结果很有意思——
- 低频段(0.1-3 Hz):这是呼吸和身体姿态调整引起的。频率很低,但幅度很大。你想想看,深吸一口气,手会跟着抬起来一点。
- 中频段(3-8 Hz):这是手部肌肉的自然震颤。我测过几十个人,大部分人主峰在5-6 Hz附近。这是防抖系统最难啃的骨头。
- 高频段(8-20 Hz):这部分能量很小,但如果你用长焦镜头,它也会造成明显影响。
关键结论:手持抖动的能量主要集中在 1-10 Hz 范围内,峰值通常在 5-6 Hz。这是设计防抖系统时首先要记住的数字。
为什么会这样?因为人的神经系统和肌肉特性决定了这个频率范围。我见过一个有意思的实验:让测试者喝了两杯咖啡后再测,抖动幅度直接翻倍,但频率分布基本不变。这说明频率特性是生理决定的,而幅度受外界因素影响大。
2.2 角速度与位移的关系
好,现在咱们来点数学。别怕,很简单的。
手持抖动本质上是旋转运动。你的手不是平移,而是绕着某个中心在转。陀螺仪测到的是角速度 ω(t),而我们真正关心的是像面上的位移 d(t)。
它们的关系是这样的:
d(t) = f × θ(t) = f × ∫ ω(t) dt
其中 f 是镜头焦距,θ(t) 是角度。说白了,角速度积分得到角度,角度乘以焦距就是像面位移。
我踩过一个坑:早期做原型时,我直接用陀螺仪的原始角速度数据去驱动马达,结果画面抖得更厉害。后来才意识到——陀螺仪输出的是角速度,不是角度。你得做积分才行。
注意:积分会引入低频漂移。陀螺仪有零偏,积分后这个零偏会累积成巨大的角度误差。我建议用高通滤波器(截止频率 0.1 Hz 左右)先滤掉直流分量,再做积分。
实际项目中,我一般用下面这个离散积分公式:
θ[n] = θ[n-1] + ω[n] × Δt
Δt 是采样间隔。比如采样率 1 kHz,Δt = 1 ms。就这么简单。
2.3 经典抖动模型:正弦叠加模型
真实的手抖信号很复杂,但我们可以用一个模型来近似它——正弦叠加模型。
这个模型的思想是:任何周期信号都可以分解成多个正弦波的叠加。手持抖动虽然不完全周期,但在短时间(比如 1/30 秒)内,可以近似为几个主要频率的正弦波之和。
数学表达式:
θ(t) = Σ A_i × sin(2π × f_i × t + φ_i)
其中:
- A_i:第 i 个频率分量的幅度
- f_i:频率(通常取 1 Hz、5 Hz、10 Hz 等)
- φ_i:初始相位
我常用的一个简化模型是这样的:
| 频率 (Hz) | 幅度 (度) | 说明 |
|---|---|---|
| 1 | 0.5 | 呼吸和身体晃动 |
| 5 | 0.3 | 手部肌肉震颤(主峰) |
| 10 | 0.1 | 高频分量 |
用这个模型生成的信号,和真实手抖信号的频谱非常接近。我在做算法仿真时,就用这个模型来生成测试数据,效果很不错。
小技巧:仿真时给每个频率分量加一个随机相位,这样每次生成的信号都不一样,更接近真实情况。我习惯用 rand() 函数生成 φ_i,范围 0 到 2π。
下面是我画的一个知识结构图,帮你理清本章的核心逻辑:
嗯,这张图把本章的三个核心内容串起来了。你先理解频谱分析,知道抖动长什么样;然后掌握角速度到位移的转换,这是数学基础;最后用正弦叠加模型来仿真和测试你的算法。
我个人习惯在做每个新项目时,先用这个模型跑一遍仿真,验证算法能处理 1-10 Hz 范围内的抖动。如果仿真都过不了,上硬件基本也是白搭。
我曾经有个项目,仿真时只用了 5 Hz 单频信号,结果上机实测发现 1 Hz 的低频分量把系统搞崩了。从那以后,我坚持用至少三个频率叠加的模型做测试。这个习惯救了我好几次。
好了,这一章就到这里。记住:理解抖动,是做好防抖的第一步。