[DSP学习笔记]基于TMS320F28335的FIR滤波实现
首先进入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相关文件)


同时记得添加头文件路径

至此,对于我们进行滤波所需的函数库已经移植完毕。
测试部分:首先使用MATLAB生成输入信号。


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

将record.txt文件内容复制到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画图工具测试滤波效果如下:
原始信号:

滤波后:

测试结束,实现了FIR滤波。
本人是TMS320F28335的学习小白,如有错误,请大佬多多指正。