欢迎光临散文网 会员登陆 & 注册

[DSP学习笔记]基于TMS320F28335的FIR滤波实现

2023-01-13 11:13 作者:七草稀饭  | 我要投稿

首先进入TI官网,搜索C2000 wave,进行下载安装。

安装完成后,在2000 wave的安装目录下,进入以下目录:C2000Ware_4_02_00_00\libraries\dsp\FPU\c28

以我本地的安装目录为例:E:\ti\c2000\C2000Ware_4_02_00_00\libraries\dsp\FPU\c28

复制include、source文件夹到新建工程中。再根据选用的DSP型号对文件夹内容进行删减。如:我使用的是TMS320F28335,FPU是32位的,故仅保留include、source文件夹中的fpu32文件夹以及dsp.h头文件。

工程中,可以见有以下文件(仅进行滤波可删除FFT相关文件)

include文件树
source文件树

同时记得添加头文件路径

至此,对于我们进行滤波所需的函数库已经移植完毕。

测试部分:首先使用MATLAB生成输入信号。

函数式文件
命令式文件

生成了采样率为100KHz,测试频率分别为1K、5K、10K的信号。

测试信号时域图及频域图

将record.txt文件内容复制到INPUT.c文件中,如下

INPUT.c

借助MATLAB自带的filter designer,生成滤波器系数(滤波器截止频率选择1500Hz,滤除高频噪声,指定阶数为80阶)。

再点击目标,选择生成到CCS目标工程中。

28335FPU为32位,故选用单精度浮点型

生成以下头文件,需注意,使用此头文件需在工程中包含“tmwtypes.h”

“tmwtypes.h”文件路径在生成的文件中以自动标注

至此,已完成了大部分的准备工作,接下来开始编写函数进行滤波。

仿照TI官方例程,完成了下列函数的编写。

 /* FIR.h*/

#ifndef APP_FIR_H_

#define APP_FIR_H_

#include "DSP28x_Project.h"

#include <stdio.h>

#include <string.h>

void FIR_Init(void);

void FIR_filter_run(void);

#endif /* APP_FIR_H_ */


/* FIR.c */

#include <FIR.h>

#include "dsp.h"

#include "fpu_filter.h"

#include <math.h>

#include "complex.h"

#include "fdacoefs.h"


#define pi 3.14159

#define FIR_SIZE       (512U)

#define FIR_ORDER       (80U)             // ORDER = NUM_TAPS - 1,ORDER为滤波器阶数


#pragma DATA_SECTION(coeffs, "FIR_buffer0");

#pragma DATA_SECTION(FIR_output, "FIR_buffer1");


FIR_f32 fir;

FIR_f32_Handle hnd_fir = &fir;


float delayLine[FIR_ORDER+1];

float FIR_output[FIR_SIZE];

extern float test_input[];

extern const float coeffs[];


void FIR_Init(void)

{

    FIR_f32_setCoefficientsPtr(hnd_fir, coeffs);

    FIR_f32_setDelayLinePtr(hnd_fir, delayLine);

    FIR_f32_setOrder(hnd_fir, FIR_ORDER);

    FIR_f32_setInitFunction(hnd_fir, (v_pfn_v)FIR_f32_init);

    FIR_f32_setCalcFunction(hnd_fir, (v_pfn_v)FIR_f32_calc);


    hnd_fir->init(hnd_fir);

}


void FIR_filter_run(void)

{

    uint16_t i;

    float32u_t in, out;


    for(i = 0U; i < FIR_SIZE; i++)

    {

        in.f32   = test_input[i];

        out.f32  = FLT_MAX;

        FIR_f32_setInput(hnd_fir, in.f32);

        FIR_f32_setOutput(hnd_fir, out.f32);


        hnd_fir->calc(hnd_fir);


        out.f32 = FIR_f32_getOutput(hnd_fir);

        FIR_output[i] = out.f32;

    }

}

// End of File

再在主函数中调用FIR_Init();    FIR_filter_run();函数即可完成滤波操作。

在cmd文件中,添加以下两行代码,进行内存分配。

借助CCS的Graph画图工具测试滤波效果如下:

原始信号:

原始信号

滤波后:

低通滤波后1KHz信号

测试结束,实现了FIR滤波。

本人是TMS320F28335的学习小白,如有错误,请大佬多多指正。

[DSP学习笔记]基于TMS320F28335的FIR滤波实现的评论 (共 条)

分享到微博请遵守国家法律