我需要在C中实现一个Butterworthfilter。是否更容易获得具有此function的库或编写代码?

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

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

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


我对IDE(CodeBlocks)的工作原理一无所知,但是通常导入三种forms中的一种,具体取决于库的可用方式(详情如下):

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

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

#include "library.h" 

在某些源文件中,以使代码可以看到外部function。

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


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


自从我使用matlab以来已经有很长一段时间了,但是如果这是你的基本编程经验,你应该知道matlab提供的很多工具都不是普通的c。 您几乎肯定希望使用某种框架或其他框架来为您提供一些支持。

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

这是我们用于生成filter的网站:

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]); } 

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

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

我建议从头开始构建一个算法作为学习练习,但是如果你需要它,那么可能有很多库可以帮助你。 这出现在搜索中。

史蒂夫哈里斯的SWH LADSPA插件包中有butterworthfilter

http://plugin.org.uk

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

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

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