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
相关产品推荐
相关产品推荐

