MATLAB 数字滤波器 直接型转并联型

手写的MATLAB dir2par函数

最近在学习数字滤波器的设计,有一道题是直接型滤波器转成并联型滤波器。
查到网上的dir2par函数还需要cplxcomp函数,才能计算。我手敲了全部代码发现效果并不好,于是自己手写了一个。

由于最近课业繁重,就不详细说了,主要说一下residuesz。
这个函数很厉害,大家可以使用doc residuesz查看它的文档。

我一直不是很喜欢help,它给出的帮助很少,而且matlab交互窗就那么大,看起来也不方便。文档的话有详细的使用方法,还有部分算法说明。看的同时也能提示英语水平 hhh。

residuez函数

这个函数说白了,就是将直接型的系统函数,分解成

MATLAB 数字滤波器 直接型转并联型_第1张图片
很多个一阶项的相加,并联型就是将这些一阶项两两合并变成二阶项。然后就没有然后了……

当然这里需要考虑奇偶的问题,如果是奇数的话,就有一个一阶项不能合并。单独处理它就好了。

贴代码

function [C,B,A]=dir2par(b,a)
% 直接型转并联型
[r,p,C]=residuez(b,a);% 直接项 常数项
% 计算r/p的长度【两者长度相同】
% 若为奇数 会留下一个一阶项(全部为实数) 不能完全两两组合
% 若为偶数 则所有项两两组合

%% 初始化
N=length(r);
% 初始化B,A
% 3列代表二阶项
A=zeros(ceil(N/2),3);B=A;

%% 求解B,A
k=1;% 遍历过程中R和P的下标
if mod(N,2)==1 % 为奇数
    for i=1:2:N-1
        % 将零点和极点分别两两组合,最后剩一个
        % r(1)和r(2),r(3)和r(4)……以此类推 r(N-2)和r(N-1)
        [B(k,:),A(k,:)]=residuez([r(i),r(i+1)],[p(i),p(i+1)],0);
        % 上一行代码的目的就是两两合并,然后分子存B,分母存A(注意是三个参数)
        k=k+1;
    end
    % 注意一阶项的处理,doc residuez可以看到极点 z^-1项的系数带负号
    % 要把这个负号重新添上
    % 补最后一项 一阶项
    B(end,:)=[r(end),0,0];
    A(end,:)=[1,-p(end),0];
else
    for i=1:2:N
        % 将零点和极点分别两两组合,最后剩一个
        % r(1)和r(2),r(3)和r(4)……以此类推 r(N-2)和r(N-1)
        [B(k,:),A(k,:)]=residuez([r(i),r(i+1)],[p(i),p(i+1)],0);
        k=k+1;
    end
end
end

中间那个三参数的使用可以看文档。

Best wishes! Happy everyday~

你可能感兴趣的:(数字信号处理,数字滤波器,直接型转并联型,MATLAB编程)