【发布时间】:2015-07-08 05:07:02
【问题描述】:
我在音频输入上运行时变双二阶,但在每个块的边界都有丢失。原因很明确:调用 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
【问题讨论】:
标签: matlab audio signal-processing