3、采样率与帧长:帧长选择的博弈论——延迟 vs 频率分辨率

好,咱们直接切入正题。

采样率和帧长,这两个参数在助听器算法里,就像一对欢喜冤家。你选了高采样率,数据量大了,延迟可能就上去了;你选了长帧长,频率分辨率是好了,但延迟也跟着涨。说白了,这就是一场博弈。

我个人习惯把这个问题叫做「帧长选择的博弈论」。你想想看,我们做嵌入式音频,尤其是助听器,最怕什么?怕用户觉得声音「慢半拍」。那种感觉,就像看视频音画不同步,非常难受。而帧长,就是决定这个「慢半拍」程度的关键因素之一。

3.1 帧长到底在影响什么?

帧长,简单理解就是算法每次处理的数据块大小。比如你设了 64 个采样点为一帧,那算法就得等攒够 64 个点才开始干活。

这直接决定了两个东西:

  • 算法延迟:帧越长,你等数据的时间就越长。这是最直观的。
  • 频率分辨率:帧越长,你能看到的频谱细节就越丰富。这是做 FFT 分析的基础。

嗯,这里要注意,这两个指标是直接冲突的。你不可能既要低延迟,又要高分辨率。必须做出取舍。

核心矛盾:

帧长每增加一倍,频率分辨率提升一倍,但算法延迟也增加一倍。

我在项目中遇到过一位产品经理,他坚持要 1ms 以内的延迟,同时又要求能分辨出 10Hz 以内的频率变化。我当时就笑了,这物理规律摆在那,神仙也难做啊。

3.2 采样率:另一个维度的博弈

采样率决定了你能处理的最高频率。助听器领域,16kHz 是主流,因为人声的绝大部分能量都在 8kHz 以内。但有些高端产品会用到 24kHz 甚至 32kHz,为了保留更多高频细节。

采样率高了,同样帧长下,延迟会降低。为什么?因为帧长是按采样点数算的,采样率高了,每个点的时间间隔就短了。比如:

采样率 帧长(点数) 帧时间(延迟) 频率分辨率
16 kHz 64 4 ms 250 Hz
16 kHz 128 8 ms 125 Hz
32 kHz 64 2 ms 500 Hz
32 kHz 128 4 ms 250 Hz

看到了吗?同样的 4ms 延迟,16kHz 下你只能得到 250Hz 的分辨率,而 32kHz 下你就能得到 250Hz 的分辨率。等等,这里好像有点绕。其实说白了,就是你可以用更高的采样率来「换取」更低的延迟,同时保持频率分辨率不变。

我的经验:

如果你对延迟要求极高(比如 3ms 以内),可以考虑把采样率提到 24kHz 或 32kHz。但代价是计算量翻倍,对芯片的 MIPS 要求更高。我曾经在一个低功耗芯片上试过 32kHz,结果电池续航直接砍半,得不偿失。

3.3 实际项目中的帧长选择策略

那到底怎么选?我一般会按这个思路来:

  1. 先定延迟预算:助听器行业有个不成文的规矩,总延迟最好控制在 10ms 以内。超过这个数,用户就会觉得「有回音」或者「声音不自然」。我个人习惯把算法延迟控制在 5ms 以内,给其他环节留点余量。
  2. 再算帧长上限:比如你选了 16kHz 采样率,5ms 延迟对应的帧长就是 80 个点。但实际中我们一般用 2 的幂次,所以 64 点或 128 点。64 点延迟 4ms,128 点延迟 8ms。嗯,这里我通常会选 64 点。
  3. 最后看频率分辨率够不够:64 点 FFT 的分辨率是 250Hz。对于助听器来说,这个分辨率在低频段(比如 250Hz 以下)是不够的。低频需要更精细的分辨率来区分不同的声音成分。

避坑指南:

我曾经在一个项目中,为了追求极致的频率分辨率,把帧长设到了 256 点。结果延迟到了 16ms,用户反馈说「听自己说话有回音」。后来我不得不改用 128 点,并配合一些后处理技巧来弥补分辨率不足的问题。所以,千万别为了一个指标牺牲了用户体验。

3.4 帧长选择的「黄金法则」

做了这么多年,我总结出几条经验,分享给你:

  • 16kHz 采样率下,64 点帧长是「万金油」:延迟 4ms,分辨率 250Hz。大部分场景都能用。
  • 如果对低频要求高,试试 128 点:延迟 8ms,分辨率 125Hz。适合做降噪和反馈抑制。
  • 别轻易用 32 点:延迟是低了,但频率分辨率太差,很多算法效果会大打折扣。
  • 帧长和 FFT 点数要匹配:一般帧长就是 FFT 点数。但有些算法会用重叠保留法,帧长可以小于 FFT 点数,这又是另一个话题了。

你想想看,其实帧长选择没有绝对的对错,只有合不合适。关键是要理解你的应用场景:是更在意延迟,还是更在意频率分辨率?

我个人习惯在项目初期,先做一个「延迟-分辨率」的权衡表,把不同帧长下的指标列出来,然后跟产品经理一起拍板。这样后面开发起来,心里也有底。

好,这一节就聊到这。下一节我们会深入讲讲,帧长选择对具体算法(比如降噪、反馈抑制)的影响。到时候我会拿实际代码出来分析,敬请期待。