matlab filter怎么写成C语言?求教

p1=[1,0,0,0,0,0,-2,0,0,0,0,0,1];
d1=[1,-2,1]; %就是传递函数
y1=filter(p1,d1,data);

第1个回答  推荐于2017-12-16

根据filter的定义实现:y = filter(b,a,x) 等价于

对于第N个数,根据以下的循环就好了

y[n] = 1/a[1] *(b[1]x[n]+b[2]x[n-1]+...+b[N]x[n-B+1]-a[2]y[n-1]-...-a[N]y[n-N+1]);


代码前人肯定有的,例如http://mechatronics.ece.usu.edu/yqchen/filter.c/:注意需要适当改写,另外参数名跟你不同,建议你用matlab给的参数名,能给转换带来方便


/*
FILTER.C
An ANSI C implementation of MATLAB FILTER.M (built-in)
Written by Chen Yangquan <elecyq@nus.edu.sg>
1998-11-11
*/

#include<stdio.h>
#define ORDER 3
#define NP 1001

/*
void filter(int,float *,float *,int,float *,float *);
*/

filter(int ord, float *a, float *b, int np, float *x, float *y)
{
       int i,j;
y[0]=b[0]*x[0];
for (i=1;i<ord+1;i++)
{
       y[i]=0.0;
       for (j=0;j<i+1;j++)
        y[i]=y[i]+b[j]*x[i-j];
       for (j=0;j<i;j++)
        y[i]=y[i]-a[j+1]*y[i-j-1];
}
/* end of initial part */
for (i=ord+1;i<np+1;i++)
{
y[i]=0.0;
       for (j=0;j<ord+1;j++)
       y[i]=y[i]+b[j]*x[i-j];
       for (j=0;j<ord;j++)
       y[i]=y[i]-a[j+1]*y[i-j-1];
}
} /* end of filter */







main()
{
FILE *fp;
float x[NP],y[NP],a[ORDER+1],b[ORDER+1];
int i,j;

/* printf("hello world \n"); */

if((fp=fopen("acc1.dat","r"))!=NULL)
{
       for (i=0;i<NP;i++)
       {
        fscanf(fp,"%f",&x[i]);
/*         printf("%f\n",x[i]); */
       }
}
else
{
       printf("\n file not found! \n");
       exit(-1);
}
close(fp);

/*  test coef from
[b,a]=butter(3,30/500);  in MATLAB
*/
b[0]=0.0007;
b[1]=0.0021;
b[2]=0.0021;
b[3]=0.0007;
a[0]=1.0000;
a[1]=-2.6236;
a[2]=2.3147;
a[3]=-0.6855;

filter(ORDER,a,b,NP,x,y);
/* NOW y=filter(b,a,x);*/

/* reverse the series for FILTFILT */
for (i=0;i<NP;i++)
{ x[i]=y[NP-i-1];}
/* do FILTER again */
filter(ORDER,a,b,NP,x,y);
/* reverse the series back */
for (i=0;i<NP;i++)
{ x[i]=y[NP-i-1];}
for (i=0;i<NP;i++)
{ y[i]=x[i];}
/* NOW y=filtfilt(b,a,x); boundary handling not included*/

if((fp=fopen("acc10.dat","w+"))!=NULL)
{
       for (i=0;i<NP;i++)
       {
        fprintf(fp,"%f\n",y[i]);
       }
}
else
{
       printf("\n file cannot be created! \n");
       exit(-1);
}
close(fp);
}  
/* end of filter.c */

本回答被提问者采纳

matlab filter怎么写成C语言?求教
y[n] = 1\/a[1] *(b[1]x[n]+b[2]x[n-1]+...+b[N]x[n-B+1]-a[2]y[n-1]-...-a[N]y[n-N+1]);代码前人肯定有的,例如http:\/\/mechatronics.ece.usu.edu\/yqchen\/filter.c\/:注意需要适当改写,另外参数名跟你不同,建议你用matlab给的参数名,能给转换带来方便 \/* F...

急求MATLAB低通滤波器 并转换为C语言
你可以自己使用fdatool去弄 以下一个结果:通带 5Hz,1db, 阻带8Hz,40db b=[0.0117 -0.0329 0.0451 -0.0329 0.0117]a=[1.0000 -3.6048 4.9787 -3.1156 0.7447]int filterBegin=5;double xBuf[5];double yBuf[5];double filter(double x){ for(in...

如何将matlab自带的nlinfit函数转成C语言
第一、在命令行里面输入 type fmincon 显示出fmincon函数的代码,如下图。复制这些代码到一个事先创建好的m文件里面,然后保存为fmincon.m文件。第二、点击应用程序,下拉 出现matlab Coder选项,点进去 第三、选择文件 然后继续就可以了

matlab设计巴特沃斯滤波器,这个分子和分母是什么意思啊,如图。怎么通过...
DENOMINATOR 分母 意识是 分子和分母多项式系数 GAIN 增益 通过滤波器后 幅值的线性变换值 你的y(n)=b(i)*x(n-i)-a(k)*y(n-k)是差分方程,这里用多项式系数方程 要通过系数设计C语言 就把滤波器系数和采样序列进行卷积 float IIR(){ float fSum;fSum=0.0;for ( i=0;i<IIRNUMBER;i++...

关于matlab filter这个函数到底怎么用?
filter是一维数字滤波器 使用方法:Y = filter(B,A,X),输入X为滤波前序列,Y为滤波结果序列,B\/A 提供滤波器系数,B为分子,A为分母 整个滤波过程是通过下面差分方程实现的:a(1)*y(n)= b(1)*x(n)+ b(2)*x(n-1)+ ...+ b(nb+1)*x(n-nb)- a(2)*y(n-1)- ...- a(...

如何把MATLAB的M文件转换成C语言?
MATLAB 自带生成 C 语言的功能,只需要在编辑器功能区选择“应用程序”,找到 MATLAB Coder,打开,按照步骤操作即可,如图所示。但是它可能有诸多限制,有些内置函数无法生成 C 语言,所以如果遇到这种情况你可能需要用 C 自己实现一些功能。

在设计FIR数字低通滤波器器时,用MATLAB生成了C语言头文件,在编写单片机...
再将matlab里边的卷积函数转成C,直接调用就行了~~~或者你直接用C语言使用for写个卷积函数,将B和信号做卷积。real64_T是double,写函数的时候注意点~

请教关于matlab程序改写成C语言程序运行结果的问题
改为float数据类型

MATLAB转换成C语言问题
Matlab和C语言可不一样的,你要将m文件转换为.c文件,且可以在VC中编译,那么需要做的工作就多了去了。Matlab中有很多封装好的函数,并且其语法与C语言还是有很大不同的。

51行代码的matlab脚本,改成可以运行的C语言,高质量完成另有高分悬赏...
\/\/ matlab2c.cpp : 定义控制台应用程序的入口点。\/\/ include "stdafx.h"typedef unsigned char U8;define FILE_NAME ("7_181.dat")define N 65536 define NTABLEN define PI3.14 define MAX(a,b) (a>b?a:b)void plot(int time,double *logFreq,double *logSumX,double *logSumY){ ...

相似回答