文章摘要:
本文主要描述了关于数字滤波的原理,生成,及通过已知参数反算滤波器形状。

硬件平台: 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);

// 通过显示结果,显示出通过的频谱

频域图像为直线(所有频率分量都有,且分量相同,时域为尖脉冲)
时域为标准正弦波,频域图像为单点

方波:奇次谐波之和(注意系数)