FIR例程 - TMS320C6748 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6262|回复: 10
打印 上一主题 下一主题

FIR例程

[复制链接]

26

主题

96

帖子

1380

积分

金牌会员

Rank: 6Rank: 6

积分
1380
跳转到指定楼层
楼主
发表于 2016-12-12 15:42:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

如图函数的原型在哪里,我找到了几个接近的,但是没有找到该函数原型。请赐教

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

32

主题

97

帖子

2049

积分

金牌会员

Rank: 6Rank: 6

积分
2049
沙发
发表于 2016-12-12 17:14:00 | 只看该作者
那可能就没有
回复 支持 反对

使用道具 举报

7

主题

104

帖子

705

积分

高级会员

Rank: 4

积分
705
板凳
发表于 2016-12-13 08:26:43 来自手机 | 只看该作者
在dsplib安装目录下
回复 支持 反对

使用道具 举报

26

主题

96

帖子

1380

积分

金牌会员

Rank: 6Rank: 6

积分
1380
地板
 楼主| 发表于 2016-12-14 15:10:58 | 只看该作者

我就是在这个文件夹里找的,没有找到这个函数,希望您能给我一个详细的路径,帮我解决这个问题。
回复 支持 反对

使用道具 举报

26

主题

96

帖子

1380

积分

金牌会员

Rank: 6Rank: 6

积分
1380
5#
 楼主| 发表于 2016-12-14 15:11:45 | 只看该作者

没有的话函数怎么可以执行?
回复 支持 反对

使用道具 举报

7

主题

104

帖子

705

积分

高级会员

Rank: 4

积分
705
6#
发表于 2016-12-15 21:42:38 | 只看该作者
70010x 发表于 2016-12-14 15:10
我就是在这个文件夹里找的,没有找到这个函数,希望您能给我一个详细的路径,帮我解决这个问题。 ...

比如我安装目录
C:\ti\c674x-dsplib_1_03_00_01\src\DSPF_sp_fir_r2 目录下的
这是TI经过优化的代码。DSPF_sp_fir_r2.asm就是源码

点评

这是正确答案啊 C:\ti\dsplib_c674x_3_4_0_0\packages\ti\dsplib\src\DSPF_sp_fir_r2\c674 其中DSPF_sp_fir_r2_cn.c 自然 C 语言代码 DSPF_sp_fir_r2_opt.c 优化 C 语言代码 DSPF_sp_fir_r2.s 汇编优化代码  详情 回复 发表于 2016-12-17 21:45
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
7#
发表于 2016-12-17 21:45:46 | 只看该作者
电子微创意 发表于 2016-12-15 21:42
比如我安装目录
C:\ti\c674x-dsplib_1_03_00_01\src\DSPF_sp_fir_r2 目录下的
这是TI经过优化的代码。DSP ...

这是正确答案啊
C:\ti\dsplib_c674x_3_4_0_0\packages\ti\dsplib\src\DSPF_sp_fir_r2\c674
其中DSPF_sp_fir_r2_cn.c 自然 C 语言代码
  1. #pragma CODE_SECTION(DSPF_sp_fir_r2_cn, ".text:ansi");

  2. #include "DSPF_sp_fir_r2_cn.h"

  3. void DSPF_sp_fir_r2_cn(const float *x, const float *h,
  4.     float *y, const int nh, const int ny)
  5. {
  6.     int i, j;
  7.     float sum;

  8.     for (j = 0; j < ny; j++)
  9.     {
  10.         sum = 0;

  11.         // note: h coeffs given in reverse order: { h[nh-1], h[nh-2], ..., h[0] }
  12.         for (i = 0; i < nh; i++)
  13.             sum += x[i + j] * h[i];
  14.         
  15.         y[j] = sum;
  16.     }
  17. }
复制代码
DSPF_sp_fir_r2_opt.c 优化 C 语言代码
  1. #pragma CODE_SECTION(DSPF_sp_fir_r2_opt, ".text:intrinsic");

  2. void DSPF_sp_fir_r2_opt(const float * x, const float * h,
  3.     float *restrict y, const int nh, const int ny)
  4. {
  5.     int i, j;
  6.     float sum1, sum2;

  7.     _nassert((int)x % 8 == 0);
  8.     _nassert((int)h % 8 == 0);
  9.     _nassert(nh >= 4);
  10.     _nassert(nh % 2 == 0);
  11.     _nassert(ny >= 2);
  12.     _nassert(ny % 2 == 0);
  13.    
  14.     #pragma MUST_ITERATE(1,,)
  15.     for (j = 0; j < ny; j += 2)
  16.     {
  17.         sum1 = 0;
  18.         sum2 = 0;

  19.         #pragma MUST_ITERATE(2,,)
  20.         for (i = 0; i < nh; i += 2)
  21.         {
  22.             sum1 += x[i + j] * h[i];
  23.             sum2 += x[i + j + 1] * h[i];
  24.             
  25.             sum1 += x[i + j + 1] * h[i + 1];
  26.             sum2 += x[i + j + 2] * h[i + 1];
  27.         }

  28.         // store the results
  29.         y[j]     = sum1;
  30.         y[j + 1] = sum2;
  31.     }
  32. }
