[DSP學(xué)習(xí)筆記]基于TMS320F28335的FIR濾波實現(xiàn)
首先進(jìn)入TI官網(wǎng),搜索C2000 wave,進(jìn)行下載安裝。

安裝完成后,在2000 wave的安裝目錄下,進(jìn)入以下目錄:C2000Ware_4_02_00_00\libraries\dsp\FPU\c28
以我本地的安裝目錄為例:E:\ti\c2000\C2000Ware_4_02_00_00\libraries\dsp\FPU\c28
復(fù)制include、source文件夾到新建工程中。再根據(jù)選用的DSP型號對文件夾內(nèi)容進(jìn)行刪減。如:我使用的是TMS320F28335,FPU是32位的,故僅保留include、source文件夾中的fpu32文件夾以及dsp.h頭文件。
工程中,可以見有以下文件(僅進(jìn)行濾波可刪除FFT相關(guān)文件)


同時記得添加頭文件路徑

至此,對于我們進(jìn)行濾波所需的函數(shù)庫已經(jīng)移植完畢。
測試部分:首先使用MATLAB生成輸入信號。


生成了采樣率為100KHz,測試頻率分別為1K、5K、10K的信號。

將record.txt文件內(nèi)容復(fù)制到INPUT.c文件中,如下

借助MATLAB自帶的filter designer,生成濾波器系數(shù)(濾波器截止頻率選擇1500Hz,濾除高頻噪聲,指定階數(shù)為80階)。

再點擊目標(biāo),選擇生成到CCS目標(biāo)工程中。

28335FPU為32位,故選用單精度浮點型

生成以下頭文件,需注意,使用此頭文件需在工程中包含“tmwtypes.h”
“tmwtypes.h”文件路徑在生成的文件中以自動標(biāo)注

至此,已完成了大部分的準(zhǔn)備工作,接下來開始編寫函數(shù)進(jìn)行濾波。
仿照TI官方例程,完成了下列函數(shù)的編寫。
?/* 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為濾波器階數(shù)
#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
再在主函數(shù)中調(diào)用FIR_Init();????FIR_filter_run();函數(shù)即可完成濾波操作。
在cmd文件中,添加以下兩行代碼,進(jìn)行內(nèi)存分配。

借助CCS的Graph畫圖工具測試濾波效果如下:
原始信號:

濾波后:

測試結(jié)束,實現(xiàn)了FIR濾波。
本人是TMS320F28335的學(xué)習(xí)小白,如有錯誤,請大佬多多指正。