时变双二阶状态持久性,MATLAB DSP 对象
Time-varying biquad state persistence, MATLAB DSP objects
我在音频输入上 运行ning 时变双二阶,但在每个块的边界都有丢失。原因很明显:调用 step() 时状态变量 (x1,x2,y1,y2) 正在重置。
我有一个自制的 M 文件 运行 biquads() 接受和 returns 状态为 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) 以及处理后的音频向量,将这些变量保存在某处,然后通过这些变量返回到下一个块作为额外的输入参数用于块过程的初始化。
但请注意,如果双二阶已更改滤波器系数,则这些状态输入可能不是正确的。当重叠处理块使用不同的过滤器参数时,您可能需要对它们的输出进行交叉淡化处理。
我在音频输入上 运行ning 时变双二阶,但在每个块的边界都有丢失。原因很明显:调用 step() 时状态变量 (x1,x2,y1,y2) 正在重置。
我有一个自制的 M 文件 运行 biquads() 接受和 returns 状态为 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) 以及处理后的音频向量,将这些变量保存在某处,然后通过这些变量返回到下一个块作为额外的输入参数用于块过程的初始化。
但请注意,如果双二阶已更改滤波器系数,则这些状态输入可能不是正确的。当重叠处理块使用不同的过滤器参数时,您可能需要对它们的输出进行交叉淡化处理。