You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言实现音频信号处理数字延迟线:仅用长度N的buffer可行吗

仅N长度缓存实现数字延迟线的方案

完全可以实现,这也是音频块处理延迟线的标准低内存实现方式,相比2N缓存方案可以节省一半的缓存空间。

核心逻辑

你需要的延迟是N个采样点,每个输入块处理后只需要保留该块最后N个采样点给下一个块用,刚好N长度的缓存就能满足存储需求,不需要额外空间。具体处理步骤如下:

  • 先暂存当前输入块data的最后N个采样点到临时空间(N通常是几百的小数值,用栈上临时数组的开销完全可接受)
  • 把当前data里的所有采样点整体向后移动N个位置,直接用memmove即可,它原生支持重叠内存的拷贝需求
  • 把上一次存在buffer里的N个采样点复制到data的前N个位置,这就是延迟后的前N个采样点
  • 最后把第一步暂存的当前块最后N个采样点复制到buffer里,供下一个块处理时使用

实现代码

#include <string.h>

void delayline(int *data, int *buffer, unsigned blockSize, unsigned N)
{
    // 栈上临时存储当前块最后N个采样点
    int temp[N];
    // 步骤1:暂存当前块最后N个采样点
    memcpy(temp, data + blockSize - N, N * sizeof(int));
    // 步骤2:当前块所有采样点后移N位,空出前N位存放上个块的延迟采样
    memmove(data + N, data, (blockSize - N) * sizeof(int));
    // 步骤3:把上个块存在buffer的N个采样点复制到data开头
    memcpy(data, buffer, N * sizeof(int));
    // 步骤4:把当前块暂存的最后N个采样点更新到buffer,供下一个块使用
    memcpy(buffer, temp, N * sizeof(int));
}

注意事项

  • 首次调用该函数前,需要把buffer的内容全部初始化为0,避免首次输出的前N个采样点为垃圾值
  • 如果编译器不支持可变长度数组(VLA),可以把temp改成固定长度的静态数组,针对你的场景直接定义长度为441的数组即可,效率更高
  • 因你已经保证blockSize > N,不会出现内存越界问题

内容的提问来源于stack exchange,提问作者DSP novice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 20:06:03