DSP学习笔记--数字滤波器
文章摘要:
本文主要描述了关于数字滤波的原理,生成,及通过已知参数反算滤波器形状。
硬件平台: TMS320F38377D
数字滤波器原理:
稍后补充
通过Matlab来生成滤波器
应用程序-->Filter Design & Analysis
Response Type: 选择滤小波器类型
低通,高通,带通,带阻
经过测算:
100级滤波器运算时间为21.25us@200MHz,
滤波时间不能大于两次采样间隔,否则本次尚未计算完成,就有新数据又到来了;
别外还得保留一定的时间去处理其他代码;
滤波器实现
// 定义滤波器级数
#define FILTER_SERIES 20
//-----------------------------------------------
/*
* 滤波器系数(系数之和为1)
* Fc = 100/6400 * 2PI
* 汉明窗20阶
*/
const float Hn[FILTER_SERIES + 1] = {
0.007108650922711, 0.009180015082639, 0.01513516973633,
0.02445967408233, 0.03628317103931, 0.04946582243642,
0.06271405139908, 0.0747134966934, 0.08426512799562,
0.09041003729335, 0.09252956663762, 0.09041003729335,
0.08426512799562, 0.0747134966934, 0.06271405139908,
0.04946582243642, 0.03628317103931, 0.02445967408233,
0.01513516973633, 0.009180015082639, 0.007108650922711
};
static float Xn[50]={ 0 }; // 采样记录
//-------------------------------------------------
Uint16 Lowpass_Filter(float x)
{
int i;
float sum = 0;
for (i = FILTER_SERIES; i > 0; i--)
{
Xn[i] = Xn[i - 1]; // 边计算边移位
sum += Xn[i] * Hn[i];
}
Xn[0] = x;
sum += Xn[0] * Hn[0];
return(Uint16)(sum);
}
已知滤波器系数,反算滤波器特性
1.首先生成一个全频率波形(频域为直线,时域为尖脉冲)
2.将生成的波型通过滤波器
3.将滤波后的波形进行FFT计算,即可得出滤波器特性,并通过CCS自带工具生成波形。
#define SAMPLENUMBER 128
// 生成的点数要比计算点数稍多一点,主要用于滤波
float wave[256];
float fft_out[SAMPLENUMBER/2]
void Make_All_Wave(void)
{
int t;
int j;
float x;
for(t = 0; t < 256; t++)
{
x = 0;
// 采样频率的一半即可
for(j = 1; j < SAMPLENUMBER/2; j++)
{
w = j*2*PI/SAMPLENUMBER
x += cos(w * t) + 1;
}
x = Filter(x); // 已知参数生成的滤波器
wave[i] = x;
}
}
// 执行FFT计算时跳过前几个字节
FFT(&wave[128], fft_out);
// 通过显示结果,显示出通过的频谱
频域图像为直线(所有频率分量都有,且分量相同,时域为尖脉冲)
时域为标准正弦波,频域图像为单点
方波:奇次谐波之和(注意系数)