具有非常高阶 FIR 的快速卷积

信息处理 fft 卷积 快速卷积
2022-02-03 21:09:28

我正在研究使用 FIR 处理音频信号的重叠添加和重叠保存方法。FIR 是混响空间的测量脉冲响应,其数量级可能大于 100,000。看来,为了使 OA 工作,信号块长度必须至少是这个长度,以保持重叠量小于一个块长度。例如,如果信号块长度是 100 ms 的音频 (L = 4410),IR 是 3 s 的混响 (M = 132300),那么每个块卷积产生 127890 个输出,这些输出必须添加到后续块卷积中。我错过了什么吗?

2个回答

可以将长脉冲响应拆分为更小的片段,并使用多个并发快速卷积,将每个片段与您的音频进行卷积,正确对齐延迟,并将结果相加。

每个段(或者一个大段,如果你不把它分开的话)的情况必须是,如果 FFT 长度是N并且响应(或段)长度是,你得到的输出样本的数量每帧是无论是重叠添加还是重叠保存,情况都是如此。零填充您的脉冲响应(或分段)(使其达到长度)并对其进行 FFT。NLNL+1NLN

感谢您的回复。从那以后我发现我的担心是不必要的——你只需要一个足够长的缓冲区。我编写了以下 MATLAB 函数来处理一个输入块,并在一个大输入流上使用单独的脚本对其进行了测试。它工作得很好。

function [y,outBuffer]=overlapAdd(x,h,inBuffer)
L=length(x);
% M=length(h); add for error check
N=length(inBuffer); %N >= L+M-1
inBuffer=inBuffer+ifft(fft(h,N).*fft(x,N));
y=inBuffer(1:L);
outBuffer=[inBuffer(L+1:N); zeros(L,1)];

在我的测试案例中,块大小 L 为 4800,脉冲响应长度 M 为 240000,总信号长度为 352257。缓冲区大小为 L + M + 1 = 244799。