Matlab,在尝试实现Filter对象时出错

时间:2017-03-03 20:40:57

标签: matlab filter signal-processing

我在MATLAB中使用具有属性的数字滤波器。我使用 designfilt 设计了此过滤器。我已将过滤器对象filt(1)定义为:

 digitalFilter with properties:
            Coefficients: [20x6 double]
   Specifications:
       FrequencyResponse: 'bandpass'
         ImpulseResponse: 'iir'
              SampleRate: 1000
      PassbandFrequency1: 59.9000
          PassbandRipple: 3
    StopbandAttenuation2: 80
    StopbandAttenuation1: 80
      PassbandFrequency2: 60.0800
             FilterOrder: 40
            DesignMethod: 'ellip'

同样地,我在过滤对象下有其他过滤器,如过滤(2),过滤(3)到过滤(8)各自不同的频率。

现在,由于某种原因,当程序试图运行该行时,我收到错误:

Q = filter(filt(1),x);

其中,x是600000x1列向量,只有正负实数值(类似于长正弦波)

我得到的错误是:

Subscript indices must either be real positive integers or logicals.

Error in digitalFilter/filter (line 870)
    y = obj.FilterFunction(obj.Coefficients,x);

有人可以指出问题吗?非常感谢。

修改

designfilt

命令打开一个交互式界面,您可以在其中更改和调整筛选器要求。我优化了过滤器,并将结果保存为 .mat 文件。 [整个程序过去都是工作,是我们成功完成的一个重要项目的一部分,但是一年之后似乎无法以某种方式工作。]

我附上了filter_8th.mat文件。这里有各种过滤器。我已经预先创建了这些过滤器,因为Matlab需要花费大量时间来创建它们。

在此.mat文件中,过滤器对象命名为D_n1_50,D_n1_60,D_sig50,D_sig60等(可从工作区轻松识别。)

将这些过滤器分配给变量过滤的代码行是,例如:

filt = D_sig50

这是在循环中选择的。选择哪个过滤器取决于条件if-else结构。

the .mat file containing "filters" and the variable "x" are in this dropbox link:

1 个答案:

答案 0 :(得分:0)

问题已经解决。这是由于缺少过滤器对象字段:

                    FilterFunction:
                  FiltfiltFunction:
GetCoefficientsForAnalysisFunction:

在MATLAB 2015a中,过滤器对象中不存在这些字段。但是在MATLAB 2016a中(我正在使用,这些字段似乎是必需的。)由于文件是在MATLAB 2015a中创建后导入的,这似乎是个问题。重新创建,MATLAB 2016a中的字段解决了这个问题。这些字段也已创建。

代码跑来检查:

filt = D_sig50(1);
sf = struct(filt) ;
sf.FilterFunction

在MATLAB 2015a中创建: 输出:

                    FilterFunction: []
                  FiltfiltFunction: []
GetCoefficientsForAnalysisFunction: []

过滤器对象中的这些字段为空(在MATLAB 2016a中加载这些过滤器后)

在MATLAB 2016a中创建:

                    FilterFunction: @filterIIR
                  FiltfiltFunction: @filtfiltIIR
GetCoefficientsForAnalysisFunction: @getCoeffsForAnalysisIIR

字段现在出现在过滤器对象中,代码现在可以正常工作。