【问题标题】:Very low frequency filter MATLAB极低频滤波器 MATLAB
【发布时间】:2013-10-29 18:29:39
【问题描述】:

我正在尝试创建一个 0.1 Hz 到 50 Hz 范围内的带通滤波器。我正在使用 MATLAB 中的 filterbuilder 工具,因此它输出的代码如下所示:

function y = filter050(x)

persistent Hd;

if isempty(Hd)

    Fstop1 = 0.1;    % First Stopband Frequency
    Fpass1 = 0.15;    % First Passband Frequency
    Fpass2 = 45;   % Second Passband Frequency
    Fstop2 = 50;   % Second Stopband Frequency
    Astop1 = 60;   % First Stopband Attenuation (dB)
    Apass  = 1;    % Passband Ripple (dB)
    Astop2 = 60;   % Second Stopband Attenuation (dB)
    Fs     = 500;  % Sampling Frequency

    h = fdesign.bandpass('fst1,fp1,fp2,fst2,ast1,ap,ast2', Fstop1, Fpass1, ...
        Fpass2, Fstop2, Astop1, Apass, Astop2, Fs);

    Hd = design(h, 'equiripple', ...
        'MinOrder', 'any');


    set(Hd,'PersistentMemory',true);

end

y = filter(Hd,x);

问题是它会永远运行。我知道我的滤波器需要很多点,因为它的频率很低,采样率为 500 Hz,但我真的不想对我的信号进行下采样......有什么办法吗?

另外,我尝试下采样以检查它是否会运行得更快,下采样到 100 Hz 并且仍然可以永远运行。

【问题讨论】:

  • "问题是它永远运行。"但是在“永远”之后的某个时间你会得到输出吗?还是真的“永远”永远运行下去?
  • 可能你要求的太多了,过滤器的尺寸变得特别长,或者遇到了数值问题。
  • @thewaywewalk 好吧,它连续运行了大约 1 天,然后我就放弃了,因为它不是解决我的问题的好方法......编辑:下采样版本在几分钟内运行,我会说 10 左右,这还不错,但我真的很想使用整个数据...
  • @BasSwinckels 这就是我所担心的,有什么建议吗?

标签: matlab filtering


【解决方案1】:

免责声明:我不是数字滤波器方面的专家,只是一个普通用户。我对fdesign也没有任何经验。

我的疯狂猜测是fdesign 要么正在尝试设计一个非常高阶的过滤器,这将永远优化,或者它遇到了数值问题。设计滤波器必须有一些经验法则(我不知道),但是截止频率和采样频率之间或过渡范围和采样率之间的比率可能有多大的限制。在你的情况下,Fstop1 / Fs = 5000 甚至是(Fpass1 - Fstop1) / Fs = 10000,这可能太多了。您可以做的一些事情:

  • 尽量放宽你的滤波器要求:你真的需要这么高的衰减吗?你能扩大从通带到阻带的频率范围吗?一个简单的 0.5 Hz 高通滤波器就足够了吗?你能忍受更多的涟漪吗?等等……

  • 对数据进行下采样。您抑制了 45 Hz 以上的所有频率,因此显然您并不关心它们。这意味着您可以安全地下采样到大约 100 Hz,这可能会使任何数值问题的重要性降低 5 倍。下采样有什么问题?这很容易用decimate 左右完成:x_dec = decimate(x, 5)

  • 尝试以稍微不同的方式解决您的问题。如果你阅读了抽取手册,你会发现它实际上做了一些低通滤波,截止频率为Fc = 0.8*Fsample/ (2 * downsample_ratio)。这是避免混叠问题所必需的。 (请注意下采样(仅从 n 中选择 1 个样本)和抽取(首先进行适当的抗混叠过滤)之间的区别。)因此,如果您将抽取 4 倍,您将得到低通部分免费使用 Fc = 0.8*500 / (2*4) = 50 Hz 的滤波器!那么剩下要做的就是做一些 Fc = 0.2 Hz 左右的高通滤波。

【讨论】:

    【解决方案2】:

    我也曾经遇到过这个问题。我有一些以 5k Hz 采样的电生理数据,我尝试使用 MATLAB 的 fdesign 对其进行低通滤波。它运行得非常慢,我不得不对数据进行下采样以提高速度。

    后来我找到了一个很好的解决方案。我从 EEGLAB(用于处理 EEG 信号的 MATLAB 工具箱)中提取了数字滤波器的代码。它是一个 window-sinc 滤波器,运行速度非常快(我可以在 1 分钟内过滤 1000 Hz 采样的 10 分钟长 EEG 数据),window-sinc 滤波器非常擅长将一个频段与另一个频段分离(非常快滚下)。现在我可以在没有 Downsam 的情况下过滤我的电生理数据

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 2015-05-03
      • 2016-02-13
      • 1970-01-01
      • 2019-06-04
      • 2017-04-06
      • 1970-01-01
      相关资源
      最近更新 更多