📄 fir coefficient generation.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 + -