This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F2.8377万D:..\ti\controlSUITE\libs\DSP\FPU\v131\lib\C28x_FPU_Lib.lib未按指定方式工作(FIR过滤器实现)

Guru**** 2551110 points
Other Parts Discussed in Thread: CONTROLSUITE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/629560/tms320f28377d-ti-controlsuite-libs-dsp-fpu-v131-lib-c28x_fpu_lib-lib-not-working-as-specifed-fir-filter-implementation

部件号:TMS320F2.8377万D
主题: controlSUITE中讨论的其他部件

浮点FIR滤波器出现问题

器件:TMS320F2.8377万D

使用的库:C28x_FPU_Lib (访问位置:C:\ti\controlSUITE\libs\DSP\FPU\v131\lib)

使用lib的目的:通过400次点击实现FIR滤波器(coefficents)

人:Denis Sušin斯洛文尼亚电气工程学院

 

您好,

我的任务是制作联机DCT (离散余弦变换)或DFT (离散傅里叶变换)过滤器。 此类滤波器用于传递输入信号的选择性谐波,是FIR类型的滤波器。 我需要精确的DCT过滤器,不允许使用替代物(此过滤器在称为DCT控制器的控制器内使用)。 系数的计算方式如下:

 

 

如果仅通过滤波器传递信号的第一个谐波,则系数如下图所示:

我需要400次水龙头(Coeficients)。 采样频率为20 kHz,栅格的基本频率为50 Hz。 这会在一个信号周期内提供400个样本,因此我需要在50 us时间窗口内实施400次分路的在线FIR滤波器(实际上甚至更快–最多10 us)。

 

我试图先用C中的for语句来完成任务,但这当然花费了太多时间。

 

然后,我从controlSUITE获取FPU库,并研究了FIR过滤器主题的文档。 我做了个例子并尝试了一下。 我发现了两个问题:

  1. 在FPU库的文档(第46页)中,FIR过滤器的顺序是系数数减去一(下图)。


    问题是顺序必须与系数数完全相同。 只有在这种情况下,延迟缓冲区和输出才能正常工作。

  2. 如果使用的水龙头少于128个,其他一切似乎都正常工作。 超过128次点击后,事情就不再起作用了。 我认为这个图书馆最多可以抽128次,但在文档中没有提到这一限制。 相反,FIR滤波器的规格是达到512个及以上的丝锥。

    问题可能出在循环间接寻址上。 在FIR过滤器实现的源代码中,xar 6寄存器用于延迟缓冲区。 在TMS320C28x CPU和指令集参考指南第144页上,可以找到以下图片:

 

可以看出,XAR6的前8位仅用于延迟缓冲区。 这意味着只能对256个内存字进行寻址,这仅足以容纳128个变量(32位浮点变量)。

 

上述两个问题已在Code Composer Studio中进行了测试。 系数缓冲器为Dirac脉冲,FIR滤波器中的输入是每个周期递增的信号。 我正在观察(调试) struct firfp和两个缓冲区:dbuffercoeffer

 

 如果有人可以帮助我处理为大于128 (至少400)的TAP工作的源代码,我将非常感谢。

 

此致,

 

Denis Sušin

电气工程学院

卢布尔雅那大学

