📄 dataprocessing.c
字号:
#include "talkthrough.h"
#include <math.h>
#define PI 3.1415926
#define FC2 0.05//以采样率Fs进行归一化的高频截止频率
#define FC1 0.00//以采样率Fs进行归一化的低频截止频率
#define FL 0.2//移位量
#define COEFFSCALE 20000//滤波器系数整型标尺
#define OFFSET 8000//直流偏置
int Window;//加窗标志
int Shift;//频域移位标志
int Compress;//时域压缩标志
int FirIn,FirOut; //定义输入和输出
int pm h[FIR_TAPS]; //最终设计的滤波器冲击响应
int section("section_DAG") InputBuf[FIR_TAPS+1];
//利用LDF的存储器定义,将输入缓存准确开辟在地址边界处
/****************初始化滤波器系数******************/
void InitCoeffs(void)
{
float hd[FIR_TAPS];//理想低通滤波器的冲击响应
float W[FIR_TAPS]; //窗函数
float cosine[FIR_TAPS];//移位因子
int i;
//////////////滤波器系数产生///////////////
for(i=0;i<(FIR_TAPS-1)/2;i++)
hd[i]=(1/PI)*(sin(2*FC2*PI*(i-(FIR_TAPS-1)/2))-sin(2*FC1*PI*(i-(FIR_TAPS-1)/2)))/(i-(FIR_TAPS-1)/2);
for(i=(FIR_TAPS-1)/2+1;i<FIR_TAPS;i++)
hd[i]=(1/PI)*(sin(2*FC2*PI*(i-(FIR_TAPS-1)/2))-sin(2*FC1*PI*(i-(FIR_TAPS-1)/2)))/(i-(FIR_TAPS-1)/2);
hd[(FIR_TAPS-1)/2]=2*(FC2-FC1);
///////////时域截取////////////
for(i=0;i<FIR_TAPS;i++) h[i]=(int)(hd[i]*COEFFSCALE);
///////////时域加窗///////////////
if(Window)
{
for(i=0;i<FIR_TAPS;i++) W[i]=0.54-0.46*cos(2*PI*i/(FIR_TAPS-1));
for(i=0;i<FIR_TAPS;i++) h[i]=(int)((float)h[i]*W[i]);
}
///////////时域压缩系数///////////
if(Compress)
{
for (i=0;i<FIR_TAPS/2;i++) hd[i]=h[i*2];
for (i=0;i<FIR_TAPS/2;i++) h[i]=hd[i];
for (i=FIR_TAPS/2;i<FIR_TAPS;i++) h[i]=0;//序列右边填零
}
/////////////移位FL*fs///////////
if(Shift)
{
for (i=0;i<FIR_TAPS;i++) cosine[i]=cos(2*PI*i*FL);
for(i=0;i<FIR_TAPS;i++) h[i]=(int)((float)h[i]*cosine[i]);
}
}
/****************初始化接收缓冲区******************/
void InitInput(void)
{
int i;
for (i=0;i<FIR_TAPS;i++)//将数据缓冲区初始化为零
{
InputBuf[i]=0;
}
}
/***************信号处理程序部分*******************/
void ProcessData(void)
{
FirOut= fir(FirIn-OFFSET,h,InputBuf,FIR_TAPS);//调用库函数完成FIR滤波
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -