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

📄 fir coefficient generation.c

📁 AD BF-532DSP中实现Fir滤波器的示例
💻 C
字号:
#include <math.h>
#include <float.h>
#include <fract.h>
#include <window.h>
#include <stdio.h>
#include "FIR Coefficient Generation.h"

void Ideal_Lowpass(float Lambda_1, unsigned short Num_Taps, fract16 * impulse)
{
 	int n,n_max;
 	float m;
	float * Imp_Resp_Coeff;
	fract16	* Window;
	
	Lambda_1 *= (PI/48000.0);
	
	Imp_Resp_Coeff = (float *) malloc(Num_Taps*sizeof(float));
 	Window = (fract16 *) malloc(Num_Taps*sizeof(short));
 	gen_hanning_fr16( Window, 1, Num_Taps );
 	
 	if(Num_Taps%2)
   	{
    	n_max = (Num_Taps-1)/2;
    	Imp_Resp_Coeff[n_max] = Lambda_1/PI;
   	}
 	else
   	{
	    n_max = Num_Taps/2;
   	}
   
 	for(n=0; n<n_max; n++)
   	{
	    m = n - ((float)Num_Taps-1.0)/2.0;
	    Imp_Resp_Coeff[n] = sinf(m*Lambda_1) / (m*PI);
	    Imp_Resp_Coeff[Num_Taps-1-n] = Imp_Resp_Coeff[n];
   	}
   	
   	for (n=0;n<Num_Taps;n++)
   	{
   		impulse[n] = mult_fr1x16( Window[n] , (short) (32768.0*Imp_Resp_Coeff[n]));
   	}
   		
   	free(Imp_Resp_Coeff);
   	free(Window);
}

//==============================================================
void Ideal_Highpass( float Lambda_1, unsigned short Num_Taps, fract16 * impulse)
{
 	int n,n_max;
 	float m;

	fract16	* Window;
 	float * Imp_Resp_Coeff;
 	
	Lambda_1 *= (PI/48000.0);

 	Imp_Resp_Coeff = (float *) malloc((Num_Taps*2+1)*sizeof(float));
 	Window = (fract16 *) malloc(Num_Taps*sizeof(short));
 	
 	gen_hanning_fr16( Window, 1, Num_Taps );

 	if(Num_Taps%2)
   	{
	    n_max = (Num_Taps-1)/2;
	    Imp_Resp_Coeff[n_max] = 1.0 - Lambda_1/PI;
   	}
	else
	{
	    n_max = Num_Taps/2;
	}
   
 	for(n=0; n<n_max; n++)
   	{
	    m = n - ((float)Num_Taps-1.0)/2.0;
	    Imp_Resp_Coeff[n] = -sinf(m*Lambda_1) / (m*PI);
	    Imp_Resp_Coeff[Num_Taps-1-n] = Imp_Resp_Coeff[n];
   	}

   	for (n=0;n<Num_Taps;n++)
   		impulse[n] = mult_fr1x16( Window[n] , (short) (32768.0*Imp_Resp_Coeff[n]));
   		
   	free(Imp_Resp_Coeff);
   	free(Window);
   	
}
//=========================================================
//
void Ideal_Bandpass( float Lambda_1, float Lambda_2, unsigned short Num_Taps, fract16 * impulse)
{
 	int n,n_max;
 	double m;
 	fract16	* Window;
	float * Imp_Resp_Coeff;

	Lambda_1 *= (PI/48000.0);
	Lambda_2 *= (PI/48000.0);
 	
	Imp_Resp_Coeff = (float *) malloc((Num_Taps*2+1)*sizeof(float));
 	Window = (fract16 *) malloc(Num_Taps*sizeof(short));
 	gen_hanning_fr16( Window, 1, Num_Taps );

 	if(Num_Taps%2)
   	{
    	n_max = (Num_Taps-1)/2;
    	Imp_Resp_Coeff[n_max] = (Lambda_2 - Lambda_1)/PI;
   	}
 	else
   	{
    	n_max = Num_Taps/2;
   	}
   
 	for(n=0; n<n_max; n++)
   	{
    	m = n - (double)(Num_Taps-1.0)/2.0;
    	Imp_Resp_Coeff[n] = (sinf(m*Lambda_2) - sinf(m*Lambda_1)) / (m*PI);
    	Imp_Resp_Coeff[Num_Taps-1-n] = Imp_Resp_Coeff[n];
   	}

   	for (n=0;n<Num_Taps;n++)
   	{
   		impulse[n] = mult_fr1x16( Window[n] , (short) (32768.0*Imp_Resp_Coeff[n]));
   	}
   		
   	free(Imp_Resp_Coeff);
   	free(Window);

}
//=================================================================
//
void Ideal_Bandstop( float Lambda_1, float Lambda_2, unsigned short Num_Taps, fract16 * impulse)
{
 	int n,n_max;
 	double m;

 	fract16	* Window;
	float * Imp_Resp_Coeff;
	
	Lambda_1 *= (PI/48000.0);
	Lambda_2 *= (PI/48000.0);

	Imp_Resp_Coeff = (float *) malloc((Num_Taps*2+1)*sizeof(float));
 	Window = (fract16 *) malloc(Num_Taps*sizeof(short));
 	gen_hanning_fr16( Window, 1, Num_Taps );

 	if(Num_Taps%2)
   	{
    	n_max = (Num_Taps-1)/2;
    	Imp_Resp_Coeff[n_max] = 1.0 + (Lambda_1 - Lambda_2)/PI;
   	}
 	else
   	{
    	n_max = Num_Taps/2;
   	}
   
 	for(n=0; n<n_max; n++)
   	{
    	m = n - (double)(Num_Taps-1.0)/2.0;
    	Imp_Resp_Coeff[n] = (sinf(m*Lambda_1) - sinf(m*Lambda_2)) / (m*PI);
    	Imp_Resp_Coeff[Num_Taps-1-n] = Imp_Resp_Coeff[n];
   	}

   	for (n=0;n<Num_Taps;n++)
   		impulse[n] = mult_fr1x16( Window[n] , (short) (32768.0*Imp_Resp_Coeff[n]));
   		
   	free(Imp_Resp_Coeff);
   	free(Window);
   	
}

⌨️ 快捷键说明

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