【问题标题】:Matlab, error while trying to implement a Filter objectMatlab,尝试实现过滤器对象时出错
【发布时间】:2017-03-03 20:40:56
【问题描述】:

我在 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'

同样,我在 filt 对象下还有其他过滤器,例如 filt(2)、filt(3) 到 filt(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

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

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

在这个 .mat 文件中,过滤器对象被命名为 D_n1_50、D_n1_60、D_sig50、D_sig60 等(从工作区很容易识别。)

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

filt = D_sig50

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

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

【问题讨论】:

  • "x 是一个 ... 向量,只有正数和 实数值 VS. x 必须是实数 整数或逻辑数" Don你不觉得,这可能是错误的根源吗?
  • 我不认为这是问题所在。但即便如此,我尝试使用 abs(x),但问题仍然存在。过滤器应该对具有正值和负值的 x 起作用(这些是幅度采样点)。下标索引必须是正的和逻辑的。 “x”是信号。
  • 如果没有实际数字,则无法重现错误。您是否使用名为filter 的变量?你可以通过运行这个命令来检查which filter
  • 如果 x 包含浮点数或零值,abs(x) 将无法解决问题。 x 只能包含正数整数
  • 按如下方式测试过滤器:filter(filt(1),rand(1000,1)) 这应该可以工作。

标签: matlab filter signal-processing


【解决方案1】:

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

                    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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 2018-10-20
    • 1970-01-01
    相关资源
    最近更新 更多