【问题标题】:Matlab Butterworth filter returing NaNMatlab Butterworth滤波器返回NaN
【发布时间】:2014-04-09 23:29:41
【问题描述】:

我正在尝试在 Matlab 中应用巴特沃斯滤波器。我已按如下方式设置过滤器:

[z,p,k] = butter(5,[30/2000,1000/2000]); 

即在 30 Hz 以下和 1000 Hz 以上截断(以 2000 Hz 采样)

输入数据是更大矩阵 A 中的一列。

然后我按如下方式应用过滤器:

M=filter(z,p,A(:,2));

并且也尝试过:

M=filtfilt(z,p,A(:,2));

A 有 1577563 行。过滤器返回实际值,最高可达约 1700 行,但之后条目为 NaN。我尝试从A(:,2) 中提取一些值,这些值在 M 中生成 NaN,但是这些返回数字本身,所以我假设它与 A 的长度有关,而不是与特定值有关。这似乎是过滤函数的不稳定性,因为 NaN 的开始在不同的测试中有所不同。

我尝试过降低阶数,但使用二阶甚至一阶过滤器得到了类似的结果。

如果有办法我很乐意将数据上传到A(:,2),但是我不确定如何在 StackExchange 中执行此操作。

【问题讨论】:

  • 我猜NaN 发生在某处的0/0 操作中。我以前从未见过这种情况,请问您的信号是否静止?或者信号有多大(大约)?
  • 我将其应用于几个不同的数据集,并为每个数据集遇到相同的问题。平均信号强度为 0.1 - 1。我注意到通过将滤波器的阶数增加到 n,NaN 开始的点增加到 ~9900。
  • 好的,但是信号不仅仅取值在 0-1 之间,对吧?也就是说,它的平均值是否接近于 0?
  • 我尝试将其应用于的 4 个信号的平均值是 0.0778、0.0251、0.0419 和 0.2532。每种情况下的最大值为 0.9202、1.2755、2.2430 和 2.4905。最小值都是 10^-4 或 10^-5 的顺序。
  • 嗯,可能和你想的一样,但显然某处还有更多代码,所以对我来说很难说。

标签: matlab filter


【解决方案1】:

我完全不知道你想做什么。但是,代码和概念上存在 HUGE 问题:

  1. 黄油频率必须是采样频率的一半。这样你 正在以 2000Hz 实现 15Hz 和 500Hz 采样,我确定这不是您需要的,

  2. 您正在为filter 命令提供ZPK -zero,pole, filter- 结构,并且“过滤器”命令接收BATF 多项式。这可能会导致不可预测错误的结果,

  3. f1f0f1 奈奎斯特,半采样率,fs/2。如果是这样,只需使用f0 并设置 滤波器为高通!。如果您仍然需要带通,请选择 f1=900 或类似的东西,而不是 非常 nyquist cut。

这是一个修正版本,采样滤波器在 30Hz 和 950Hz 之间,采样频率为 2000Hz:

   x  = randn(500,1);     % Input to the filter
   [b,a] = butter(5,[30/2000,950/2000]*2); 
   y=filter(b,a,x);
   fvtool(b,a);
   plot([x y]);

您好!...

【讨论】:

    猜你喜欢
    • 2014-03-23
    • 1970-01-01
    • 2020-11-06
    • 2015-05-17
    • 1970-01-01
    • 2018-12-30
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多