斯洛文尼亚

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的Denis:

    FIR滤波器的顺序是指传输函数描述中的零数。 一阶过滤器 将有两个分路器,因此需要两个系数。 如果筛选器为400,则需要401个系数。  如果您希望使用精确的400个系数实现筛选器,则应输入399作为筛选顺序。   源文件"FIR_F32.ASM"顶部的注释显示了传输功能和一个基本图表 ,希望能澄清这一点。

    源代码在您的帖子中不使用循环寻址模式。 该代码将AMODE切换为1,以 使用不同形式的循环寻址,其中XAR1的上16位确定缓冲区大小。   此模式在CPU用户指南的同一章节中进行了介绍,略深入。   使用此模式的缓冲区大小上限为6.5535万 + 1,并且没有对齐要求,因此您 应该能够处理400个32位数据的缓冲区而不会出现问题。

    在200 MHz机器上,滤波器应在(399 + 52) x 5 ns = 2.255 us下执行。

    您能否尝试399订单设置并告诉我它是否有效?

    此致,

    Richard

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的Richard:

    我想多谢你的答复。 你所说的都是真的,我也是自己弄清楚的,但是…

    使用的源文件FIR_F32.ASM的AMODE =0 (默认值),这意味着位XAR1(7:0)决定循环缓冲区的大小(在本例中,C代码中的数组"dbuffer")。 仅使用较低的8位,限制为256个字(地址)-> 128个浮点变量(“dbuffer”大小,因此在C代码中也使用“coeffer”大小)。 当XAR6(7:0)等于XAR1(7:0)时,地址XAR6(7:0)被重置。 这是在值256或更低的情况下完成的。

    浮点FIR过滤器(FIR_F32.ASM)的源代码部分粘贴在此处(您可以看到AMODE位没有变化):

    _ FI_FP_calc:

    ;环境保存
    MOV32 R0H,R6H ;在R 0,1上存储R 6,7
    MOV32 R1H,R7H
    按XAR1

    ; XAR7=coeff_ptr。 将基座PTR (+2)调整为指数超过7
    MOVL XAR7,* XAR4++ ; XAR7 = coeff_ptr

    MOVL XAR6,*+ XAR4[0] ; XAR6 =&dbuffer_ptr [cbindex]

    ;在XAR1中设置循环缓冲区的长度,即(2*num_elements)
    ZAPA
    添加 ACC,*+ XAR4[3]<< 1. ; ACC=0 +订购*2
    MOVZ AR1,AL
    ;MOV AR1,#62
    SubB XAR1,#2

    ; fir -> dbuffer_ptr [CB_idx]= fir ->输入;
    MOVL XAR0,*+ XAR4[4] ;XAR0 =输入
    MOVL * XARXARX52++ 6 % ,XAR0 ;将输入存储到dbuf中
    MOVL *+ XAR4[0],XAR6 ;更新dbuffer_ptr (用作cbindex)

    MOVZ AR0,*+ XAR4[3] ; AR0=顺序
    ;MOV AR0,#31
    SubB XAR0,#1

    ; FIR:执行抽搐
    零R2H
    零R3H
    零R6H
    零R7H

    报告 AR0
    || MACF32 R7H,R3H,*XAR74++ 6 % ,*XAR7++

    ADDF32 R6H,R6H,R2H ; EpilogueAdditions
    ADDF32 R7H,R7H,R3H

    ;不可操作。 在延迟插槽中恢复上下文。
    POP XAR1.

    ADDF32 R7H,R7H,R6H

    ;不可操作。 在延迟插槽中恢复上下文。
    MOV32 R6H,R0H

    MOV32 *+ XAR4[6],R7H ; fir ->输出= res;

    ;恢复上下文。
    MOV32 R7H,R1H

    LRETR


    将AMODE位更改为1可能是这样的(整数FIR过滤器–FIR16_alt.asm中的源代码的一部分):

    .lp_amode
    SETC AMODE ;允许使用C2xLP寻址模式
    ; 1 % *+XAR6[XAR4++]
    MOVL *+XAR6[ACL++],符合1 % ;*XAR6[AR1]=[ X : input],AR1+=2
    ZAPA
    报告 AR0 ;重复医嘱/2+1次
    || DMAC ACC:P,*+XAR6[XAR4伴1 % +],*XAR7++ ; XT =*+XAR6+[XAR7++] 1 % ,温度=*XAR7+
    ; ACC =(XT.MSW*Temp.MSW)<< PM (>>-6)
    ; P =(XT.LSW*Temp.LSW)<< PM (>>-6)

    .c28_amode
    CLRC AMODE ;返回C28x寻址模式





    我再次重复,我正在使用FIR_F32.ASM (浮点FIR过滤器),其中AMODE =0。
    我试了很多次,今天上午又试了一次。 如果我想要获得正确的结果,必须满足C中的两个实际条件:
    1. 我必须使用128个或更少的系数。
    2. C中"顺序"的值必须等于系数数。

    请自己测试代码。

    在第49页的C28x-FPU-LIB-UG.pdf (相关目录:..\ti\controlSUITE\libs\DSP\FPU\v131\doc)中,用户可以看到FIR顺序从31到511的基准。

    我认为有些地方是错误的。 我认为源文件FIR_F32.ASM有其限制(最大顺序为127,这意味着128个系数),文档不正确。 也许AMODE =1的浮点FIR的备用源代码是可访问的,但我没有它。

    所以,最后一个问题的答案是否定的 具有399订单设置的代码不起作用。


    此致,

    Denis Sušin ć
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的Richard:

    我必须承认,我使用的是FPU库的旧版本–v 1.31。 2014年,我发现了同样的问题-循环缓冲区限制为256个字。 很明显,我在2017年再次发现了该错误。

    使用v.1.40 v.00.00 版本,源代码已得到更正,循环缓冲区限制为6.5536万个字。

    下图显示了我的错误的图形表示。

    附注:从现在开始,我将观看修订历史。

    感谢您的参与和解释!

    此致,

    Denis Sušin ć

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的Denis:

    很高兴听到您走出了困境。  感谢您告知我们。

    此致,

    Richard