复制代码
DSPF_sp_fir_r2.s 汇编优化代码
  1. * ======================================================================= *
  2. * DSPF_sp_fir_r2.asm -- FIR R2 Filter                                     *
  3. *                 Legacy ASM Implementation from C67x DSPLIB              *
  4. *                                                                         *
  5. * Rev 0.0.2                                                               *
  6. *                                                                         *
  7. * ----------------------------------------------------------------------- *
  8. *            Copyright (c) 2009 Texas Instruments, Incorporated.          *
  9. *                           All Rights Reserved.                          *
  10. * ======================================================================= *


  11. * ======================================================================== *
  12. * ======================================================================== *

  13.         .sect ".text:optimized"
  14.         .if __TI_EABI__
  15.         .asg  DSPF_sp_fir_r2, _DSPF_sp_fir_r2
  16.         .endif               
  17.                
  18.         .global _DSPF_sp_fir_r2
  19. _DSPF_sp_fir_r2:

  20. * ======================================================================== *
  21. * ======================================================================== *

  22.                .asg   B15,     B_SP
  23.                .asg   A0,      A_SP
  24.                .asg   A4,      A_x
  25.                .asg   A5,      A_x_ptr
  26.                .asg   B4,      B_h
  27.                .asg   B5,      B_h_ptr
  28.                .asg   A8,      A_CSR_str
  29.                .asg   B0,      B_CSR_gie
  30.                .asg   A8,      A_nr
  31.                .asg   B2,      B_nr
  32.                .asg   A6,      A_r
  33.                .asg   A6,      A_nh
  34.                .asg   B6,      B_r
  35.                .asg   B6,      B_nh
  36.                .asg   B10,     B_x0
  37.                .asg   B10,     B_x2
  38.                .asg   B10,     B_x20
  39.                .asg   B11,     B_x1
  40.                .asg   B11,     B_x3
  41.                .asg   B11,     B_x31
  42.                .asg   B12,     B_x42
  43.                .asg   B12,     B_x4
  44.                .asg   B12,     B_x_2
  45.                .asg   A10,     A_h0
  46.                .asg   A11,     A_h1
  47.                .asg   A7,      A_prod
  48.                .asg   B7,      B_prod
  49.                .asg   A9,      A_sum
  50.                .asg   B9,      B_sum
  51.                .asg   A2,      A_zero
  52.                .asg   B1,      B_zero
  53.                .asg   A5,      A_zero1
  54.                .asg   B5,      B_zero1
  55.                .asg   B14,     B_prod1
  56.                .asg   A3,      A_prod2
  57.                .asg   A12,     A_prod3
  58.                .asg   A0,      A_prod4
  59.                .asg   A12,     A_x20
  60.                .asg   A12,     A_x0
  61.                .asg   A12,     A_x2
  62.                .asg   A13,     A_x31
  63.                .asg   A13,     A_x1
  64.                .asg   A13,     A_x3
  65.                .asg   A12,     A_sum_4
  66.                .asg   B13,     B_h_1
  67.                .asg   B14,     B_h1
  68.                .asg   A2,      A_ictr
  69.                .asg   A1,      A_RSTflg
  70.                .asg   A1,      A_h_t
  71.                .asg   A1,      A_h_1t
  72.                .asg   B8,      B_MULT4
  73.                .asg   B2,      B_MULflg
  74.                .asg   B0,      B_MULT2
  75.                .asg   B0,      B_STRflg
  76.                .asg   B1,      B_nreq2
  77.                .asg   A5,      A_sum_t
  78.                .asg   B5,      B_sum_t
  79.                .asg   B14,     B_x
  80.                


  81.              LDDW  .D1T2 *A_x,      B_x1:B_x0             ; load x[i+j+1]:x[i+j]
  82. ||           SUBAW .D2   B_SP,      11,         B_SP      ; Save stack space
  83. ||           AND   .L2X  A_nr,      0x3,        B_MULflg  ; find out multiple of 4
  84. ||           MVC   .S2   CSR,       B_CSR_gie             ; Get CSR
  85. ||           MV    .L1   A_x,       A_x_ptr               ; Set x_ptr
  86. ||           MV    .S1X  B_h,       A_h_t                 ; Set temporary h_ptr

  87.              LDW   .D1T1 *+A_h_t[3],A_h_1t                ; load h[i+3] to remove cross path
  88. ||[B_MULflg] SUB   .S1   A_nr,      2,          A_nr      ; make counter multiple of 4
  89. ||           MVK   .S2   0,         B_MULT4               ; flag for multiple of 4
  90. ||           STW   .D2T2 B_x,       *+B_SP[5]             ; store B14
  91. ||           MV    .L2   B_h,       B_h_ptr               ; Set h_ptr
  92. ||           MV    .L1X  B_SP,      A_SP                  ; Copy stack pointer
  93.             
  94.              STW   .D2T1 A_h0,      *+B_SP[1]             ; Sore A10
  95. ||           STW   .D1T2 B_x20,     *+A_SP[6]             ; Store B10
  96. ||[!B_MULflg]MVK   .S2   1,         B_MULT4               ; flag for multiple of 4
  97. ||           MV    .L2X  A_nr,      B_nr                  ; copy nr
  98.   
  99.              STW   .D2T1 A_h1,      *+B_SP[2]             ; Store A11
  100. ||           STW   .D1T2 B_x31,     *+A_SP[7]             ; Store B11
  101. ||           MV    .S1X  B_CSR_gie, A_CSR_str             ; Store CSR  
  102. ||           AND   .S2   B_CSR_gie, -2,         B_CSR_gie ; Disable GIE
  103.                
  104.              STW   .D2T1 A_x20,     *+B_SP[3]             ; Store A12
  105. ||           STW   .D1T2 B_x42,     *+A_SP[8]             ; Store B12
  106. ||           MV    .L1X  B_nh,      A_nh                  ; Change side of nh
  107. ||           MV    .L2X  A_r,       B_r                   ; Change side of r
  108.   
  109.              STW   .D2T1 A_x31,     *+B_SP[4]             ; Store A13
  110. ||           STW   .D1T2 B_h_1,     *+A_SP[9]             ; Store B13
  111. ||           MVC   .S2   B_CSR_gie, CSR                   ; Disable interrupt
  112. ||           ZERO  .L2   B_nreq2                          ; flag for checking if nr=2

  113. ; -------------------------------------------------------------
  114.                
  115.              LDDW  .D2T1 *B_h++,    A_h1:A_h0             ; load h[i+1]:h[i]
  116. ||[B_nr]     ADDAD .D1   A_x_ptr,   2,          A_x_ptr   ; if nr!=2 update x_ptr
  117. ||[!B_nr]    MVK   .S2   1,         B_nreq2               ; Set flag for nr=2
  118. ||[!B_nr]    SUB   .L2   1,         B_MULT4,    B_MULT4   ; Invert Mult4 flag if nr=2

  119.              LDW   .D1T2 *A_x[2],   B_x_2                 ; load x[i+j+2]
  120. ||[!B_nr]    MVK   .S2   4,         B_nr                  ; load 4 in counter if NR=2
  121. ||           MV    .L2X  A_h_1t,    B_h_1                 ; Get h[i+3]
  122.                
  123.              LDDW  .D1T2 *++A_x,    B_x31:B_x20           ; load x[i+j+3(1)]:x[i+j+2(0)]
  124. ||           MV    .L2X  A_x_ptr,   B_x                   ; Set x_ptr for B side         
  125.                
  126.              LDW   .D1T2 *A_x[2],   B_x42                 ; load x[i+j+2(4)]
  127. ||           SUB   .S1   A_nh,      2,          A_ictr    ; Set inner loop ctr
  128. ||           ZERO  .L1   A_prod                           ; Initialise prod
  129. ||           ZERO  .L2   B_prod                           ; Initialise prod
  130. ||           B     .S2   ILOOP                            ; Branch to inner loop
  131.                
  132.              LDDW  .D2T1 *B_h++,    A_h1:A_h0             ; load h[i+1]:h[i]
  133. ||           SUB   .S1   A_nh,      2,          A_RSTflg  ; Set reset flag
  134. ||           ZERO  .L2   B_sum                            ; Initialise accumulator
  135. ||           ZERO  .L1   A_sum                            ; Initialise accumulator
  136. ||           MVK   .S2   0,         B_STRflg              ; Reset store flag

  137. ILOOP:
  138.   [B_STRflg] STW   .D2T1 A_sum_4,   *B_r++                ; Store sum7
  139. ||[!A_RSTflg]LDW   .D1T2 *A_x[2],   B_x42                 ; load x[i+j+2(4)]
  140. ||           MPYSP .M1X  A_h0,      B_x0,       A_prod    ; h[i] * x[i+j]
  141. ||           MPYSP .M2X  A_h1,      B_x1,       B_prod    ; h[i+1] * x[i+j+1]
  142. ||           ADDSP .L1   A_sum,     A_prod,     A_sum     ; sum1 += h[i] * x[i+j]
  143. ||           ADDSP .L2   B_sum,     B_prod,     B_sum     ; sum2 += h[i+1] * x[i+j+1]
  144. ||[!A_RSTflg]MVK   .S1   6,         A_RSTflg              ; Reset reset flag
  145. ||           MVK   .S2   0,         B_STRflg              ; Reset store flag

  146.              LDDW  .D1T2 *++A_x,    B_x31:B_x20           ; load x[i+j+3(1)]:x[i+j+2(0)]
  147. ||[!A_ictr]  LDDW  .D2T1 *++B_x,    A_x31:A_x20           ; load x[i+j+3(1)]:x[i+j+2(0)]
  148. ||           MPYSP .M1X  A_h0,      B_x1,       A_prod    ; h[i] * x[i+j+1]
  149. ||           MPYSP .M2X  A_h1,      B_x_2,      B_prod    ; h[i+1] * x[i+j+2]         
  150. ||           ADDSP .L1   A_sum,     A_prod,     A_sum     ; sum3 += h[i] * x[i+j+1]
  151. ||           ADDSP .L2   B_sum,     B_prod,     B_sum     ; sum4 += h[i+1] * x[i+j+2]
  152. ||[A_RSTflg] SUB   .S1   A_RSTflg,  2,          A_RSTflg  ; Update reset flag

  153.              LDW   .D1T2 *A_x[2],   B_x42                 ; load x[i+j+2(4)]
  154. ||[!A_RSTflg]MV    .D2   B_h_ptr,   B_h                   ; Set h pointer
  155. ||           MPYSP .M1X  A_h0,      B_x2,       A_prod    ; h[i] * x[i+j+2]           
  156. ||           MPYSP .M2X  A_h1,      B_x3,       B_prod    ; h[i+1] * x[i+j+3]
  157. ||           ADDSP .L1   A_sum,     A_prod,     A_sum     ; sum5 += h[i] * x[i+j+2]
  158. ||           ADDSP .L2   B_sum,     B_prod,     B_sum     ; sum6 += h[i+1] * x[i+j+3]
  159. ||[A_ictr]   B     .S2   ILOOP                            ; Branch to inner loop
  160. ||[A_ictr]   SUB   .S1   A_ictr,    2,          A_ictr    ; Update inner loop counter

  161.              LDDW  .D2T1 *B_h++,    A_h1:A_h0             ; load h[i+1]:h[i]
  162. ||[!A_RSTflg]LDDW  .D1T2 *A_x_ptr,  B_x1:B_x0             ; load x[i+j+1]:x[i+j+0]               
  163. ||           MPYSP .M1X  A_h0,      B_x3,       A_prod    ; h[i] * x[i+j+3]
  164. ||           MPYSP .M2X  A_h1,      B_x4,       B_prod    ; h[i+1] * x[i+j+4]
  165. ||           ADDSP .L1   A_sum,     A_prod,     A_sum     ; sum7 += h[i] * x[i+j+3]
  166. ||           ADDSP .L2   B_sum,     B_prod,     B_sum     ; sum8 += h[i+1] * x[i+j+4]
  167. ||[!A_RSTflg]MV    .S1   A_x_ptr,   A_x                   ; Set x pointer

  168. ; ------------------------------------------------------------

  169.              LDW   .D2T2 *-B_h[1],  B_h1                  ; load h[i+5]
  170. ||           MPYSP .M1   A_h0,      A_x0,       A_prod    ; h[i] * x[i+j]
  171. ||           MPYSP .M2   B_h_1,     B_x1,       B_prod    ; h[i+1] * x[i+j+1]  
  172. ||           ADDSP .L1   A_zero,    A_prod,     A_sum     ; sum1 = h[i] * x[i+j]
  173. ||           ADDSP .L2X  A_sum,     B_sum,      B_sum     ; sum2 = sum1 + sum2
  174. ||           MV    .S2   B_prod,    B_prod1               ; sum2 = h[i+1] * x[i+j+1]  
  175. ||           ADDAD .D1   A_x_ptr,   2,          A_x_ptr   ; Update x_ptr

  176.              LDDW  .D1T2 *++A_x,    B_x31:B_x20           ; load x[i+j+3(1)]:x[i+j+2(0)]
  177. ||[B_nr]     SUB   .D2   B_nr,      4,          B_nr      ; Update outer loop counter               
  178. ||           MPYSP .M1   A_h0,      A_x1,       A_prod    ; h[i] * x[i+j+1]
  179. ||           MPYSP .M2   B_h_1,     B_x_2,      B_prod    ; h[i+1] * x[i+j+2]               
  180. ||           ADDSP .L2X  A_zero,    B_prod,     B_sum     ; sum4 = h[i+1] * x[i+j+2]
  181. ||           ADDSP .L1X  A_sum,     B_sum,      A_sum     ; sum3 = sum3 + sum4
  182. ||           MV    .S1   A_prod,    A_prod2               ; sum3 = h[i] * x[i+j+1]
  183. ||[!B_nreq2] ZERO  .S2   B_zero                           ; Zero for pseudo move

  184.              LDW   .D1T2 *A_x[2],   B_x42                 ; load x[i+j+2(4)]
  185. ||           MPYSP .M1   A_h0,      A_x2,       A_prod    ; h[i] * x[i+j+2]               
  186. ||           MPYSP .M2   B_h_1,     B_x3,       B_prod    ; h[i+1] * x[i+j+3]
  187. ||           ADDSP .L2   B_zero,    B_prod,     B_sum     ; sum6 = h[i+1] * x[i+j+3]
  188. ||           ADDSP .L1X  A_sum,     B_sum,      A_sum     ; sum5 = sum5 + sum6
  189. ||           MV    .S1   A_prod,    A_prod3               ; sum5 = h[i] * x[i+j+2]
  190. ||[B_nr]     B     .S2   ILOOP
  191. ||           ADD   .D2   B_MULT4,   B_nr,       B_MULT2   ; If last it.¬ mult4 then 0 else 1

  192.              LDDW  .D2T1 *B_h++,    A_h1:A_h0             ; load h[i+1]:h[i]
  193. ||           MPYSP .M1   A_h0,      A_x3,       A_prod    ; h[i] * x[i+j+3]
  194. ||           MPYSP .M2   B_h_1,     B_x4,       B_prod    ; h[i+1] * x[i+j+4]
  195. ||           ADDSP .L2   B_zero,    B_prod,     B_sum     ; sum8 = h[i+1] * x[i+j+4]
  196. ||           ADDSP .L1X  A_sum,     B_sum,      A_sum_4   ; sum7 = sum7 + sum8
  197. ||           MV    .D1   A_prod,    A_prod4               ; sum7 = h[i] * x[i+j+3]
  198. ||[!B_MULT2] B     .S1   MULT2
  199.                
  200. ; ------------------------------------------------------------

  201.              STW   .D2T2 B_sum,     *B_r++                ; Store sum2
  202. ||           MPYSP .M1X  A_h0,      B_x0,       A_prod    ; h[i] * x[i+j]
  203. ||           MPYSP .M2X  A_h1,      B_x1,       B_prod    ; h[i+1] * x[i+j+1]   
  204. ||           ADDSP .L1   A_sum,     A_prod,     A_sum     ; sum1 += h[i] * x[i+j]
  205. ||           ADDSP .L2   B_prod1,   B_prod,     B_sum     ; sum2 += h[i+1] * x[i+j+1]
  206. ||           SUB   .S1   A_nh,      8,          A_ictr    ; Update inner loop ctr

  207.              STW   .D2T1 A_sum,     *B_r++                ; Store sum3      
  208. ||           LDDW  .D1T2 *++A_x,    B_x31:B_x20           ; load x[i+j+3(1)]:x[i+j+2(0)]   
  209. ||           MPYSP .M1X  A_h0,      B_x1,       A_prod    ; h[i] * x[i+j+1]
  210. ||           MPYSP .M2   B_h1,      B_x_2,      B_prod    ; h[i+1] * x[i+j+2]                  
  211. ||           ADDSP .L1   A_prod2,   A_prod,     A_sum     ; sum3 += h[i] * x[i+j+1]
  212. ||           ADDSP .L2   B_sum,     B_prod,     B_sum     ; sum4 += h[i+1] * x[i+j+2]
  213. ||           SUB   .S1   A_nh,      8,          A_RSTflg  ; Update reset flag
  214. ||           MV    .S2X  A_x_ptr,   B_x                   ; Set x pointer for B side

  215.   [!B_nreq2] STW   .D2T1 A_sum,     *B_r++                ; Store sum5
  216. ||           LDW   .D1T2 *A_x[2],   B_x42                 ; load x[i+j+2(4)]
  217. ||           MPYSP .M1X  A_h0,      B_x2,       A_prod    ; h[i] * x[i+j+2]               
  218. ||           MPYSP .M2X  A_h1,      B_x3,       B_prod    ; h[i+1] * x[i+j+3]
  219. ||           ADDSP .L1   A_prod3,   A_prod,     A_sum     ; sum5 += h[i] * x[i+j+2]
  220. ||           ADDSP .L2   B_sum,     B_prod,     B_sum     ; sum6 += h[i+1] * x[i+j+3]
  221. ||[B_nr]     B     .S1   ILOOP                            ; Branch to inner loop
  222. ||[!A_RSTflg]MV    .S2   B_h_ptr,   B_h                   ; Set h pointer

  223.              LDDW  .D2T1 *B_h++,    A_h1:A_h0             ; load h[i+1]:h[i]
  224. ||[!A_RSTflg]LDDW  .D1T2 *A_x_ptr,  B_x1:B_x0             ; load x[i+j+1]:x[i+j+0]
  225. ||           MPYSP .M1X  A_h0,      B_x3,       A_prod    ; h[i] * x[i+j+3]
  226. ||           MPYSP .M2X  A_h1,      B_x4,       B_prod    ; h[i+1] * x[i+j+4]
  227. ||           ADDSP .L1   A_prod4,   A_prod,     A_sum     ; sum7 += h[i] * x[i+j+3]
  228. ||           ADDSP .L2   B_sum,     B_prod,     B_sum     ; sum8 += h[i+1] * x[i+j+4]   
  229. ||[!A_RSTflg]MV    .S1   A_x_ptr,   A_x                   ; Set x pointer

  230. ; -------------------------------------------------------------
  231.   [!B_nreq2] STW   .D2T1 A_sum_4,   *B_r++                ; Store sum2
  232. ||           MPYSP .M1X  A_h0,      B_x0,       A_prod    ; h[i] * x[i+j]
  233. ||           MPYSP .M2X  A_h1,      B_x1,       B_prod    ; h[i+1] * x[i+j+1]   
  234. ||           ADDSP .L1   A_sum,     A_prod,     A_sum     ; sum1 += h[i] * x[i+j]
  235. ||           ADDSP .L2   B_sum,     B_prod,     B_sum     ; sum2 += h[i+1] * x[i+j+1]
  236. ||[!B_MULT2] B     .S2   LOOP                             ; Jump to inner loop of MULT2         
  237. ; -------------------------------------------------------------     
  238.          
  239. END:              
  240.              MVC   .S2X  A_CSR_str, CSR                   ; Enable Interrupts
  241. ||           MV    .S1X  B_SP,      A_SP                  ; Copy stach pointer
  242.         
  243.              LDW   .D1T1 *+A_SP[1], A_h0                  ; Load A10   
  244. ||           LDW   .D2T2 *+B_SP[6], B_x20                 ; Load B10
  245.                
  246.              LDW   .D1T1 *+A_SP[2], A_h1                  ; Load A11
  247. ||           LDW   .D2T2 *+B_SP[7], B_x31                 ; Load B11
  248.                
  249.              LDW   .D1T1 *+A_SP[3], A_x20                 ; Load A12
  250. ||           LDW   .D2T2 *+B_SP[8], B_x42                 ; Load B12

  251.              LDW   .D1T1 *+A_SP[4], A_x31                 ; Load A13
  252. ||           LDW   .D2T2 *+B_SP[9], B_h_1                 ; Load B13
  253. ||           B     .S2   B3                               ; Branch out of the function
  254.         
  255.              LDW   .D2T2 *+B_SP[5], B_x                   ; Load B14
  256.         
  257.              ADDAW .D2   B_SP,      11,         B_SP      ; Restore stack space   
  258.         
  259.              NOP         3                                 
  260.            
  261. ; -------------------------------------------------------------           
  262. MULT2:         
  263.   [A_ictr]   LDDW  .D1T2 *++A_x,    B_x1:B_x0             ; load x[i+j+1]:x[i+j+0]
  264. ||[A_ictr]   LDDW  .D2T1 *B_h++,    A_h1:A_h0             ; load h[i+1]:h[i]
  265. ||           MPYSP .M1X  A_h0,      B_x1,       A_prod    ; h[i] * x[i+j+1]
  266. ||           MPYSP .M2X  A_h1,      B_x_2,      B_prod    ; h[i+1] * x[i+j+2]
  267. ||           ADDSP .L1   A_sum,     A_prod,     A_sum     ; sum3 += h[i] * x[i+j+1]
  268. ||           ADDSP .L2   B_sum,     B_prod,     B_sum     ; sum4 += h[i+1] * x[i+j+2]
  269. ||           ZERO  .S1   A_zero1                          ; Zero for pseudo move
  270. ||           ZERO  .S2   B_zero1                          ; Zero for pseudo move

  271.   [A_ictr]   LDW   .D1T2 *A_x[2],   B_x_2                 ; load x[i+j+2]                 
  272. ||           ADDSP .L1   A_zero1,   A_zero1,    A_sum     ; Zero sum1
  273. ||           ADDSP .L2   B_zero1,   B_zero1,    B_sum     ; Zero sum2
  274. ||           MPYSP .M1   A_prod,    A_zero1,    A_prod    ; Zero prod1
  275. ||           MPYSP .M2   B_prod,    B_zero1,    B_prod    ; Zero prod2
  276. ||[A_ictr]   SUB   .S1   A_ictr,    2,          A_ictr    ; Update counter
  277. ||[A_ictr]   B     .S2   LOOP                             ; Branch to loop
  278.                
  279.   [A_ictr]   LDDW  .D1T2 *++A_x,    B_x1:B_x0             ; load x[i+j+1]:x[i+j+0]   
  280. ||           LDDW  .D2T1 *B_h++,    A_h1:A_h0             ; load h[i+1]:h[i]
  281. ||           ADDSP .L1   A_zero1,   A_zero1,    A_sum     ; Zero sum3
  282. ||           ADDSP .L2   B_zero1,   B_zero1,    B_sum     ; Zero sum4
  283. ||           MPYSP .M1   A_prod,    A_zero1,    A_prod    ; Zero prod3
  284. ||           MPYSP .M2   B_prod,    B_zero1,    B_prod    ; Zero prod4

  285. ; --------------------------------------------------------------


  286. LOOP:
  287.   [A_ictr]   LDW   .D1T2 *A_x[2],   B_x_2                 ; load x[i+j+2]
  288. ||           MPYSP .M1X  A_h0,      B_x0,       A_prod    ; h[i] * x[i+j]
  289. ||           MPYSP .M2X  A_h1,      B_x1,       B_prod    ; h[i+1] * x[i+j+1]   
  290. ||           ADDSP .L1   A_sum,     A_prod,     A_sum     ; sum1 += h[i] * x[i+j]
  291. ||           ADDSP .L2   B_sum,     B_prod,     B_sum     ; sum2 += h[i+1] * x[i+j+1]
  292. ||[A_ictr]   SUB   .S1   A_ictr,    2,          A_ictr    ; Update counter
  293. ||[A_ictr]   B     .S2   LOOP                             ; Branch to loop

  294.   [A_ictr]   LDDW  .D1T2 *++A_x,    B_x1:B_x0             ; load x[i+j+1]:x[i+j+0]   
  295. ||[A_ictr]   LDDW  .D2T1 *B_h++,    A_h1:A_h0             ; load h[i+1]:h[i]
  296. ||           MPYSP .M1X  A_h0,      B_x1,       A_prod    ; h[i] * x[i+j+1]
  297. ||           MPYSP .M2X  A_h1,      B_x_2,      B_prod    ; h[i+1] * x[i+j+2]  
  298. ||           ADDSP .L1   A_sum,     A_prod,     A_sum     ; sum3 += h[i] * x[i+j+1]
  299. ||           ADDSP .L2   B_sum,     B_prod,     B_sum     ; sum4 += h[i+1] * x[i+j+2]

  300.              ADDSP .L1X  A_sum,     B_sum,      A_sum     ; sum1 = sum1 + sum3
  301.                
  302.              ADDSP .L2X  A_sum,     B_sum,      B_sum     ; sum3 = sum3 + sum4
  303.                
  304.              ADDSP .L1X  A_sum,     B_sum,      A_sum_t   ; sum1'= sum1 + sum2
  305.                
  306.              ADDSP .L2X  A_sum,     B_sum,      B_sum_t   ; sum3'= sum3 + sum4
  307.                
  308.              NOP         2
  309.                
  310.              ADDSP .L1   A_sum,     A_sum_t,    A_sum     ; sum1 = sum1 + sum1'
  311. ||           B     .S2   END                              ; branch to end

  312.              ADDSP .L2   B_sum,     B_sum_t,    B_sum     ; sum3 = sum3 + sum3'
  313.                
  314.              NOP         2
  315.                
  316.              STW   .D2T1 A_sum,     *B_r++                ; Store sum1
  317.                
  318.              STW   .D2T2 B_sum,     *B_r++                ; Store sum3
  319. ; -----------------------------------------------------------------------------


  320.                 .end

  321. * ======================================================================= *
  322. *  End of file:  DSPF_sp_fir_r2.asm                                       *
  323. * ----------------------------------------------------------------------- *
  324. *            Copyright (c) 2009 Texas Instruments, Incorporated.          *
  325. *                           All Rights Reserved.                          *
  326. * ======================================================================= *
