极低频滤波器MATLAB

时间:2013-10-21 10:06:01

标签: matlab filtering

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

2 个答案:

答案 0 :(得分:1)

免责声明:我不是数字滤镜的专家,只是一个临时用户。我也没有使用fdesign的经验。

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

  • 尝试尽可能地放宽您的过滤器要求:您真的需要这么高的衰减吗?你能扩大你从传球到禁区的频率范围吗? 0.5 Hz的简单高通滤波器是否足够?你能忍受更多的涟漪吗?等等......

  • 缩小您的数据样本。你可以抑制45 Hz以上的所有频率,所以很明显你不关心它们。这意味着您可以安全地下采样到大约100 Hz,这可能会使任何数值问题变得不那么重要。下采样有什么问题?使用decimate左右很容易做到:x_dec = decimate(x, 5)

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

答案 1 :(得分:0)

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

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