声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 8424|回复: 26

[综合讨论] Matlab中的滤波函数filter的代码

  [复制链接]
发表于 2012-4-23 11:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
Matlab中滤波函数filter是一个Built-in function函数,根据标准算法实现的C代码执行时间是matlab的3-4倍,Octave中的filter函数执行时间也是matlab的3倍左右,有谁知道matlab中filter函数的具体实现代码?
回复
分享到:

使用道具 举报

发表于 2012-4-23 17:01 | 显示全部楼层
filter这个函数是matlab工具箱里面有的,直接调用使用就可以了啊,你要他做什么啊!
 楼主| 发表于 2012-4-23 17:25 | 显示全部楼层
本帖最后由 impulse 于 2012-4-23 17:26 编辑

我要做我自己的C版本函数,用于信号分析和仪器开发,不能什么都用matlab。
发表于 2012-4-24 01:00 | 显示全部楼层
上官网搜了下, 没能找到
目前仅这个最接近, 但连接失效
http://www.mathworks.com/matlabc ... /view_thread/137161
 楼主| 发表于 2012-4-24 09:16 | 显示全部楼层
本帖最后由 impulse 于 2012-4-24 09:16 编辑

回复 4 # ChaChing 的帖子

找到原因了,对Vs2005的C++选项进行优化设置后,执行效率与matlab相当,呵呵,硬是提高了3倍多。

点评

賀喜下  发表于 2012-4-24 09:19
发表于 2012-6-12 21:53 | 显示全部楼层
您好,请问你的matlab filter的C代码可以发给我一份吗,我参考下。万分感谢哪!
 楼主| 发表于 2012-6-20 20:05 | 显示全部楼层
回复 6 # 风儿飞127 的帖子

邮箱发我。
发表于 2012-7-13 16:52 | 显示全部楼层
matlab filter的C代码我也要一份,还可以吗?

weighlin15089970590@hotmail.com
发表于 2012-7-30 10:14 | 显示全部楼层
你好,请问可以给我发一份程序吗?谢谢,我的邮箱是xiexue196@126.com
发表于 2012-8-4 19:07 | 显示全部楼层
发表于 2012-9-8 16:45 | 显示全部楼层
回复 7 # impulse 的帖子

您好,能发给我一份filter的C++代码吗?万分感谢!ab198909112513@163.com
发表于 2012-9-18 11:12 | 显示全部楼层
你好,能发给我一份filter的C代码吗?
邮箱ilsiling@126.com
谢谢~~
 楼主| 发表于 2012-9-18 11:56 | 显示全部楼层
代码贴出来吧,免得天天有人要
/*函数使用说明:
1、zi既是输入参数(initial conditions),又是输出参数(final conditions),因此,zi需要赋值,首次调用赋0;
2、对于len_a=1的情况,函数内部补充数组a的个数与b相同;
3、函数与matlab的filter函数区别在于zi的个数不同,本函数为len_b,matlab则为len_b-1
*/
void filter(double *x, int len_x, double *coeff_b, int len_b, double *coeff_a, int len_a, double* zi, int len_zi,
   double* &filter_x, int& len_filter_x)
{
double t0=GetTickCount();
len_filter_x=len_x;
filter_x=new double[len_x];
if(len_a==1)
{
  for(int m=0; m<len_x; m++)
  {
   filter_x[m]=coeff_b[0]*x[m]+zi[0];
   for(int i=1; i<len_b; i++)
   {
    zi[i-1]=coeff_b[i]*x[m]+zi[i];//-coeff_a[i]*filter_x[m];
   }
  }
}
else
{
  for(int m=0; m<len_x; m++)
  {
   filter_x[m]=coeff_b[0]*x[m]+zi[0];
   for(int i=1; i<len_b; i++)
   {
    zi[i-1]=coeff_b[i]*x[m]+zi[i]-coeff_a[i]*filter_x[m];
   }
  }
}
double t1=GetTickCount();
printf("filter  time- dt= %f ms\n",(t1-t0));
}

评分

1

查看全部评分

发表于 2012-11-7 01:39 | 显示全部楼层
本帖最后由 jtll521 于 2012-11-7 01:40 编辑
impulse 发表于 2012-9-18 11:56
代码贴出来吧,免得天天有人要
/*函数使用说明:
1、zi既是输入参数(initial conditions),又是输出参数 ...

你好,我最近也在写滤波的东西,自己也写了一个filter 的功能,但是每次验证的时候感觉和matlab里面的值不对应。(我将matlab生成的参数导入到c里面,然后用filter测试,出来的结果前几个和matlab里面是完全一样的,但是到后面就不对了)现在用你的这个代码出来的结果和我的一样的,和matlab里面不一样。不知道楼主有没有测试过,知道是什么原因吗?另外,我最近在写声音滤波的c,能交流一下吗?

谢谢,希望能回复一下

 楼主| 发表于 2012-11-7 15:04 | 显示全部楼层
jtll521 发表于 2012-11-7 01:39
你好,我最近也在写滤波的东西,自己也写了一个filter 的功能,但是每次验证的时候感觉和matlab里面的值不 ...

我的经过检验没问题,把你的代码贴出来,后面的不对,我估计是你的初始值赋值有问题,另外注意这个函数与matlab的区别。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-13 09:33 , Processed in 0.145372 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表