|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
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]);
}
}
高手们帮看看啊,实在搞不懂到底哪里出错! |
|