8

我的项目是 C 语言,CodeBlocks 是我的 IDE,我在 Windows Vista 上运行。我需要对我的数据应用巴特沃斯过滤器。我可以使用 Matlab 自动执行此操作,因为它具有这个(和其他)过滤器作为内置函数。计算机和编程并不完全是我的领域,我从未“导入”一个新库,也不知道如何做到这一点。复杂吗?我最好做什么?把巴特沃斯滤波器的代码写成一个函数?或“导入”一个库来为我做这件事?(就个人而言,如果不是那么复杂,我更喜欢获得一个库,因为它可能有其他类型的过滤器,我也可以测试)

4

5 回答 5

33

我们必须对我最近参与的一个项目的一些数据应用巴特沃斯过滤器。(压力测量会随着时间的推移而漂移,因为测量仪器会升温。)它实际上比包含一个库更简单。您实际上只需要包含一个函数并将其添加到您需要使用它的任何 C 文件中。

这是我们用来生成过滤器的站点:

http://www-users.cs.york.ac.uk/~fisher/mkfilter/

如果您指定参数,它将为您生成函数。这是我们在应用程序中使用的函数的示例,基于上述网站生成的代码。(我们 typedef DOUBLE 是因为它是在 PC 上开发的,但针对的是嵌入式平台——我们需要确保大小不会改变。)

我喜欢阅读这个网站,很高兴终于有东西可以贡献了!

/* Butterworth filter constants */

#define NZEROS 4
#define NPOLES 4
static DOUBLE xv[NZEROS+1], yv[NPOLES+1];

/* Sampling rate 3000 for testing existing */
/* raw data.  Change to 300 for final product */
#define SAMPLING_RATE 3000

/*******************************************************************************
 * Function:      ButterworthFilter
 *
 * Description:   This function uses the Butterworth filter and returns a new
 *                value for an individual floating point value.
 *
 * Access:        PRIVATE
 *
 * Parameters:    DOUBLE input - value to be converted
 *
 * Globals:       None
 *
 * Returns:       DOUBLE - new value that has been converted
 ******************************************************************************/
static DOUBLE ButterworthFilter (DOUBLE input)
{ 
    /* http://www-users.cs.york.ac.uk/~fisher/cgi-bin/mkfscript */
    /* Butterworth Bandpass filter */
    /* 2nd order */
    /* sample rate - choice of 300 or 3000 Hz */
    /* corner1 freq. = 0.5 or 1 Hz */
    /* corner2 freq. = 20 Hz */
    /* removes high and low frequency noise */

    DOUBLE dCoefficient1 = 0.0;
    DOUBLE dCoefficient2 = 0.0;
    DOUBLE dCoefficient3 = 0.0;
    DOUBLE dCoefficient4 = 0.0;
    DOUBLE dCoefficient5 = 0.0;
    DOUBLE dGain = 0.0;

    /* coefficients will vary depending on sampling rate */
    /* and cornering frequencies                         */
    switch(SAMPLING_RATE)
    {
        case 300:
            /* 1 to 20 Hz */
            dCoefficient1 = 2.0;
            dCoefficient2 = -0.5698403540;
            dCoefficient3 = 2.5753677309;
            dCoefficient4 = -4.4374523505;
            dCoefficient5 = 3.4318654424;
            dGain = 3.198027802e+01;
            break; 

        case 3000:
        default:
            /* 0.5 to 20 Hz */ 
            dCoefficient1 = 2.0;
            dCoefficient2 = -0.9438788347;
            dCoefficient3 = 3.8299315572;
            dCoefficient4 = -5.8282241502;
            dCoefficient5 = 3.9421714258;
            dGain = 2.406930558e+03;
            break;  
    } 

    xv[0] = xv[1]; 
    xv[1] = xv[2]; 
    xv[2] = xv[3]; 
    xv[3] = xv[4]; 
    xv[4] = (DOUBLE)(input / dGain);
    yv[0] = yv[1]; 
    yv[1] = yv[2]; 
    yv[2] = yv[3]; 
    yv[3] = yv[4]; 
    yv[4] = (DOUBLE)((xv[0] + xv[4]) - (dCoefficient1 * xv[2]) + (dCoefficient2 * yv[0]) +
                    (dCoefficient3 * yv[1]) + (dCoefficient4 * yv[2]) +
                    (dCoefficient5 * yv[3]));

    return (yv[4]);
}
于 2009-03-20T04:27:33.970 回答
5

几乎可以肯定,使用经过良好测试的外部库(假设您可以找到一个....尝试过 Google 吗?)比自己编写一个重要的过滤器更简单、更安全。

但是,由于您没有提及您的应用程序、您的数据格式等,我们可以告诉您的信息不多。


我对您的 IDE (CodeBlocks) 的工作原理一无所知,但导入通常采用以下三种形式之一,具体取决于您如何使用该库(详细信息如下):

  1. 您获得一个或多个功能的源代码(希望有好的文档):阅读文档,将代码复制到适当的目录,将文件添加到项目中,尝试编译,修复丢失的预处理器符号等...
  2. 您为您的平台获得了一个普通的二进制库和头文件(可能来自您的操作系统包管理系统):阅读文档,告诉 IDE 在哪里可以找到头文件和库,尝试链接,修复问题......
  3. 您获得了一个提供功能的框架:这有点麻烦,但它也是从阅读文档开始的,然后可能会像库案例一样进行,但要编写更多代码......

无论如何,你会在某个时候做

#include "library.h"

在您的一些源文件中,使外部功能对您的代码可见。

可能你想先找到一个候选库,看看它以什么形式提供,然后阅读更多关于你的 IDE 的信息,看看你从那里去哪里。


另一个可能与您的需求相关的 SO 问题:模拟电路仿真库?.


我已经很久没有使用 matlab 了,但如果这是你的基本编程经验,你应该知道matlab 提供给你的很多功能不是普通的 vanilla c。你几乎肯定想使用一些框架或另一个来给你一些支持。

于 2009-03-20T03:37:39.907 回答
3

如果您使用的是 Matlab,从您的 C 代码链接到 Matlab 是否禁忌? 是一个起点。实际上,您可以通过从 C 调用 Matlab 引擎来要求 Matlab 引擎执行您可以在 Matlab 接口中执行的任何操作。

Butterworth 滤波器是递归的,所以它应该被实现为 IIR 滤波器。一旦您从 Matlab 测试中获得了稳定的滤波器系数,您就可以简单地将它们提供给通用 IIR 算法(非常简单)。您可以使用大型 FIR 滤波器和卷积来近似滤波器响应,可以将其移至频域以解决相位问题,但如果您这样做,它就不是真正的巴特沃斯。

我建议从头开始构建一个算法作为学习练习,但如果您需要尽快使用它,可能有许多库可以帮助您。 是在搜索中出现的。

于 2009-03-20T04:25:59.247 回答
1

史蒂夫哈里斯的 SWH LADSPA 插件包中有巴特沃斯过滤器,位于

http://plugin.org.uk

编辑:除了现在我记得 C 代码由于各种原因嵌入在 RDF 中并自动生成。

于 2009-10-16T22:23:19.230 回答
0

这是最好的过滤器生成器 http://www-users.cs.york.ac.uk/~fisher/mkfilter/trad.html

不幸的是,它在 C 代码生成时开始失败。但是,它以接近 C 代码的形式发出了足够的信息,以便您可以重现类似于Mike 提出的程序。您不需要任何额外的库。当您想要更新系数(可变截止频率)时,库可能很有用。我不知道在您的程序中计算这些系数的算法。

于 2013-05-27T16:23:47.190 回答