以上两个错误的原因是没有清醒的认识FIR_FP这个结构体,其定义如下:
typedef struct { float *coeff_ptr; float *dbuffer_ptr; int cbindex; int order; float input; float output; void (*init)(void*); void (*calc)(void*); }FIR_FP; 其中,*coeff_ptr,*dbuffer_ptr都是指针,即每定义一个FIR_FP结构体,必须给这两个指针指定指向的地址空间。以上的两个错误都是符合理论的,但是执行的过程中出现了错误,是因为执行FIR滤波时两个input都会存放在同一个dbuffer中。以下是两路的FIR滤波是实现的部分程序: …… #define FIR_ORDER 63 #define SIGNAL_LENGTH (FIR_ORDER+1)* 4 #pragma DATA_SECTION(firFP, "firfilt") #pragma DATA_SECTION(firFP_c, "firfilt_c") FIR_FP firFP = FIR_FP_DEFAULTS; FIR_FP firFP_c = FIR_FP_DEFAULTS; #pragma DATA_SECTION(dbuffer, "firldb") #pragma DATA_SECTION(dbuffer_c, "firldb_c") float dbuffer[FIR_ORDER+1]; float dbuffer_c[FIR_ORDER+1];
//#pragma DATA_SECTION(sigIn, "sigIn"); //#pragma DATA_SECTION(sigOut, "sigOut"); float sigIn[SIGNAL_LENGTH]; float sigIn_c[SIGNAL_LENGTH]; float sigOut[SIGNAL_LENGTH]; float sigOut_c[SIGNAL_LENGTH]; #pragma DATA_SECTION(coeff, "coefffilt"); float const coeff[FIR_ORDER+1]= FIR_FP_LPF64; float xn,xn_c,yn,yn_c; …… void main()
{
……
firFP.order=FIR_ORDER; firFP.dbuffer_ptr=dbuffer; firFP.coeff_ptr=(float *)coeff; firFP.init(&firFP); firFP_c.order=FIR_ORDER; firFP_c.dbuffer_ptr=dbuffer_c; firFP_c.coeff_ptr=(float *)coeff; firFP_c.init(&firFP_c);
for(i=0; i < SIGNAL_LENGTH; i++) { xn=0.5*sin(Rad) + 0.5*sin(Rad2); //Q15 //xn = 0.5; sigIn=xn; firFP.input= xn; firFP.calc(&firFP); yn = firFP.output; sigOut=yn;
xn_c=sin(Rad) + sin(Rad2); //Q15 sigIn_c=xn_c; firFP_c.input = xn_c; firFP_c.calc(&firFP_c); yn_c = firFP_c.output; sigOut_c=yn_c;
Rad = Rad + RadStep; Rad2 = Rad2 + RadStep2; } …… } 主程序是没问题了,但编译还会出现警告(与图16中显示的基本一致),此时我们需要对28335_FIR_RAM_lnk.cmd做些修改。将原来 firldb align(0x800) > RAML0 PAGE = 0 firfilt align(0x800) > RAML1 PAGE = 0 coefffilt align(0x800)> RAML2 PAGE = 0 sigIn align(0x800) > RAML6 PAGE = 1 sigOut align(0x800) > RAML7 PAGE = 1 修改为: firldb align(0x400) > RAML0 PAGE = 0 firldb_c align(0x400) > RAML0 PAGE = 0 firfilt align(0x400) > RAML1 PAGE = 0 firfilt_c align(0x400) > RAML1 PAGE = 0 coefffilt align(0x800)> RAML2 PAGE = 0 cmd文件的配置格式和具体存储区的划分方式可参考文档TMS320C28x Assembly Language Tools User's Guide v6.1.pdf,编号spru513E。在此处描述为什么align(0x400)(指定0x400字空间)。 在文档C28-FPU-LIB-UG.pdf(C:\ti\controlSUITE\libs\dsp\FPU\v131\doc)3.16节中指出缓冲区的最小值必须是2*(order+1)字。在工程链接文件中,firdb指定的空间大于或等于最小需求。在本例中,最小的空间为2*(63+1)=128words,而align(0x400)的空间为4*162=1024words,已经满足要求。 修改完之后编译,Debug,程序执行结果如图13、14、15所示。从图13中可知xn_c是xn的2倍,符合程序,滤波的结果yn_c亦是yn的2倍,证明两路FIR滤波已经实现。图14、15分别存储了正弦函数不同幅值下滤波的结果,对比两图发现,数组sigOut_c中的元素是数组sigOut中相同下标元素的2倍。
图 13:两路FIR滤波实现结果
图 14:xn=0.5*sin(Rad) + 0.5*sin(Rad2)的滤波结果
图 15:xn_c=sin(Rad) + sin(Rad2)的滤波结果 此时在Debug模式下,两路FIR滤波算法已经实现,在下一部分将介绍在Release模式下实现两路FIR滤波。
[ 本帖最后由 newofcortexm3 于 2013-8-16 21:53 编辑 ] |