MATLAB之Filter函数的C语言程序实现

MATLAB之Filter函数的C语言实现

  • 前言
  • 一、MATLAB的Filter函数
  • 二、C语言实现Filter函数
    • 1.代码
    • 2.计算结果
  • 总结


前言

MATLAB里面有很多现场的滤波器函数,我们在做数据分析的时候,可以直接调用,十分方便,但是有时候我们也需要在嵌入式软件系统里面自己去实现一些函数的滤波功能,这个时候就需要自己理解滤波器的函数,从公式层面去推导一下,才能把C或者C++代码给写出来。


一、MATLAB的Filter函数

Butter函数是求Butterworth数字滤波器的系数,在求出系数后对信号进⾏滤波时⽤filter函数。设计滤波器就是设计滤波器系数[B,A]。
[B,A] = BUTTER(N,Wn,‘high’) —⽤来设计⾼通滤波器
[B,A] = BUTTER(N,Wn,‘low’) designs a lowpass filter.–低通滤波器
[B,A] = BUTTER(N,Wn)–带通滤波器
N是滤波器的阶数,不熟的话,⼤概取个整数就可以了。Wn的确定跟你的采样频率Fs有关。对于原始信号x。⽐如说你的采样频率Fs=1000Hz,设计⼀个8阶、通带为100-200Hz的带通滤波器:[b,a]=butter(8,[0.2 0.4])=butter(8,[100/(1000/2) 200/(1000/2) ])这⾥Fa=Fs/2,Fa是分析频率得到滤波器系数后,就可以直接⽤了。这里我们主要关注一下filter函数:

y=filter(B,A,x)

我们来看一个例子:

a = [1.0000; 0; 0.4860; 0; 0.0177];
b = [0.0940; 0.3759; 0.5639; 0.3759; 0.0940];
OriginalSignal = [1:10];
SignalFilter = filter(b, a, OriginalSignal);
SignalFilter = SignalFilter'

MATLBA运行的结果是这样的:
MATLAB之Filter函数的C语言程序实现_第1张图片

二、C语言实现Filter函数

1.代码

代码如下(示例):

#include "pch.h"
#include
int main()
{
	int OriginalSignal[10] = { 1,2,3,4,5,6,7,8,9,10 };
	double a[5] = { 1,0,0.4860,0,0.0177 };
	double b[5] = { 0.0940,0.3759,0.5639,0.3759,0.0940 };
	double SignalFilter[10];
	//滤波 5阶的
	SignalFilter[0] = b[0] * OriginalSignal[0];
	SignalFilter[1] = b[0] * OriginalSignal[1] + b[1] * OriginalSignal[0] - a[1] * SignalFilter[0];
	SignalFilter[2] = b[0] * OriginalSignal[2] + b[1] * OriginalSignal[1] + b[2] * OriginalSignal[0] - a[1] * SignalFilter[1] - a[2] * SignalFilter[0];
	SignalFilter[3] = b[0] * OriginalSignal[3] + b[1] * OriginalSignal[2] + b[2] * OriginalSignal[1] + b[3] * OriginalSignal[0] - a[1] * SignalFilter[2] - a[2] * SignalFilter[1] - a[3] * SignalFilter[0];

	for (int i = 4; i < 10; i++)
	{
		SignalFilter[i] = b[0] * OriginalSignal[i] + b[1] * OriginalSignal[i - 1] + b[2] * OriginalSignal[i - 2] + b[3] * OriginalSignal[i - 3] + b[4] * OriginalSignal[i - 4] - a[1] * SignalFilter[i - 1] - a[2] * SignalFilter[i - 2] - a[3] * SignalFilter[i - 3] - a[4] * SignalFilter[i - 4];
	}
	for (int i = 0; i < 10; i++)
	{
		printf("%f\n", SignalFilter[i]);
	}
}

2.计算结果

MATLAB之Filter函数的C语言程序实现_第2张图片


总结

可以发现,MATLAB函数和C语言写的,计算结果完全一致,说明写的C语言程序是没问题的。这就很好地用C语言实现了Filter函数。

你可能感兴趣的:(故障诊断进阶篇,matlab,开发语言)