我在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:
答案 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
字段现在出现在过滤器对象中,代码现在可以正常工作。