⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fir.cpp

📁 设计一FIR低通滤波器 0=<|w|<=0.25Pi,输入n代表FIR滤波器的长度,输出H(ejw)幅度值,N代表输出数,Hbs[N]存放H(ejw)的幅度值,h[n]存放H[z]的系数
💻 CPP
字号:
/*====================程序描述=======================*/
/*  设计一FIR低通滤波器,0=<|w|<=0.25Pi              */
/*  输入n代表FIR滤波器的长度                         */
/*  输出H(ejw)幅度值,N代表输出数                     */
/*  Hbs[N]存放H(ejw)的幅度值                         */
/*  h[n]存放H[z]的系数                               */
/*  算法采用Hamming窗函数                            */
/*===================================================*/

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

#define  N   50

typedef struct complex
{
	double real;
	double imag;
}   COMPLEX;

COMPLEX   mul(COMPLEX,COMPLEX)                        ;  /*复数相乘*/
COMPLEX   mul_n(COMPLEX ,int )                        ;  /*计算复数的n次幂*/
double    mabs(COMPLEX)                               ;  /*求幅度*/
COMPLEX   e_jw(double)                                ;  /*求复指数*/


int main(void)
{
	int n,i,j;
	COMPLEX H[N+1],Ej,Ejw_n;
	double *h1,*h,*w,Pi,dw=0,Hbs[N+1];
	Pi=atan(1)*4;
	printf("please input the FIR's length:");
	scanf("%d$\n",&n);
    h1=(double*)calloc(n,sizeof(double));
	h=(double*)calloc(n,sizeof(double));
	w=(double*)calloc(n,sizeof(double));
	for (i=0;i<=n;++i)
	{   
		if(i==n/2)
			h1[i]=0.25;
		else 
			h1[i]=sin((i-n/2)*0.25*Pi)/(Pi*(i-n/2));
		w[i]=0.54-0.46*cos(2*Pi*i/n);
	}
	for (i=0;i<=n;++i)
		h[i]=h1[i]*w[i];
	
    printf("the h[n] is as follows:\n");
	for (i=0;i<=n;++i)
	{
		if(i%5==0)
			printf("\n");
		printf("%.4lf ",h[i]);
	}
	
	for(i=0;i<=N;++i,dw+=Pi/N)
	{
		H[i].real=0;
		H[i].imag=0;
		for(j=0;j<=n;++j)
		{
			Ej=e_jw(dw);
			Ejw_n=mul_n(Ej,j);
			H[i].real+=h[j]*Ejw_n.real;
			H[i].imag+=h[j]*Ejw_n.imag;
		}
		
	}
    		
    for(i=0;i<=N;++i)
		Hbs[i]=mabs(H[i]);

	printf("\nthe H[ejw] is as follows:\n");                 /*输出幅度值*/
	for (i=0;i<=N;++i)
	{
		if(i%5==0)
			printf("\n");
		printf("%.4lf ",Hbs[i]);
	}
    printf("\n");
	return 0;
}



COMPLEX   e_jw(double w)
{
	COMPLEX Ejw;
	Ejw.real=cos(w);
	Ejw.imag=-sin(w);
	return Ejw;
}

COMPLEX mul(COMPLEX a,COMPLEX b)
{
	COMPLEX c;
	c.real=a.real*b.real-a.imag*b.imag;
	c.imag=a.real*b.imag+a.imag*b.real;
	return c;
}

COMPLEX mul_n(COMPLEX a,int b)
{
	int i;
	COMPLEX tem,tem1;
	if(b==0)
		{
		   tem.real=1.0;
	       tem.imag=0  ;
		}
	else
	{
		tem.real=a.real;
		tem.imag=a.imag;
        for(i=1;i<b;++i)
		{
			tem1=mul(a,tem);
			tem.real=tem1.real;
			tem.imag=tem1.imag;
		}
	}
	return tem;
}

double mabs(COMPLEX a)
{
 double m;
 m=a.real*a.real+a.imag*a.imag;
 m=sqrt(m);
 return m;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -