[STM32F0] 无聊写个32位乘32位乘法函数

[复制链接]
4909|41
 楼主| yjmwxwx 发表于 2017-1-25 19:14 | 显示全部楼层 |阅读模式
用到浮点数计算,但是来会转换比较麻烦,干脆用整数了。。
浮点数在线转换 https://www.h-schmidt.net/FloatConverter/IEEE754.html

别拍砖只是瞎写,效率很低。 没办法不会算法也学不会,只能上土法了。
三十二位乘三十二位等于六十四位

测试下 R2 0XFFFFFFFF ×  R3 0XFFFFFFFF=  R11 0XFFFFFFFE(高32位)  R12 0X00000001 (低32位)
1.png

再测个 0X44DD22  ×  0X44DD22  =  0X00001286   0X3913B884

2.png




  1. chengfa64:
  2.         @入R2 乘以 R3
  3.         @出 R11高32 , R12低32
  4.         [url=home.php?mod=space&uid=72445]@[/url]        FFFFFFFF × FFFFFFFF
  5.         @        F F F E 0 0 0 1
  6.         @                F F F E 0 0 0 1
  7.         @                F F F E 0 0 0 1
  8.         @                        F F F E 0 0 0 1
  9.         @        F F F F F F F E 0 0 0 0 0 0 0 1
  10.         push {r0-r7,lr}
  11.         mov r7, sp
  12.         adds r7, # 0x50
  13.         mov r0, r2
  14.         bl gaodi16
  15.         mov r12, r0 @ 高
  16.         mov r11, r1
  17.         mov r0, r3
  18.         bl gaodi16
  19.         mov r10, r0
  20.         mov r9, r1

  21.         mov r0, r12
  22.         mov r1, r10
  23.         movs r6, # 0
  24.         bl chengfa16

  25.         mov r0, r11
  26.         mov r1, r10
  27.         bl chengfa16

  28.         mov r0, r12
  29.         mov r1, r9
  30.         bl chengfa16

  31.         mov r0, r11
  32.         mov r1, r9
  33.         bl chengfa16

  34.         ldr r0, [r7, # 0x18]
  35.         ldr r1, [r7, # 0x14]
  36.         adds r0, r1
  37.         ldr r1, [r7, # 0x0c]
  38.         adds r0, r1
  39.         bl gaodi16
  40.         lsls r1, # 16
  41.         ldr r2, [r7, # 0x1c]
  42.         adds r1, r2
  43.         mov r12, r1  @ 低32位

  44.         ldr r1, [r7, # 0x04]
  45.         ldr r2, [r7, # 0x08]
  46.         ldr r3, [r7, # 0x10]

  47.         adds r0, r1
  48.         adds r0, r2
  49.         adds r0, r3
  50.         bl gaodi16
  51.         ldr r2, [r7]
  52.         adds r0, r2
  53.         lsls r0, # 16
  54.         adds r0, r1
  55.         mov r11, r0   @ 高32位
  56.        
  57.        
  58.         subs r7, # 0x50
  59.         mov sp, r7
  60.         pop {r0-r7,pc}



  61.        
  62. gaodi16: @ 高低16 ,R0人 出R0高,R1低
  63.         lsls r1, r0, # 16
  64.         lsrs r1, # 16
  65.         lsrs r0, # 16
  66.         bx lr
  67.        
  68. chengfa16:     @ r0 X r1 = 两个16位分别放在R7和R7+0X04
  69.                @ R6指
  70.                 push {lr}
  71.                 muls r0, r1
  72.                 bl gaodi16
  73.                 str r0, [r7, r6]
  74.                 adds r6, # 0x04
  75.                 str r1, [r7, r6]
  76.                 adds r6, # 0x04
  77.                 pop {pc}



598330983 发表于 2017-1-25 19:21 | 显示全部楼层
我了个去,原来是汇编,遇到高人了。
叶春勇 发表于 2023-4-13 10:54 | 显示全部楼层
本帖最后由 叶春勇 于 2023-4-13 10:56 编辑

无意中翻到:补个cortex-m0,64位乘法‘
  1. [url=home.php?mod=space&uid=72445]@[/url] long long __aeabi_lmul(long long r1:r0, long long r3:r2)
  2. @
  3. @ Multiply r1:r0 and r3:r2 and return the product in r1:r0
  4. @ Can also be used for unsigned long product
  5. @
  6.         .thumb_func
  7.         .global __aeabi_lmul
  8. __aeabi_lmul:

  9.         push        {r4, lr}
  10.         muls        r1, r2
  11.         muls        r3, r0
  12.         adds        r1, r3
  13.         
  14.         lsrs        r3, r0, #16
  15.         lsrs        r4, r2, #16
  16.         muls        r3, r4
  17.         adds        r1, r3

  18.         lsrs        r3, r0, #16
  19.         uxth        r0, r0
  20.         uxth        r2, r2
  21.         muls        r3, r2
  22.         muls        r4, r0
  23.         muls        r0, r2
  24.         
  25.         movs        r2, #0
  26.         adds        r3, r4
  27.         adcs        r2, r2
  28.         lsls        r2, #16
  29.         adds        r1, r2
  30.         
  31.         lsls        r2, r3, #16
  32.         lsrs        r3, #16
  33.         adds        r0, r2
  34.         adcs        r1, r3
  35.         pop        {r4, pc}



 楼主| yjmwxwx 发表于 2023-4-13 19:01 | 显示全部楼层
本帖最后由 yjmwxwx 于 2023-4-13 19:03 编辑
叶春勇 发表于 2023-4-13 10:54
无意中翻到:补个cortex-m0,64位乘法‘

后来我这个乘法也重新写过,不过好像还是比人家写的麻烦一些

  1. __chengfa:
  2.         @入R0 乘以 R1
  3.         @出 R0高32 , R1低32
  4.         push {r2-r7,lr}
  5.         cmp r0, # 0
  6.         beq __cheng_fa_fan_hui
  7.         cmp r1, # 0
  8.         beq __cheng_fa_fan_hui
  9. __ji_suan_cheng_fa:
  10.         mov r2, r0
  11.         mov r3, r1
  12.         lsrs r0, r0, # 16       @高16
  13.         lsls r2, r2, # 16       [url=home.php?mod=space&uid=72445]@[/url] 低16
  14.         lsrs r2, r2, # 16
  15.         lsrs r1, r1, # 16       @高16
  16.         lsls r3, r3, # 16       @低16
  17.         lsrs r3, r3, # 16
  18.         mov r4, r2
  19.         mov r5, r0
  20.         muls r2, r2, r3         @1
  21.         muls r0, r0, r3         @2
  22.         muls r4, r4, r1         @3
  23.         muls r5, r5, r1         @4
  24.         mov r6, r0
  25.         mov r7, r4
  26.         lsls r0, r0, # 16       @2低32
  27.         lsls r4, r4, # 16       @3低32
  28.         lsrs r6, r6, # 16       @2高32
  29.         lsrs r7, r7, # 16       @3高32
  30.         movs r1, # 0
  31.         adds r2, r2, r0         @低32
  32.         adcs r6, r6, r1         @高32
  33.         adds r2, r2, r4
  34.         adcs r6, r6, r7
  35.         adds r6, r6, r5
  36.         mov r0, r6
  37.         mov r1, r2
  38.         pop {r2-r7,pc}
  39. __cheng_fa_fan_hui:
  40.         movs r0, # 0
  41.         movs r1, # 0
  42.         pop {r2-r7,pc}


burningrider 发表于 2023-4-14 09:25 | 显示全部楼层
佩服佩服
burningrider 发表于 2023-4-14 09:25 | 显示全部楼层
64位乘法函数
叶春勇 发表于 2023-4-14 09:47 | 显示全部楼层
yjmwxwx 发表于 2023-4-13 19:01
后来我这个乘法也重新写过,不过好像还是比人家写的麻烦一些

这些基本运算,调用人家的库就好了,也有浮点的。不过M0单片机用浮点就有点奢侈了。
https://github.com/bobbl/libaeabi-cortexm0

  1. arm-none-eabi-gcc -mcpu=cortex-m0 -mthumb -o foo.arm foo.c -nostdlib -laeabi-cortexm0



 楼主| yjmwxwx 发表于 2023-4-14 11:28 | 显示全部楼层
叶春勇 发表于 2023-4-14 09:47
这些基本运算,调用人家的库就好了,也有浮点的。不过M0单片机用浮点就有点奢侈了。
https://github.com/ ...

反正闲着没事就自己写呗,别人的库还要学怎么用,他这个乘法我就看不懂怎么用,是64位乘64位还是32位乘32位,入口这四个寄存器不知道应该存什么数据,我自己写的虽然不如人家写的好,但是最起码明确知道用法就是32位乘32位得到64位,浮点数我做东西时候还没用到。

截图_2023-04-14_11-18-42.png

  1. .thumb
  2.         .syntax unified
  3. vectors:
  4.         .word zhanding
  5.         .word _start + 1
  6.         .equ zhanding, 0x20001000

  7. _start :
  8.         ldr r0, = 0xffff
  9.         ldr r1, = 0xffff
  10.         ldr r2, = 0xffff
  11.         ldr r3, = 0xffff
  12.         bl __aeabi_lmul
  13.         bkpt # 1
  14.         ldr r0, = 0xffffffff
  15.         ldr r1, = 0xffffffff
  16.         bl __chengfa
  17.         bkpt # 2
  18. __aeabi_lmul:

  19.         push        {r4, lr}
  20.         muls        r1, r2
  21.         muls        r3, r0
  22.         adds        r1, r3

  23.         lsrs        r3, r0, #16
  24.         lsrs        r4, r2, #16
  25.         muls        r3, r4
  26.         adds        r1, r3

  27.         lsrs        r3, r0, #16
  28.         uxth        r0, r0
  29.         uxth        r2, r2
  30.         muls        r3, r2
  31.         muls        r4, r0
  32.         muls        r0, r2

  33.         movs        r2, #0
  34.         adds        r3, r4
  35.         adcs        r2, r2
  36.         lsls        r2, #16
  37.         adds        r1, r2

  38.         lsls        r2, r3, #16
  39.         lsrs        r3, #16
  40.         adds        r0, r2
  41.         adcs        r1, r3
  42.         pop        {r4, pc}

  43. __chengfa:
  44.         @入R0 乘以 R1
  45.         @出 R0高32 , R1低32
  46.         @0xffffffff*0xffffffff
  47.         @4        F F F E 0 0 0 1                       @4
  48.         @3                F F F E 0 0 0 1               @3
  49.         @2                F F F E 0 0 0 1               @2
  50.         @1                        F F F E 0 0 0 1       @1
  51.         @         F F F F F F F E 0 0 0 0 0 0 0 1
  52.         push {r2-r7,lr}
  53.         cmp r0, # 0
  54.         beq __cheng_fa_fan_hui
  55.         cmp r1, # 0
  56.         beq __cheng_fa_fan_hui
  57. __ji_suan_cheng_fa:
  58.         mov r2, r0
  59.         mov r3, r1
  60.         lsrs r0, r0, # 16       @高16
  61.         lsls r2, r2, # 16       @ 低16
  62.         lsrs r2, r2, # 16
  63.         lsrs r1, r1, # 16       @高16
  64.         lsls r3, r3, # 16       @低16
  65.         lsrs r3, r3, # 16
  66.         mov r4, r2
  67.         mov r5, r0
  68.         muls r2, r2, r3         @1
  69.         muls r0, r0, r3         @2
  70.         muls r4, r4, r1         @3
  71.         muls r5, r5, r1         @4
  72.         mov r6, r0
  73.         mov r7, r4
  74.         lsls r0, r0, # 16       @2低32
  75.         lsls r4, r4, # 16       @3低32
  76.         lsrs r6, r6, # 16       @2高32
  77.         lsrs r7, r7, # 16       @3高32
  78.         movs r1, # 0
  79.         adds r2, r2, r0         @低32
  80.         adcs r6, r6, r1         @高32
  81.         adds r2, r2, r4
  82.         adcs r6, r6, r7
  83.         adds r6, r6, r5
  84.         mov r0, r6
  85.         mov r1, r2
  86.         pop {r2-r7,pc}
  87. __cheng_fa_fan_hui:
  88.         movs r0, # 0
  89.         movs r1, # 0
  90.         pop {r2-r7,pc}


叶春勇 发表于 2023-4-14 12:27 | 显示全部楼层
yjmwxwx 发表于 2023-4-14 11:28
反正闲着没事就自己写呗,别人的库还要学怎么用,他这个乘法我就看不懂怎么用,是64位乘64位还是32位乘32 ...

前几天在写一个fft算法,当时看到stm32f103c8t6有乘累加指令。准备写一个内联汇编的函数。
结果用c语言生成汇编,编译器把+=直接编译成mac指令。看汇编的时候无意中看到了这个__lmul函数,就上网搜了下gcc内部的源代码,找到这个库。搜的过程中,正好看到你的贴子,正好把我搜到的补上去。记得你在论坛里基本都是用汇编。跟你2017年得代码差太多。
你后面得代码基本接近了。不过好像还是多了几行。
以前研究过这类算法,不过现在没什么兴趣了。你有兴趣就研究下,为啥差这么多。
我现在写得fft,是没有复数运算的,没有浮点。用的整数。
V853 发表于 2023-4-14 13:31 | 显示全部楼层
用汇编写代码的就是大佬!!!
 楼主| yjmwxwx 发表于 2023-4-14 14:17 | 显示全部楼层
叶春勇 发表于 2023-4-14 12:27
前几天在写一个fft算法,当时看到stm32f103c8t6有乘累加指令。准备写一个内联汇编的函数。
结果用c语言生 ...

哦 原来是这样,我现在没兴趣搞这些程序了,也就凑合玩着还没扔下,我又不能靠这些找工作,现实中也用不到,看别人搞的东西能卖钱,我就搞个免费的分享还有点乐趣,要不实在没地方用。
叶春勇 发表于 2023-4-14 16:05 | 显示全部楼层
yjmwxwx 发表于 2023-4-14 14:17
哦 原来是这样,我现在没兴趣搞这些程序了,也就凑合玩着还没扔下,我又不能靠这些找工作,现实中也用不 ...

这是我的C代码,写出来搞个模板,准备自己插点代码。
  1. #include  <stdint.h>
  2. int64_t mula(int64_t *a,int64_t *b)
  3. {       
  4.         return (*a)*(*b);
  5. }

  6. void mulb(int64_t *a,int64_t *b,int64_t *c)
  7. {       
  8.         (*c)=(*a)*(*b);
  9. }
编译器生成的汇编代码:
  1. .cpu cortex-m0
  2.         .arch armv6s-m
  3.         .fpu softvfp
  4.         .eabi_attribute 20, 1
  5.         .eabi_attribute 21, 1
  6.         .eabi_attribute 23, 3
  7.         .eabi_attribute 24, 1
  8.         .eabi_attribute 25, 1
  9.         .eabi_attribute 26, 1
  10.         .eabi_attribute 30, 4
  11.         .eabi_attribute 34, 0
  12.         .eabi_attribute 18, 4
  13.         .file        "test.c"
  14.         .text
  15.         .global        __aeabi_lmul
  16.         .align        1
  17.         .global        mula
  18.         .syntax unified
  19.         .code        16
  20.         .thumb_func
  21.         .type        mula, %function
  22. mula:
  23.         [url=home.php?mod=space&uid=72445]@[/url] args = 0, pretend = 0, frame = 0
  24.         @ frame_needed = 0, uses_anonymous_args = 0
  25.         push        {r4, lr}
  26.         ldr        r2, [r1]
  27.         ldr        r3, [r1, #4]
  28.         ldr        r1, [r0, #4]
  29.         ldr        r0, [r0]
  30.         bl        __aeabi_lmul
  31.         @ sp needed
  32.         pop        {r4, pc}
  33.         .size        mula, .-mula
  34.         .align        1
  35.         .global        mulb
  36.         .syntax unified
  37.         .code        16
  38.         .thumb_func
  39.         .type        mulb, %function
  40. mulb:
  41.         @ args = 0, pretend = 0, frame = 0
  42.         @ frame_needed = 0, uses_anonymous_args = 0
  43.         push        {r4, lr}
  44.         movs        r4, r2
  45.         ldr        r2, [r1]
  46.         ldr        r3, [r1, #4]
  47.         ldr        r1, [r0, #4]
  48.         ldr        r0, [r0]
  49.         @ sp needed
  50.         bl        __aeabi_lmul
  51.         str        r0, [r4]
  52.         str        r1, [r4, #4]
  53.         pop        {r4, pc}
  54.         .size        mulb, .-mulb
  55.         .ident        "GCC: (GNU Arm Embedded Toolchain 10.3-2021.10) 10.3.1 20210824 (release)"
我上面的mulb函数,就是汇编常用的格式。指针传递参数,指针传递输出结果。

看了下这些写库的人,汇编水平不低的呀。
 楼主| yjmwxwx 发表于 2023-4-14 18:10 | 显示全部楼层
叶春勇 发表于 2023-4-14 16:05
这是我的C代码,写出来搞个模板,准备自己插点代码。编译器生成的汇编代码:
我上面的mulb函数,就是汇编 ...

截图_2023-04-14_18-05-55.png


通过你贴的代码看懂他那__aeabi_lmul入口四个寄存器应该存什么数据了,结果R0存低32、R1存高32,感觉他这个是64位数乘一个数字但是结果要小于64位才行。

人家是正规军肯定水平高,我写的很多地方都不规范,学的时候没看过什么书,就是用调试器试错
叶春勇 发表于 2023-4-14 19:57 | 显示全部楼层
yjmwxwx 发表于 2023-4-14 18:10
通过你贴的代码看懂他那__aeabi_lmul入口四个寄存器应该存什么数据了,结果R0存低32、R1存高32,感觉 ...

跟m0的硬件乘法指令一样,32x32=32。
r1和r3传入立即数0,就是32x32=64了,不过他这个好像是有符号数,负数可能用的是64bit补码,这个编译器里应该有函数的

cemaj 发表于 2023-4-15 19:43 | 显示全部楼层
这个怎么保存数据呢              
 楼主| yjmwxwx 发表于 2023-4-15 21:31 | 显示全部楼层
cemaj 发表于 2023-4-15 19:43
这个怎么保存数据呢

叶春勇提供的库你可以进去看下,直接调用就行了吧
modesty3jonah 发表于 2023-4-16 22:52 | 显示全部楼层
计算的 工作量怎么样              
叶春勇 发表于 2023-4-17 10:02 | 显示全部楼层
本帖最后由 叶春勇 于 2023-4-17 10:04 编辑

补一个stm32,FFT程序,汇编:
  1. ;******************** (C) COPYRIGHT 2009  STMicroelectronics ********************
  2. ;* File Name          : cr4_fft_256_stm32.s
  3. ;* Author             : MCD Application Team
  4. ;* Version            : V2.0.0
  5. ;* Date               : 04/27/2009
  6. ;* Description        : Optimized 256-point radix-4 complex FFT for Cortex-M3
  7. ;********************************************************************************
  8. ;* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  9. ;* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
  10. ;* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
  11. ;* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
  12. ;* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
  13. ;* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  14. ;*******************************************************************************/

  15.         THUMB
  16.           REQUIRE8
  17.     PRESERVE8

  18.         AREA |.text|, CODE, READONLY, ALIGN=2
  19.                         
  20.         EXPORT cr4_fft_256_stm32      
  21.         EXTERN TableFFT


  22. pssK              RN R0
  23. pssOUT            RN R0
  24. pssX              RN R1
  25. pssIN             RN R1
  26. butternbr         RN R2
  27. Nbin              RN R2
  28. index             RN R3
  29. Ar                RN R4
  30. Ai                RN R5
  31. Br                RN R6
  32. Bi                RN R7
  33. Cr                RN R8
  34. Ci                RN R9
  35. Dr                RN R10
  36. Di                RN R11
  37. cntrbitrev         RN R12
  38. tmp               RN R12
  39. pssIN2            RN R14
  40. tmp2              RN R14

  41. NPT EQU 256

  42. ;----------------------------- MACROS ----------------------------------------
  43.          
  44.                  MACRO
  45.                  DEC  $reg
  46.              SUB  $reg,$reg,#1
  47.              MEND

  48.                  MACRO
  49.              INC  $reg
  50.              ADD  $reg,$reg,#1
  51.              MEND


  52.                  MACRO
  53.                  QUAD  $reg
  54.              MOV  $reg,$reg,LSL#2
  55.              MEND

  56. ;sXi = *(PssX+1); sXr = *PssX; PssX += offset; PssX= R1

  57.                   MACRO
  58.                   LDR2Q  $sXr,$sXi, $PssX, $offset
  59.               LDRSH $sXi, [$PssX, #2]
  60.               LDRSH $sXr, [$PssX]
  61.               ADD $PssX, $PssX, $offset
  62.               MEND

  63. ;!! Same macro, to be used when passing negative offset value !!
  64.                 MACRO
  65.                 LDR2Qm  $sXr, $sXi, $PssX, $offset
  66.         LDRSH $sXi, [$PssX, #2]
  67.         LDRSH $sXr, [$PssX]
  68.         SUB $PssX, $PssX, $offset
  69.         MEND

  70. ;(PssX+1)= sXi;  *PssX=sXr; PssX += offset;
  71.                 MACRO
  72.                 STR2Q  $sXr, $sXi, $PssX, $offset
  73.         STRH  $sXi, [$PssX, #2]
  74.         STRH  $sXr, [$PssX]
  75.         ADD $PssX, $PssX, $offset
  76.         MEND

  77. ; YY = Cplx_conjugate_mul(Y,K)
  78. ;  Y = YYr + i*YYi
  79. ; use the following trick
  80. ;  K = (Kr-Ki) + i*Ki
  81.                 MACRO
  82.                 CXMUL_V7  $YYr, $YYi, $Yr, $Yi, $Kr, $Ki,$tmp,$tmp2
  83.         SUB  $tmp2, $Yi, $Yr         ; sYi-sYr
  84.         MUL  $tmp, $tmp2, $Ki        ; (sYi-sYr)*sKi
  85.         ADD  $tmp2, $Kr, $Ki, LSL#1  ; (sKr+sKi)
  86.         MLA  $YYi, $Yi, $Kr, $tmp     ; lYYi = sYi*sKr-sYr*sKi
  87.         MLA  $YYr, $Yr, $tmp2, $tmp   ; lYYr = sYr*sKr+sYi*sKi
  88.         MEND

  89. ; Four point complex Fast Fourier Transform               
  90.                 MACRO
  91.                 CXADDA4  $s
  92.         ; (C,D) = (C+D, C-D)
  93.         ADD     Cr, Cr, Dr
  94.         ADD     Ci, Ci, Di
  95.         SUB     Dr, Cr, Dr, LSL#1
  96.         SUB     Di, Ci, Di, LSL#1
  97.         ; (A,B) = (A+(B>>s), A-(B>>s))/4
  98.         MOV     Ar, Ar, ASR#2
  99.         MOV     Ai, Ai, ASR#2
  100.         ADD     Ar, Ar, Br, ASR#(2+$s)
  101.         ADD     Ai, Ai, Bi, ASR#(2+$s)
  102.         SUB     Br, Ar, Br, ASR#(1+$s)
  103.         SUB     Bi, Ai, Bi, ASR#(1+$s)
  104.         ; (A,C) = (A+(C>>s)/4, A-(C>>s)/4)
  105.         ADD     Ar, Ar, Cr, ASR#(2+$s)
  106.         ADD     Ai, Ai, Ci, ASR#(2+$s)
  107.         SUB     Cr, Ar, Cr, ASR#(1+$s)
  108.         SUB     Ci, Ai, Ci, ASR#(1+$s)
  109.         ; (B,D) = (B-i*(D>>s)/4, B+i*(D>>s)/4)
  110.         ADD     Br, Br, Di, ASR#(2+$s)
  111.         SUB     Bi, Bi, Dr, ASR#(2+$s)
  112.         SUB     Di, Br, Di, ASR#(1+$s)
  113.         ADD     Dr, Bi, Dr, ASR#(1+$s)
  114.         MEND

  115.                
  116.                 MACRO
  117.                 BUTFLY4ZERO_OPT  $pIN,$offset, $pOUT
  118.         LDRSH Ai, [$pIN, #2]
  119.                 LDRSH Ar, [$pIN]
  120.             ADD   $pIN, #NPT
  121.         LDRSH Ci, [$pIN, #2]
  122.         LDRSH Cr, [$pIN]
  123.                 ADD   $pIN, #NPT
  124.         LDRSH Bi, [$pIN, #2]
  125.         LDRSH Br, [$pIN]
  126.                 ADD   $pIN, #NPT
  127.         LDRSH Di, [$pIN, #2]
  128.         LDRSH Dr, [$pIN]
  129.                 ADD   $pIN, #NPT

  130.         ; (C,D) = (C+D, C-D)
  131.         ADD     Cr, Cr, Dr
  132.         ADD     Ci, Ci, Di
  133.         SUB     Dr, Cr, Dr, LSL#1  ; trick
  134.         SUB     Di, Ci, Di, LSL#1  ;trick
  135.         ; (A,B) = (A+B)/4, (A-B)/4
  136.         MOV     Ar, Ar, ASR#2
  137.         MOV     Ai, Ai, ASR#2
  138.         ADD     Ar, Ar, Br, ASR#2
  139.         ADD     Ai, Ai, Bi, ASR#2
  140.         SUB     Br, Ar, Br, ASR#1
  141.         SUB     Bi, Ai, Bi, ASR#1
  142.         ; (A,C) = (A+C)/4, (A-C)/4
  143.         ADD     Ar, Ar, Cr, ASR#2
  144.         ADD     Ai, Ai, Ci, ASR#2
  145.         SUB     Cr, Ar, Cr, ASR#1
  146.         SUB     Ci, Ai, Ci, ASR#1
  147.         ; (B,D) = (B-i*D)/4, (B+i*D)/4
  148.         ADD     Br, Br, Di, ASR#2
  149.         SUB     Bi, Bi, Dr, ASR#2
  150.         SUB     Di, Br, Di, ASR#1
  151.         ADD     Dr, Bi, Dr, ASR#1
  152.         ;
  153.         STRH    Ai, [$pOUT, #2]
  154.         STRH    Ar, [$pOUT], #4
  155.         STRH    Bi, [$pOUT, #2]
  156.         STRH    Br, [$pOUT], #4
  157.         STRH    Ci, [$pOUT, #2]
  158.         STRH    Cr, [$pOUT], #4
  159.         STRH    Dr, [$pOUT, #2]  ; inversion here
  160.         STRH    Di, [$pOUT], #4
  161.         MEND

  162.                 MACRO
  163.                 BUTFLY4_V7   $pssDin,$offset,$pssDout,$qformat,$pssK
  164.         LDR2Qm   Ar,Ai,$pssDin, $offset;-$offset
  165.         LDR2Q    Dr,Di,$pssK, #4
  166.         ; format CXMUL_V7 YYr, YYi, Yr, Yi, Kr, Ki,tmp,tmp2
  167.         CXMUL_V7 Dr,Di,Ar,Ai,Dr,Di,tmp,tmp2
  168.         LDR2Qm   Ar,Ai,$pssDin,$offset;-$offset
  169.         LDR2Q    Cr,Ci,$pssK,#4
  170.         CXMUL_V7 Cr,Ci,Ar,Ai,Cr,Ci,tmp,tmp2
  171.         LDR2Qm    Ar,Ai, $pssDin, $offset;-$offset
  172.         LDR2Q    Br,Bi, $pssK, #4
  173.         CXMUL_V7  Br,Bi,Ar,Ai,Br,Bi,tmp,tmp2
  174.         LDR2Q    Ar,Ai, $pssDin, #0
  175.         CXADDA4  $qformat
  176.         STRH    Ai, [$pssDout, #2]
  177.         STRH    Ar, [$pssDout]
  178.         ADD         $pssDout, $pssDout, $offset
  179.         STRH    Bi, [$pssDout, #2]
  180.         STRH    Br, [$pssDout]
  181.         ADD     $pssDout, $pssDout, $offset
  182.         STRH    Ci, [$pssDout, #2]
  183.         STRH    Cr, [$pssDout]
  184.         ADD     $pssDout, $pssDout, $offset
  185.         STRH    Dr, [$pssDout, #2]  ; inversion here
  186.         STRH    Di, [$pssDout], #4
  187.         MEND

  188. ;-------------------                         CODE                         --------------------------------
  189. ;===============================================================================
  190. ;*******************************************************************************
  191. ;* Function Name  : cr4_fft_256_stm32
  192. ;* Description    : complex radix-4 256 points FFT
  193. ;* Input          : - R0 = pssOUT: Output array .
  194. ;*                  - R1 = pssIN: Input array
  195. ;*                  - R2 = Nbin: =256 number of points, this optimized FFT function  
  196. ;*                    can only convert 256 points.
  197. ;* Output         : None
  198. ;* Return         : None
  199. ;*******************************************************************************
  200. cr4_fft_256_stm32

  201.         STMFD   SP!, {R4-R11, LR}
  202.         
  203.         MOV cntrbitrev, #0
  204.         MOV index,#0
  205.         
  206. preloop_v7
  207.         ADD     pssIN2, pssIN, cntrbitrev, LSR#24 ;256-pts
  208.         BUTFLY4ZERO_OPT pssIN2,Nbin,pssOUT
  209.         INC index
  210.         RBIT cntrbitrev,index
  211.         CMP index,#64  ;256-pts
  212.         BNE  preloop_v7


  213.         SUB     pssX, pssOUT, Nbin, LSL#2
  214.         MOV     index, #16
  215.         MOVS    butternbr, Nbin, LSR#4   ;dual use of register
  216.         
  217. ;------------------------------------------------------------------------------
  218. ;   The FFT coefficients table can be stored into Flash or RAM.
  219. ;   The following two lines of code allow selecting the method for coefficients
  220. ;   storage.
  221. ;   In the case of choosing coefficients in RAM, you have to:
  222. ;   1. Include the file table_fft.h, which is a part of the DSP library,
  223. ;      in your main file.
  224. ;   2. Decomment the line LDR.W pssK, =TableFFT and comment the line
  225. ;      ADRL    pssK, TableFFT_V7
  226. ;   3. Comment all the TableFFT_V7 data.
  227. ;------------------------------------------------------------------------------
  228.         ADRL    pssK, TableFFT_V7    ; Coeff in Flash
  229.         ;LDR.W pssK, =TableFFT      ; Coeff in RAM

  230. ;................................
  231. passloop_v7
  232.         STMFD   SP!, {pssX,butternbr}
  233.         ADD     tmp, index, index, LSL#1
  234.         ADD     pssX, pssX, tmp
  235.         SUB     butternbr, butternbr, #1<<16
  236. ;................
  237. grouploop_v7
  238.         ADD     butternbr,butternbr,index,LSL#(16-2)
  239. ;.......
  240. butterloop_v7
  241.         BUTFLY4_V7  pssX,index,pssX,14,pssK
  242.         SUBS        butternbr,butternbr, #1<<16
  243.         BGE     butterloop_v7
  244. ;.......
  245.         ADD     tmp, index, index, LSL#1
  246.         ADD     pssX, pssX, tmp
  247.         DEC     butternbr
  248.         MOVS    tmp2, butternbr, LSL#16
  249.         IT      NE
  250.         SUBNE   pssK, pssK, tmp
  251.         BNE     grouploop_v7
  252. ;................
  253.         LDMFD   sp!, {pssX, butternbr}
  254.         QUAD    index
  255.         MOVS    butternbr, butternbr, LSR#2    ; loop nbr /= radix
  256.         BNE     passloop_v7
  257. ;................................
  258.        LDMFD   SP!, {R4-R11, PC}

  259. ;=============================================================================

  260. TableFFT_V7
  261.         ;N=16
  262.         DCW 0x4000,0x0000, 0x4000,0x0000, 0x4000,0x0000
  263.         DCW 0xdd5d,0x3b21, 0x22a3,0x187e, 0x0000,0x2d41
  264.         DCW 0xa57e,0x2d41, 0x0000,0x2d41, 0xc000,0x4000
  265.         DCW 0xdd5d,0xe782, 0xdd5d,0x3b21, 0xa57e,0x2d41
  266.         ; N=64
  267.         DCW 0x4000,0x0000, 0x4000,0x0000, 0x4000,0x0000
  268.         DCW 0x2aaa,0x1294, 0x396b,0x0646, 0x3249,0x0c7c
  269.         DCW 0x11a8,0x238e, 0x3249,0x0c7c, 0x22a3,0x187e
  270.         DCW 0xf721,0x3179, 0x2aaa,0x1294, 0x11a8,0x238e
  271.         DCW 0xdd5d,0x3b21, 0x22a3,0x187e, 0x0000,0x2d41
  272.         DCW 0xc695,0x3fb1, 0x1a46,0x1e2b, 0xee58,0x3537
  273.         DCW 0xb4be,0x3ec5, 0x11a8,0x238e, 0xdd5d,0x3b21
  274.         DCW 0xa963,0x3871, 0x08df,0x289a, 0xcdb7,0x3ec5
  275.         DCW 0xa57e,0x2d41, 0x0000,0x2d41, 0xc000,0x4000
  276.         DCW 0xa963,0x1e2b, 0xf721,0x3179, 0xb4be,0x3ec5
  277.         DCW 0xb4be,0x0c7c, 0xee58,0x3537, 0xac61,0x3b21
  278.         DCW 0xc695,0xf9ba, 0xe5ba,0x3871, 0xa73b,0x3537
  279.         DCW 0xdd5d,0xe782, 0xdd5d,0x3b21, 0xa57e,0x2d41
  280.         DCW 0xf721,0xd766, 0xd556,0x3d3f, 0xa73b,0x238e
  281.         DCW 0x11a8,0xcac9, 0xcdb7,0x3ec5, 0xac61,0x187e
  282.         DCW 0x2aaa,0xc2c1, 0xc695,0x3fb1, 0xb4be,0x0c7c
  283.         ; N=256
  284.         DCW 0x4000,0x0000, 0x4000,0x0000, 0x4000,0x0000
  285.         DCW 0x3b1e,0x04b5, 0x3e69,0x0192, 0x3cc8,0x0324
  286.         DCW 0x35eb,0x0964, 0x3cc8,0x0324, 0x396b,0x0646
  287.         DCW 0x306c,0x0e06, 0x3b1e,0x04b5, 0x35eb,0x0964
  288.         DCW 0x2aaa,0x1294, 0x396b,0x0646, 0x3249,0x0c7c
  289.         DCW 0x24ae,0x1709, 0x37af,0x07d6, 0x2e88,0x0f8d
  290.         DCW 0x1e7e,0x1b5d, 0x35eb,0x0964, 0x2aaa,0x1294
  291.         DCW 0x1824,0x1f8c, 0x341e,0x0af1, 0x26b3,0x1590
  292.         DCW 0x11a8,0x238e, 0x3249,0x0c7c, 0x22a3,0x187e
  293.         DCW 0x0b14,0x2760, 0x306c,0x0e06, 0x1e7e,0x1b5d
  294.         DCW 0x0471,0x2afb, 0x2e88,0x0f8d, 0x1a46,0x1e2b
  295.         DCW 0xfdc7,0x2e5a, 0x2c9d,0x1112, 0x15fe,0x20e7
  296.         DCW 0xf721,0x3179, 0x2aaa,0x1294, 0x11a8,0x238e
  297.         DCW 0xf087,0x3453, 0x28b2,0x1413, 0x0d48,0x2620
  298.         DCW 0xea02,0x36e5, 0x26b3,0x1590, 0x08df,0x289a
  299.         DCW 0xe39c,0x392b, 0x24ae,0x1709, 0x0471,0x2afb
  300.         DCW 0xdd5d,0x3b21, 0x22a3,0x187e, 0x0000,0x2d41
  301.         DCW 0xd74e,0x3cc5, 0x2093,0x19ef, 0xfb8f,0x2f6c
  302.         DCW 0xd178,0x3e15, 0x1e7e,0x1b5d, 0xf721,0x3179
  303.         DCW 0xcbe2,0x3f0f, 0x1c64,0x1cc6, 0xf2b8,0x3368
  304.         DCW 0xc695,0x3fb1, 0x1a46,0x1e2b, 0xee58,0x3537
  305.         DCW 0xc197,0x3ffb, 0x1824,0x1f8c, 0xea02,0x36e5
  306.         DCW 0xbcf0,0x3fec, 0x15fe,0x20e7, 0xe5ba,0x3871
  307.         DCW 0xb8a6,0x3f85, 0x13d5,0x223d, 0xe182,0x39db
  308.         DCW 0xb4be,0x3ec5, 0x11a8,0x238e, 0xdd5d,0x3b21
  309.         DCW 0xb140,0x3daf, 0x0f79,0x24da, 0xd94d,0x3c42
  310.         DCW 0xae2e,0x3c42, 0x0d48,0x2620, 0xd556,0x3d3f
  311.         DCW 0xab8e,0x3a82, 0x0b14,0x2760, 0xd178,0x3e15
  312.         DCW 0xa963,0x3871, 0x08df,0x289a, 0xcdb7,0x3ec5
  313.         DCW 0xa7b1,0x3612, 0x06a9,0x29ce, 0xca15,0x3f4f
  314.         DCW 0xa678,0x3368, 0x0471,0x2afb, 0xc695,0x3fb1
  315.         DCW 0xa5bc,0x3076, 0x0239,0x2c21, 0xc338,0x3fec
  316.         DCW 0xa57e,0x2d41, 0x0000,0x2d41, 0xc000,0x4000
  317.         DCW 0xa5bc,0x29ce, 0xfdc7,0x2e5a, 0xbcf0,0x3fec
  318.         DCW 0xa678,0x2620, 0xfb8f,0x2f6c, 0xba09,0x3fb1
  319.         DCW 0xa7b1,0x223d, 0xf957,0x3076, 0xb74d,0x3f4f
  320.         DCW 0xa963,0x1e2b, 0xf721,0x3179, 0xb4be,0x3ec5
  321.         DCW 0xab8e,0x19ef, 0xf4ec,0x3274, 0xb25e,0x3e15
  322.         DCW 0xae2e,0x1590, 0xf2b8,0x3368, 0xb02d,0x3d3f
  323.         DCW 0xb140,0x1112, 0xf087,0x3453, 0xae2e,0x3c42
  324.         DCW 0xb4be,0x0c7c, 0xee58,0x3537, 0xac61,0x3b21
  325.         DCW 0xb8a6,0x07d6, 0xec2b,0x3612, 0xaac8,0x39db
  326.         DCW 0xbcf0,0x0324, 0xea02,0x36e5, 0xa963,0x3871
  327.         DCW 0xc197,0xfe6e, 0xe7dc,0x37b0, 0xa834,0x36e5
  328.         DCW 0xc695,0xf9ba, 0xe5ba,0x3871, 0xa73b,0x3537
  329.         DCW 0xcbe2,0xf50f, 0xe39c,0x392b, 0xa678,0x3368
  330.         DCW 0xd178,0xf073, 0xe182,0x39db, 0xa5ed,0x3179
  331.         DCW 0xd74e,0xebed, 0xdf6d,0x3a82, 0xa599,0x2f6c
  332.         DCW 0xdd5d,0xe782, 0xdd5d,0x3b21, 0xa57e,0x2d41
  333.         DCW 0xe39c,0xe33a, 0xdb52,0x3bb6, 0xa599,0x2afb
  334.         DCW 0xea02,0xdf19, 0xd94d,0x3c42, 0xa5ed,0x289a
  335.         DCW 0xf087,0xdb26, 0xd74e,0x3cc5, 0xa678,0x2620
  336.         DCW 0xf721,0xd766, 0xd556,0x3d3f, 0xa73b,0x238e
  337.         DCW 0xfdc7,0xd3df, 0xd363,0x3daf, 0xa834,0x20e7
  338.         DCW 0x0471,0xd094, 0xd178,0x3e15, 0xa963,0x1e2b
  339.         DCW 0x0b14,0xcd8c, 0xcf94,0x3e72, 0xaac8,0x1b5d
  340.         DCW 0x11a8,0xcac9, 0xcdb7,0x3ec5, 0xac61,0x187e
  341.         DCW 0x1824,0xc850, 0xcbe2,0x3f0f, 0xae2e,0x1590
  342.         DCW 0x1e7e,0xc625, 0xca15,0x3f4f, 0xb02d,0x1294
  343.         DCW 0x24ae,0xc44a, 0xc851,0x3f85, 0xb25e,0x0f8d
  344.         DCW 0x2aaa,0xc2c1, 0xc695,0x3fb1, 0xb4be,0x0c7c
  345.         DCW 0x306c,0xc18e, 0xc4e2,0x3fd4, 0xb74d,0x0964
  346.         DCW 0x35eb,0xc0b1, 0xc338,0x3fec, 0xba09,0x0646
  347.         DCW 0x3b1e,0xc02c, 0xc197,0x3ffb, 0xbcf0,0x0324
  348.         
  349.        END
  350. ;******************* (C) COPYRIGHT 2009  STMicroelectronics *****END OF FILE****


 楼主| yjmwxwx 发表于 2023-4-17 10:29 | 显示全部楼层
本帖最后由 yjmwxwx 于 2023-4-17 10:49 编辑
叶春勇 发表于 2023-4-17 10:02
补一个stm32,FFT程序,汇编:

当年ST是有汇编FFT库的,我当时自己写也看过但是看不懂,后来下载了个网页版例子再结合书才看懂,很多年不用都忘记具体怎么算的了。
www.themobilestudio.net
FFThtml.zip (17.59 KB, 下载次数: 2)

第二页图片显示不出来了被浏览器阻止了,每一步怎么计算的都有插图比较容易看懂

截图_2023-04-17_10-23-59.png

截图_2023-04-17_10-24-31.png

16-Point-FFT-Butterfly-Javascript-Demo.png

截图_2023-04-17_10-30-23.png




叶春勇 发表于 2023-4-17 12:54 | 显示全部楼层
yjmwxwx 发表于 2023-4-17 10:29
当年ST是有汇编FFT库的,我当时自己写也看过但是看不懂,后来下载了个网页版例子再结合书才看懂,很多年不 ...

快速傅里叶算法基本都有库的。递归算法,我自己也能写出来,递推算法,写了比较了下也没别人快。后来直接用库了。我们自己能折腾的就是纯整数计算。最近在研究数论变换。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

124

主题

2998

帖子

55

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