matlab - 时变双二阶状态持久性,MATLAB DSP对象

标签 matlab audio signal-processing

我在音频输入上运行时变双二阶,但是在每个块的边界处都有缺失。原因很明显:调用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/

相关文章:

matlab - matlab oop中的私有(private)构造函数

c++ - 编译C dll部署MATLAB代码时出现错误C2371

matlab - 从 MuPAD 提取多项式到 Matlab

matlab - 如果我们取单个正弦波的STFT,并在实虚平面上绘制与载波频率对应的值,那么应该有多少个点?

c - 如何确定环绕声音频信号的 channel 映射( channel 到轨道分配)

matlab - 如何在 MATLAB 匿名函数中执行多条语句?

javascript - JS 中切换音频

iphone - 在iPhone应用程序中运行3/4后停止背景音乐

c# - waveOutPrepareHeader 返回 INVALPARAMS

python - 计算音频样本的平均基频