我的项目在C中,CodeBlocks是我的IDE,我在Windows Vista上运行。我需要对我的数据应用巴特沃斯滤波器。我可以使用Matlab自动执行此操作,因为它将此(和其他)Filter作为内置函数。计算机和编程并不完全是我的领域,我从来没有“导入”新的库,也不知道如何做到这一点。这很复杂吗?我会做什么最好的?编写Butterworth Filter的代码作为函数?或“导入”图书馆为我这样做? (就个人而言,如果不复杂,我更喜欢得到一个库,因为它可能还有其他类型的过滤器,我也可以测试)
使用经过良好测试的外部库几乎可以肯定更简单,更安全(假设您可以找到一个......试过Google吗?)而不是自己编写一个非平凡的过滤器。
但是,既然你没有说过关于你的申请,你的数据格式等等,我们可以告诉你更多。
我不知道你的IDE(CodeBlocks)是如何工作的,但是导入通常会根据库如何为你提供三种形式之一(详情如下):
在任何情况下,你都会在某种程度上做
#include "library.h"
在某些源文件中,以使代码可以看到外部功能。
您可能希望首先找到候选库,以查看它所提供的形式,然后阅读有关IDE的更多信息,以了解您从哪里开始。
另一个可能与您的需求相关的SO问题:Analog circuit simulation library?。
自从我使用matlab以来已经很长时间了,但如果这是你的基本编程经验,你应该知道matlab提供的很多工具都不是普通的c。您几乎肯定希望使用某种框架或其他框架来为您提供一些支持。
我们不得不对我最近工作的项目的一些数据应用Butterworth过滤器。 (压力测量因测量仪器升温而随时间漂移。)它实际上比包括库更简单。您只需要包含一个函数并将其添加到您需要使用它的任何C文件中。
这是我们用于生成过滤器的网站:
http://www-users.cs.york.ac.uk/~fisher/mkfilter/
如果指定参数,它将为您生成函数。以下是我们在应用程序中使用的函数示例,该函数基于上述网站生成的代码。 (我们打字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]);
}
如果您正在使用Matlab,从C代码链接到Matlab是否禁忌? This是一个起点。您实际上可以通过从C语言调用它来让Matlab引擎在Matlab界面中执行您可以执行的任何操作。
Butterworth滤波器是递归的,因此它应该实现为IIR滤波器。一旦你从Matlab测试中得到稳定的滤波器系数,你就可以简单地将它们提供给通用的IIR算法(非常简单)。您可以使用大型FIR滤波器和卷积来近似滤波器响应,这可以移动到频域以解决相位问题,但如果您这样做,那么它不是真正的Butterworth。
我建议从头开始构建一个算法作为学习练习,但是如果你需要它,那么可能有很多库可以帮助你。 This上来搜索。
这是最好的滤波器发生器http://www-users.cs.york.ac.uk/~fisher/mkfilter/trad.html
不幸的是,它在C代码生成时开始失败。但是,它以接近C代码的形式发出足够的信息,以便您可以重现类似于what Mike proposes的程序。您不需要任何额外的库。当您想要更新系数(可变截止频率)时,库可能很有用。我不知道在程序中计算这些系数的算法。