声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2216|回复: 2

[滤波] 巴特沃斯低通滤波器 VC 求助

[复制链接]
发表于 2009-12-7 20:56 | 显示全部楼层 |阅读模式

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

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

x
下面是我写的2阶的巴特沃斯低通滤波的部分VC程序,高手们帮看看哪里错了,主要是内存方面的问题,本人是新手,不太懂

void CFilterView::Butterworth(float *x, float *y, float fp,float FS,int num)
{
    float wp,fs,wc,ap,wwp,Fs1,epsl,A0,B0,B1,B2,a0,a1,a2,b1,b2,A,C;
ap=0.5;//通带截至频率
fs=0.1*fp;
    int num1,i;
    int n=2;
Fs1=FS;//采样频率
    float *x1,*y1;
    wp=2*pi*fp/Fs1;
  //  ws=2*pi*fs/Fs1;
epsl=sqrt(pow(10,ap/10));
wwp=2*Fs1*tan(wp/2);
wc=wwp/(pow(epsl,n));
C=2*Fs1;
A0=1;    H(s)的系数
B2=1/(wc*wc);
B1=1.4142/wc;
B0=1;
A=B0+B1*C+B2*C*C;
//下面是H(z)的系数
    a0=A0/A;
a1=2*A0/A;
    a2=a0;
b1=(2+B0-2*B2*C*C)/A;
b2=(B0-B1*C+B2*C*C)/A;
    num1=num;
    x1=(float *)malloc(sizeof(float)*num1);
    y1=(float *)malloc(sizeof(float)*num1);
    memcpy(x1,x,sizeof(float)*num1);
   
    y1[0]=a0*x1[0];
y1[1]=a0*x1[1]+a1*x1[0]-b1*y[0];
for(i=2;i<num1;i++)
{
y1=a0*x+a1*x[i-1]+a2*x[i-2]-b1*y[i-1]-b2*y[i-2];//迭代过程
}
    for(i=0;i<num1;i++)
{
y=y1;
}
    free(x1);
    free(y1);
}

void CFilterView::drawboxing()
{
for(int i;i<20000;i++)
{
x=0;
y=0;
}
int num;
num=1000;
for(i=0;i<1000;i++)
{
x=sin(float(2*pi*50*i/1000))+0.5*sin(float(2*pi*500*i/1000));//正弦信号
}
Butterworth(x,y,100,1000,1000);//滤波(即使没有这句,在运行时也会报错)
CClientDC dc(this);
     CRect rect;
        GetClientRect(&rect);
  dc.SetMapMode(MM_ANISOTROPIC);
        dc.SetViewportOrg(rect.right/10,rect.bottom/2);
        dc.SetViewportExt(rect.right,rect.bottom);

  dc.SetWindowOrg(0,0);
        dc.SetWindowExt(1200,-200);
  for(i=0;i<1000;i++)
  {
  dc.MoveTo(i,y);
  dc.LineTo(i+1,yi+1]);
  }
}

高手们帮看看啊,实在搞不懂到底哪里出错!

本帖被以下淘专辑推荐:

回复
分享到:

使用道具 举报

发表于 2011-12-9 22:49 | 显示全部楼层
void CFilterView::drawboxing()
{
for(int i;i<20000;i++)
{
x=0;y=0;
int num;
num=1000;
for(i=0;i<1000;i++)
{
x=sin(float(2*pi*50*i/1000))+0.5*sin(float(2*pi*500*i/1000));//正弦信号
}
Butterworth(x,y,100,1000,1000);//滤波(即使没有这句,在运行时也会报错)
CClientDC dc(this);
     CRect rect;
        GetClientRect(&rect);
  dc.SetMapMode(MM_ANISOTROPIC);
        dc.SetViewportOrg(rect.right/10,rect.bottom/2);
        dc.SetViewportExt(rect.right,rect.bottom);

  dc.SetWindowOrg(0,0);
        dc.SetWindowExt(1200,-200);
  for(i=0;i<1000;i++)
  {
  dc.MoveTo(i,y);
  dc.LineTo(i+1,yi+1]);
  }
}

发表于 2011-12-9 22:50 | 显示全部楼层
x[i],y[i]?
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-12-27 10:33 , Processed in 0.090424 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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