STM32 DSP函数库 -- 补丁

[复制链接]
12642|17
 楼主| lut1lut 发表于 2008-12-25 09:57 | 显示全部楼层 |阅读模式
在ST更新STM32 DSP库之前,需要用到256点和1024点FFT运算的同学,不妨用以下的补丁打上。

1. 现有的DSP库函数中,64点FFT是正确的。
2. 256/1024点需要更改以下几个地方
(1)NPT的定义

IAR assembly file: #define NPT  64  =>  #define NPT   256/1024
Keil assembly file: NPT EQU 64 => NPT EQU 256/1024
RIDE assembly file: .equ NPT, 64 => .equ NPT, 256/1024

(2)修改一些汇编代码
IAR assembly file: 

        BUTFLY4ZERO_OPT  MACRO pIN,offset, pOUT
                LDRSH Ai, [pIN, #2]
                LDRSH Ar, [pIN],#NPT
                LDRSH Ci, [pIN, #2]
                LDRSH Cr, [pIN],#NPT
                LDRSH Bi, [pIN, #2]
                LDRSH Br, [pIN],#NPT
                LDRSH Di, [pIN, #2]
                LDRSH Dr, [pIN],#NPT

改成:
          
        BUTFLY4ZERO_OPT  MACRO pIN,offset, pOUT
                LDRSH Ai, [pIN, #2]
                LDRSH Ar, [pIN]
            ADD   pIN, pIN, #NPT
                LDRSH Ci, [pIN, #2]
                LDRSH Cr, [pIN]
                  ADD   pIN, pIN, #NPT
                LDRSH Bi, [pIN, #2]
                LDRSH Br, [pIN]
                  ADD   pIN, pIN, #NPT
                LDRSH Di, [pIN, #2]
                LDRSH Dr, [pIN]
                  ADD   pIN, pIN, #NPT    

 Keil assembly file:
        MACRO
        BUTFLY4ZERO_OPT  $pIN,$offset, $pOUT
                LDRSH Ai, [$pIN, #2]
                LDRSH Ar, [$pIN],#NPT
                LDRSH Ci, [$pIN, #2]
                LDRSH Cr, [$pIN],#NPT
                LDRSH Bi, [$pIN, #2]
                LDRSH Br, [$pIN],#NPT
                LDRSH Di, [$pIN, #2]
                LDRSH Dr, [$pIN],#NPT

改成:
        MACRO
        BUTFLY4ZERO_OPT  $pIN,$offset, $pOUT
                LDRSH Ai, [$pIN, #2]
              LDRSH Ar, [$pIN]
            ADD   $pIN, #NPT
                LDRSH Ci, [$pIN, #2]
                LDRSH Cr, [$pIN]
            ADD   $pIN, #NPT
                LDRSH Bi, [$pIN, #2]
                LDRSH Br, [$pIN]
            ADD   $pIN, #NPT
                LDRSH Di, [$pIN, #2]
                LDRSH Dr, [$pIN]
            ADD   $pIN, #NPT

RIDE assembly file:

        preloop_v7:
                ADD     r14, r1, r12, LSR#24 /*256pts*/ 
                LDRSH r5, [r14, #2]   
                LDRSH r4, [r14],#NPT
                LDRSH r9, [r14, #2]   
                LDRSH r8, [r14],#NPT
                LDRSH r7, [r14, #2]
                LDRSH r6, [r14],#NPT
                LDRSH r11, [r14, #2]
                LDRSH r10, [r14],#NPT
改成:

        preloop_v7:
                ADD     r14, r1, r12, LSR#24 /*256pts*/   
                LDRSH r5, [r14, #2]       
                LDRSH r4, [r14]
                ADD   r14, #NPT
                LDRSH r9, [r14, #2]
                LDRSH r8, [r14]
                ADD   r14, #NPT      
                LDRSH r7, [r14, #2]
                LDRSH r6, [r14]
                ADD   r14, #NPT        
                LDRSH r11, [r14, #2]
                LDRSH r10, [r14]
                ADD   r14, #NPT

评分

参与人数 1威望 +1 收起 理由
casimeslo + 1 很给力!

查看全部评分

colaring 发表于 2008-12-25 12:45 | 显示全部楼层

顶!!!

希望ST把DSP函数库的注释写清楚

函数的具体要求,比如定点64  Q14 Q15什么的

别让用户使用起来感觉迷迷糊糊的
greatbin 发表于 2008-12-25 17:00 | 显示全部楼层

这个要顶,LZ好人啊

sunke9 发表于 2008-12-26 08:59 | 显示全部楼层

感谢楼主!

jinjing999 发表于 2008-12-29 16:45 | 显示全部楼层

顶,牛人啊

jinjing999 发表于 2008-12-29 17:23 | 显示全部楼层

不行啊,你看有三个错误

..DSPLibsourceasmRVMDKcr4_fft_256_stm32.s(228): error: A1151E: Bad register name symbol
..DSPLibsourceasmRVMDKcr4_fft_256_stm32.s(228): error: A1151E: Bad register name symbol
香水城 发表于 2008-12-29 17:43 | 显示全部楼层

8楼用的是哪个版本的MDK?

zhudongpo 发表于 2008-12-30 13:34 | 显示全部楼层

ADD pIN, #NPT

8 楼
是这句的问题 ADD   pIN, #NPT  应该为 ADD   $pIN, #NPT

第一次是对的,后面3次的漏掉了$吧, 不知道我的说法正确吗?
eddia2000 发表于 2009-1-2 19:12 | 显示全部楼层

编译通过

10楼:按你说的改后编译通过。
jinjing999 发表于 2009-1-6 09:24 | 显示全部楼层

谢谢10楼和楼主

牛人啊
汇编我一点也看不懂,还好有牛人在啊
zjj8780 发表于 2009-1-20 20:59 | 显示全部楼层

LZ利害

LZ利害,我验证过库函数,64点的算法没有问题,256和1024的算法是错的,但是没有搞明白什么地方出问题了
fugeone 发表于 2009-2-13 09:40 | 显示全部楼层

感谢楼主啊

感谢楼主啊
mxinfa 发表于 2009-3-31 12:58 | 显示全部楼层

这个例子有问题吧

#define N 64 /*Number of points*/
u32 x[N],y[N]; /* input and output arrays */
u16 real[N], imag[N]; /* real and imaginary arrays */
/* Fill the input array */
for(i=0; i<N; i++)
x = (((u16)(real)) | ((u32)(imag<<16)));
cr4_fft_64_stm32(y, x, N); /*computes the FFT of the x[N] samples*/
输入输出竟然都定义成了无符号的,这样有问题吧?如果输入是实数,虚部为零,那么把输入定义成无符号的,大不了相当于固定加了个正的常数,也就是加了个直流分量,勉勉强强吧。输出是无论如何也不能定义成无符号数的吧?
selina1983 发表于 2012-1-15 20:01 | 显示全部楼层
LZ牛人也
nikita-fuck 发表于 2012-1-16 15:14 | 显示全部楼层
酷,,
hsbjb 发表于 2012-1-17 20:02 | 显示全部楼层
STM32 DSP库的确是需要完善
zjb 发表于 2012-2-9 11:50 | 显示全部楼层
现在的库貌似没有汇编了
longzhaocy 发表于 2012-8-21 10:00 | 显示全部楼层
我现在用的STM32F10x_DSP_Lib_V2.0.0这个库,fft后,偶次的数据也很大。和奇次的差不多。我是测三相电的谐波。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

483

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部