复制代码


点评

例程调用的是汇编函数 即 DSPF_sp_fir_r2  详情 回复 发表于 2016-12-17 21:47
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
8#
发表于 2016-12-17 21:47:16 | 只看该作者
希望缄默 发表于 2016-12-17 21:45
这是正确答案啊
C:\ti\dsplib_c674x_3_4_0_0\packages\ti\dsplib\src\DSPF_sp_fir_r2\c674
其中DSPF_sp_f ...

例程调用的是汇编函数 即 DSPF_sp_fir_r2
回复 支持 反对

使用道具 举报

7

主题

104

帖子

705

积分

高级会员

Rank: 4

积分
705
9#
发表于 2016-12-18 11:09:37 来自手机 | 只看该作者
受益匪浅啊
回复 支持 反对

使用道具 举报

26

主题

96

帖子

1380

积分

金牌会员

Rank: 6Rank: 6

积分
1380
10#
 楼主| 发表于 2016-12-22 10:41:11 | 只看该作者
电子微创意 发表于 2016-12-15 21:42
比如我安装目录
C:\ti\c674x-dsplib_1_03_00_01\src\DSPF_sp_fir_r2 目录下的
这是TI经过优化的代码。DSP ...

嗯,谢谢你,理解了~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2024-5-16 10:45 , Processed in 0.056441 second(s), 29 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表