1

我正在尝试创建一个 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 并且仍然可以永远运行。

4

2 回答 2

1

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

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

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

  • 对数据进行下采样。你抑制了所有高于 45 Hz 的频率,所以显然你并不关心它们。这意味着您可以安全地将采样率降低到大约 100 Hz,这可能会使任何数值问题的重要性降低 5 倍。下采样有什么问题?这很容易用抽取左右来完成: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 左右的高通滤波。

于 2013-10-21T16:14:20.640 回答
0

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

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

于 2017-08-14T05:21:08.843 回答