我需要用 C 实现巴特沃斯滤波器。获取具有此功能的库或编写代码是否更容易?[关闭]
-
21-08-2019 - |
题
我的项目是用 C 语言编写的,CodeBlocks 是我的 IDE,我在 Windows Vista 上运行。我需要对我的数据应用巴特沃斯滤波器。我可以使用 Matlab 自动执行此操作,因为它具有此(和其他)过滤器作为内置函数。计算机和编程不完全是我的领域,我从来没有“导入”新的库,也不知道如何做到这一点。复杂吗?我最好做什么?将巴特沃斯滤波器的代码编写为函数?或者“导入”一个库来为我做这件事?(就我个人而言,如果不是那么复杂,我更喜欢获得一个库,因为它可能还有我也可以测试的其他类型的过滤器)
解决方案
几乎可以肯定,使用经过良好测试的外部库(假设您能找到一个……尝试过 Google 了吗?)比自己编写一个不平凡的过滤器更简单、更安全。
但是,由于您没有透露有关您的应用程序、数据格式等的任何内容,因此我们无法告诉您更多信息。
我不知道您的 IDE (CodeBlocks) 是如何工作的,但导入通常采用三种形式之一,具体取决于您如何使用该库(详细信息如下):
- 您获得源代码 对于一个或多个功能(希望有良好的文档):阅读文档,将代码复制到适当的目录中,将文件添加到项目中,尝试编译,修复丢失的预处理器符号等...
- 您获得适合您平台的纯二进制库和标头 (可能来自您的操作系统包管理系统):阅读文档,告诉 IDE 在哪里可以找到标头和库,尝试链接,修复问题...
- 您获得一个提供功能的框架:这有点麻烦,但它也从阅读文档开始,然后可能会像库案例一样进行,但要编写更多代码......
无论如何,你会在某个时候做
#include "library.h"
在某些源文件中,以使外部功能对您的代码可见。
您可能想首先找到一个候选库,看看它以什么形式提供,然后阅读有关您的 IDE 的更多信息以了解下一步的发展方向。
另一个可能与您的需求相关的问题: 模拟电路仿真库?.
我已经很久没有使用 matlab 了,但如果这是你的基本编程经验,你应该知道有 很多 MATLAB 为您提供的功能不是普通的 c.您几乎肯定希望使用某种框架或其他框架来为您提供一些支持。
其他提示
我们不得不采用巴特沃斯滤波器的一些数据上的,我最近工作的一个项目。 (压力测量是随着时间漂移,因为测量仪器加热。)它实际上比包括图书馆就更简单了。你真的只需要包含一个单一的功能,并将其添加到任何C文件您需要使用它。
这是我们用于产生我们的过滤器的部位:
http://www-users.cs.york.ac .UK /〜渔民/ 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]);
}
这一个是最好的滤波器产生器 http://www-users.cs.york.ac .UK /〜渔民/ mkfilter / trad.html
不幸的是,它开始在C代码生成失败。但是,它发出具有形式接近C代码足够的信息,以便您可以重现类似迈克提出一个程序>。你并不需要任何额外的库。当你想更新系数(可变截止频率)库可能是有用的。我不知道的算法来计算程序中的那些系数。