【问题标题】:Time-varying biquad state persistence, MATLAB DSP objects时变双二阶状态持久性,MATLAB DSP 对象
【发布时间】: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


    【解决方案1】:

    避免双二阶处理块之间边界问题的一种方法是让每个块输出其最终状态变量 (x1,x2,y1,y2) 以及处理后的音频向量,将这些变量保存在某处,然后传递这些变量返回下一个块作为附加输入参数,用于块进程的初始化。

    但请注意,如果双二阶更改了滤波器系数,则这些状态输入可能不是正确的。当重叠处理块使用不同的过滤器参数时,您可能需要对它们的输出进行交叉淡化处理。

    【讨论】:

    • 感谢 hotpaw,我最终使用了filter() 命令的标志来输出状态,并且我得到了没有间断的平滑输出。交叉淡入淡出是一个很好的技巧,它可能会使过渡更加平滑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 2020-12-17
    • 2021-12-18
    • 2011-05-25
    • 1970-01-01
    • 2021-04-05
    相关资源
    最近更新 更多