当前位置:  开发笔记 > 编程语言 > 正文

我需要在C中实现一个Butterworth过滤器.是否更容易获得具有此功能的库或编写代码?

如何解决《我需要在C中实现一个Butterworth过滤器.是否更容易获得具有此功能的库或编写代码?》经验,为你挑选了2个好方法。

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



1> 小智..:

我们不得不对我最近工作的项目的一些数据应用Butterworth过滤器.(压力测量因测量仪器升温而随时间漂移.)它实际上比包括库更简单.您只需要包含一个函数并将其添加到您需要使用它的任何C文件中.

这是我们用于生成过滤器的网站:

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

如果指定参数,它将为您生成函数.以下是我们在应用程序中使用的函数示例,该函数基于上述网站生成的代码.(我们打字DOUBE因为它是在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]);
}


竖起大拇指只是为了链接到该网站 - 非常宝贵.

2> dmckee..:

使用经过良好测试的外部库几乎可以肯定更简单,更安全(假设您可以找到一个......试过Google吗?)而不是自己编写一个非平凡的过滤器.

但是,既然你没有说过关于你的申请,你的数据格式等等,我们可以告诉你更多.


我不知道你的IDE(CodeBlocks)是如何工作的,但是导入通常会根据库如何为你提供三种形式之一(详情如下):

    您获取一个或多个函数的源代码(希望有良好的文档):阅读文档,将代码复制到相应的目录中,将文件添加到项目中,尝试编译,修复丢失的预处理器符号等...

    您获得一个普通的二进制库和头为你的平台(可能是你的操作系统软件包管理系统):阅读文档,告诉IDE在哪里可以找到头和图书馆,试图联系,解决问题...

    您获得了一个提供功能的框架:这有点麻烦,但它也从读取文档开始,然后可能会像库案例那样进行,但需要编写更多代码......

在任何情况下,你都会在某种程度上做

#include "library.h"

在某些源文件中,以使代码可以看到外部功能.

您可能希望首先找到候选库,以查看它所提供的形式,然后阅读有关IDE的更多信息,以了解您从哪里开始.


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


它一直以来我用MATLAB很长一段时间,但如果这是你的基础编程经验,你应该知道,有很多是MATLAB提供给您不在普通的香草C设的.您几乎肯定希望使用某种框架或其他框架来为您提供一些支持.

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有