我在音频输入上运行时变双二阶,但是在每个块的边界处都有缺失。原因很明显:调用step()时,状态变量(x1,x2,y1,y2)正在重置。
我有一个自制的M文件来运行biquads(),该文件接受并返回状态为x1,x2,y1,y2的数组。它可以工作,但是处理30秒的音频需要700秒。
当我切换到DSP系统对象时,运行时将减少到90秒,除了过滤器的状态在处理块边界处重置。我尝试使用persistent
关键字,但常规故障仍然存在。有任何想法吗?帮助文件除了立即过滤整个文件外,没有其他任何处理方法,这是不实际的,因为过滤器库的系数将在step()
的调用之间改变。谢谢你的帮助。
% create bank of biquads
persistent biquad;
if isempty(biquad)
biquad = dsp.BiquadFilter();
end
persistent biQ1;
persistent biQ2;
persistent biQ3;
if isempty(biQ1)
biQ1 = dsp.BiquadFilter();
end
if isempty(biQ2)
biQ2 = dsp.BiquadFilter();
end
if isempty(biQ3)
biQ3 = dsp.BiquadFilter();
end
for i = 1 : numBlocks
if coeffChange == 1
% calculate the filter coefficient
release(biQ{1});
release(biQ{2});
release(biQ{3});
biQ{1}.SOSMatrix = cookEQ(fs,smoothF0(i),-60,10,'peak');
biQ{2}.SOSMatrix = cookEQ(fs,2*smoothF0(i),-60,10,'peak');
biQ{3}.SOSMatrix = cookEQ(fs,3*smoothF0(i),-60,10,'peak');
end
% first one acts on original input, then done in series
release(biQ{1});
output((i-1)*overlap+1:i*overlap) = step(biQ{1},x((i-1)*overlap+1:i*overlap));
for j = 2 : 3
release(biQ{j});
output((i-1)*overlap+1:i*overlap) = step(biQ{j},output((i-1)*overlap+1:i*overlap));
end
end
最佳答案
避免双二阶处理块之间边界问题的一种方法是让每个块输出其最终状态变量(x1,x2,y1,y2)以及已处理的音频 vector ,将这些变量保存在某个地方,然后将这些变量传回给下一个块作为用于块过程初始化的附加输入参数。
但是请注意,如果双二阶变量更改了滤波器系数,则这些状态输入可能不是正确的输入。当重叠的处理块的输出使用不同的滤波器参数时,您可能需要进行交叉淡化处理。
关于matlab - 时变双二阶状态持久性,MATLAB DSP对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31257439/