2015-04-04 162 views
0

我刚刚在MATLAB中用fdatool设计了一个IIR滤波器,并将这些系数导出到一个头文件中。我将数组复制到MATLAB,现在我试图绘制频率响应。然而,由于某些原因,数组是多维的,我不知道如何让MATLAB处理它。MATLAB多维滤波器阵列

这是我的滤波器系数的样子:

num = [ 
    [0.7167852126947,0,0], 
    [1,-1.919646855375,1], 
    [0.4393545211166,0,0], 
    [1,-1.603319802493,1], 
    [0.03175470360035,0,0], 
    [1,-1.942960840584,1], 
    [1,0,0] 
]; 

den = [ 
    [1,0,0], 
    [1,-1.904445073337,0.9382561062801], 
    [1,0,0], 
    [1,-1.837789625289,0.8507293334097], 
    [1,0,0], 
    [1,-1.942552416592,0.9865719866549], 
    [1,0,0] 
]; 

如果他们是一维的我可以将它们传递到freqz功能的MATLAB像这样:

freqz(num,den); 

但这给我一个上述数组的错误。

绘制滤波器频率响应的最佳方法是什么?

回答

2

numden的格式,我有以下假设:

MATLAB默认的fdatool创建第二阶段的IIR滤波器和返回的第二阶段的矩阵(他们称之为SOS矩阵)。该SOS形式如下:

SOS form

同时通过MATLAB返回的SOS矩阵具有以下格式:

sos matrix

现在,您num长相酷似基质含有一部分所有b's,而den包含的(其实是a_0的)和a的。

大部分MATLAB函数(includeing的freqz功能)可以处理sos -matrices,所以这将是明智的做法,以创建SOS矩阵和调用函数:

sos = [num,den]; 
freqz(sos); 

看来这在老年人不支持MATLAB的版本。在这种情况下,你必须把它转换为tf(传递函数)格式第一:

[b,a] = sos2tf(sos); 
freqz(b,a); 
+0

这样摆脱了错误,但它仍然看上去一点也不像在的FDATool过滤器预览。我使用了以下代码: freqz(num,den,1:1:10000,48000) 这就是它的样子:http://i.imgur.com/CZwBaOh.png – codedude 2015-04-04 15:25:25

+0

只需使用'num'和你在你的问题和我发布的代码中有没有其他的变化。那么你将得到相同的预览在'fd​​atool' – hbaderts 2015-04-04 15:47:07

+0

这产生这个:http://i.imgur.com/0Eaimb2.png – codedude 2015-04-04 15:49:53