请问下面的IIR滤波代码如何提高效率

FlySkyFree 2011-09-14 10:57:44

bool iir_DirectFormII(
const DynamicArray< double > b,
const DynamicArray< double > a,
const DynamicArray< double > x,
DynamicArray< double > &y)
{
for(int i=0; i< y.Length; i++) y[i] =0;

int na=a.Length;
int nb=b.Length;
for(int n=0; n<= nb-2; n++)
{
y[n] =0;
for(int z=0; z<=nb-1; z++)
{ //分子
if ( n>=z )
y[n] += b[z] * x[n-z] ;
}
for(int z=1; z<=na-1; z++)
{ //分母
if( n>=z )
y[n] -= a[z] * y[n-z] ;
}
}
for(int n=nb-1; n<= y.Length-1; n++)
{
for(int z=0; z<=nb-1; z++)
{
y[n] += b[z] * x[n-z] ;
}
for(int z=1; z<=na-1; z++) //a[0] must be 1
{
y[n] -= a[z] * y[n-z] ;
}
}

return 1;
}


就是滤波,高频滤波和低频滤波都可以用。
其中a,b为滤波系数,有7个数据。x里是原始数据,y是处理后的数据
因为x和y的数据量非常大,所以处理起来非常慢,这段代码有没有办法优化,或者有其它的高速滤波函数?
数据量大约为24小时,每小时每个通道有100×3600个数据,有16个通道,这样总共的数据量大约有:
100×3600×24×16,处理了太慢,cpu达到100%,麻烦大家了。
...全文
132 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lhy 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 chinayu2007 的回复:]
阶数多了会慢,3阶是经验,你可以试一下,就知道哪个值合适了.
[/Quote]
IIR根本慢不了多少,阶数和时间是线性关系,阶数高主要是容易出错,容易自激什么的。
FlySkyFree 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 halfworm 的回复:]

做脑电的吧兄弟。100 的采样率,才16个通道,问题肯定不在这里。 检查你的GUI,CPU全耗在画界面上了。
[/Quote]

并没有画图,只是处理数据。但数据量大才耗时的,只能分段处理了。
HalfWorm 2011-09-17
  • 打赏
  • 举报
回复
做脑电的吧兄弟。100 的采样率,才16个通道,问题肯定不在这里。 检查你的GUI,CPU全耗在画界面上了。
chinayu2007 2011-09-16
  • 打赏
  • 举报
回复
阶数多了会慢,3阶是经验,你可以试一下,就知道哪个值合适了.
lhy 2011-09-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 chinayu2007 的回复:]
可以实时处理,但是阶数不能高,最多3阶迭代
[/Quote]
谁告诉你只能3阶的?
lhy 2011-09-14
  • 打赏
  • 举报
回复

for(int z=0; z<=nb-1; z++)
{
y[n] += b[z] * x[n-z] ;
}
for(int z=1; z<=na-1; z++) //a[0] must be 1
{
y[n] -= a[z] * y[n-z] ;
}

这两个循环合成一个可能快点,但快得有限。
lhy 2011-09-14
  • 打赏
  • 举报
回复
IIR你还嫌慢,FIR才真的慢呢。
chinayu2007 2011-09-14
  • 打赏
  • 举报
回复
可以实时处理,但是阶数不能高,最多3阶迭代
lhy 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 flyskyfree 的回复:]
看来只能分段处理了,一次不能处理太多。
[/Quote]
可不可以接收数据同时处理,一秒钟1600个数很容易。
jone7319 2011-09-14
  • 打赏
  • 举报
回复
去掉下面这句,因为你在循环中已有初始化 y[n]=0;
for(int i=0; i< y.Length; i++) y[i] =0;
My_Love 2011-09-14
  • 打赏
  • 举报
回复
用GPU加速,至少快10倍。
FlySkyFree 2011-09-14
  • 打赏
  • 举报
回复
看来只能分段处理了,一次不能处理太多。

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