[STM32F0] M0的32点FFT程序,上次那个写的太垃圾了!

[复制链接]
2385|3
 楼主| yjmwxwx 发表于 2018-1-4 15:12 | 显示全部楼层 |阅读模式
经过好几天的努力终于写出来了,上次写的太垃圾了。写完才知道原来FFT的程序这么简单,都不如驱动数码管的程序复杂。



Radix-2的算法,输入32位数,从0到31。

程序所有文件 fft11.zip (9.58 KB, 下载次数: 58)
所有小数的旋转因子先乘32768,计算完后右移15位,目的是绕开小数计算

计算旋转因子的程序,比如FFT的第三步需要4个旋转因子,N就填8
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4. void main() {
  5.   float pi,sr,si;

  6.   int rr,ii, n,i;
  7.   n=8;
  8.   pi=3.1415927;   
  9.         for(i=0;i<n/2;i++){
  10.            sr=cos(2*pi*i/n);
  11.            si=-sin(2*pi*i/n);
  12.         rr=sr*32768;
  13.         ii=si*32768;
  14.        printf("0x%04X,0x%04X,",rr,ii);
  15. }
  16.         printf("\n");
  17. }



计算器计算的

截图_2018-01-04_14-40-37.png
单片机计算的
截图_2018-01-04_14-38-54.png

从0x20000000开始到0X20000080是实部
从0X20000080开始到0X20000100是虚部

全部顺序排列

和计算器计算的大体对照下感觉差不多,单片机的输出的是十六进制,负数都是0XFFFFXXXX这样的。


FFT在STM32F030F4P6单片机上的程序
  1. [url=home.php?mod=space&uid=72445]@[/url] stm32f030f4p6 asm
  2.         [url=home.php?mod=space&uid=31174]@fft[/url] 32点
  3.          .thumb                 
  4.          .syntax unified
  5. .section .data       
  6.                .equ STACKINIT,                 0x20001000
  7.         .equ xuanzhuanyinzi,                0x20000120
  8. xinxi:        .ascii "fft-32dian-2018-01-04"
  9.         .align 4
  10. shuru:        .int 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
  11.         .int 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
  12. hudie:        .int 0,64,32,96,16,80,48,112,8,72,40,104,24,88,56,120
  13.         .int 4,68,36,100,20,84,52,116,12,76,44,108,28,92,60,124
  14. fft3xuanzhuanyinzi:
  15.         .int 0x8000,0x0000,0x5A82,0xFFFFA57E,0x0000,0xFFFF8000,0xFFFFA57E,0xFFFFA57E
  16. fft4xuanzhuanyinzi:
  17.         .int 0x8000,0x0000,0x7641,0xFFFFCF05,0x5A82,0xFFFFA57E,0x30FB,0xFFFF89BF,0x0000,0xFFFF8000,0xFFFFCF05,0xFFFF89BF,0xFFFFA57E,0xFFFFA57E,0xFFFF89BF,0xFFFFCF05
  18. fft5xuanzhuanyinzi:
  19.         .int        0x8000,0x0000,0x7D8A,0xFFFFE708,0x7641,0xFFFFCF05,0x6A6D,0xFFFFB8E4,0x5A82,0xFFFFA57E,0x471C,0xFFFF9593,0x30FB,0xFFFF89BF,0x18F8,0xFFFF8276,0x0000,0xFFFF8000,0xFFFFE708,0xFFFF8276,0xFFFFCF05,0xFFFF89BF,0xFFFFB8E4,0xFFFF9593,0xFFFFA57E,0xFFFFA57E,0xFFFF9593,0xFFFFB8E4,0xFFFF89BF,0xFFFFCF05,0xFFFF8276,0xFFFFE708

  20.        
  21.                    
  22.                    
  23.        
  24. .section .text
  25. vectors:        
  26.         .word STACKINIT         
  27.         .word _start + 1        
  28.         .word _nmi_handler + 1  
  29.         .word _hard_fault  + 1  
  30.         .word 0
  31.         .word 0   
  32.         .word 0
  33.         .word 0
  34.         .word 0
  35.         .word 0
  36.         .word 0
  37.         .word _svc_handler +1
  38.         .word 0
  39.         .word 0
  40.         .word _pendsv_handler +1
  41.         .align 2
  42. _start:
  43. _shizhong:                             @时钟设置
  44.         ldr r2, = 0x40022000   @FLASH访问控制
  45.         movs r1, # 0x32
  46.         str r1, [r2]
  47.         ldr r0, = 0x40021000 @ rcc
  48.         @0x34时钟控制寄存器 2 (RCC_CR2)
  49.         movs r1, # 0x01
  50.         str r1, [r0, # 0x34]  @ HSI开14M时钟
  51. _dengdai14mshizhongwending:            @等14M时钟稳定
  52.         ldr r1, [r0, # 0x34]
  53.         lsls r1, r1, # 30     @ 左移30位
  54.         bpl _dengdai14mshizhongwending  @ 等待14M时钟稳定

  55. _neicunqingling:                                 @ 0x1000的内存清零
  56.                                          @ 1K=1024BIT=0X400
  57.         ldr r0, = 0x20000000
  58.         movs r1, # 0
  59.         ldr r3, = 0x1000
  60. _neicunqinglingxunhuan:                           @ 内存清零循环
  61.         subs r3, # 4
  62.         str r1, [r0, r3]
  63.         bne _neicunqinglingxunhuan                @



  64.        
  65. _fftjisuan:
  66. _fft1:       
  67.         ldr r0, = shuru
  68.         ldr r1, = 0x20000000
  69.         movs r2, # 16
  70.         ldr r3, = hudie
  71. _fft1xunhuan:
  72.         ldr r6, [r3]
  73.         ldr r7, [r3, # 0x04]
  74.         ldr r6, [r0, r6]
  75.         ldr r7, [r0, r7]
  76.         adds r4, r6, r7
  77.         subs r5, r6, r7
  78.         str r4, [r1]
  79.         str r5, [r1, # 0x04]
  80.         adds r1, r1, # 0x08
  81.         adds r3, r3, # 0x08
  82.         subs r2, r2, # 1
  83.         bne _fft1xunhuan
  84.        
  85. _fft2:
  86.         ldr r0, = 0x20000000
  87.         mov r4, r0
  88.         adds r4, r4, # 0x80
  89.         mov r8, r4
  90. _fft2xunhuan:
  91.         ldr r4, [r0]
  92.         ldr r5, [r0, # 0x08]
  93.         ldr r6, [r0, # 0x04]
  94.         ldr r7, [r0, # 0x0c]
  95.         adds r1, r4, r5
  96.         subs r2, r4, r5
  97.         mov r3, r6                @0r
  98.         movs r4, # 0       
  99.         subs r4, r4, r7                @0i
  100.         mov r5, r6                @3r
  101.         mov r6, r7                @3i
  102.         mov r7, r0
  103.         adds r7, r7, # 0x80
  104.         str r1, [r0]
  105.         str r2, [r0, # 0x08]
  106.         str r3, [r0, # 0x04]
  107.         str r4, [r7, # 0x04]
  108.         str r5, [r0, # 0x0c]
  109.         str r6, [r7, # 0x0c]
  110.         adds r0, r0, # 0x10
  111.         cmp r0, r8
  112.         bne _fft2xunhuan
  113. _fft3:
  114.         ldr r6, = xuanzhuanyinzi
  115.         ldr r2, = fft3xuanzhuanyinzi
  116.         ldr r0, = 0x20000000
  117.         str r2, [r6]
  118.         movs r1, r0
  119.         adds r1, r1, # 0x80
  120.         mov r8, r1
  121.         mov r9, r0
  122.         mov r10, r2
  123.         movs r5, # 0x10
  124.         mov r11, r5
  125.         movs r5, # 4
  126.         mov r12, r5
  127.         bl _fftg
  128. _fft4:
  129.         ldr r6, = xuanzhuanyinzi
  130.         ldr r2, = fft4xuanzhuanyinzi
  131.         ldr r0, = 0x20000000
  132.         str r2, [r6]
  133.         movs r1, r0
  134.         adds r1, r1, # 0x80
  135.         mov r8, r1
  136.         mov r9, r0
  137.         mov r10, r2
  138.         movs r5, # 0x20
  139.         mov r11, r5
  140.         movs r5, # 8
  141.         mov r12, r5
  142.         bl _fftg
  143. _fft5:
  144.         ldr r6, = xuanzhuanyinzi
  145.         ldr r2, = fft5xuanzhuanyinzi
  146.         ldr r0, = 0x20000000
  147.         str r2, [r6]
  148.         movs r1, r0
  149.         adds r1, r1, # 0x80
  150.         mov r8, r1
  151.         mov r9, r0
  152.         mov r10, r2
  153.         movs r5, # 0x40
  154.         mov r11, r5
  155.         movs r5, # 16
  156.         mov r12, r5
  157.         bl _fftg
  158.        
  159.        
  160. tingting:
  161.         b tingting
  162. _fftg:
  163.         push {lr}
  164.         movs r4, # 0
  165.         mov lr, r4
  166. _fftxunhuan:
  167.         mov r0, r9
  168.         mov r1, r8
  169.         mov r2, r10
  170.         mov r3, r11
  171.         ldr r4, [r0]
  172.         ldr r5, [r1]
  173.         ldr r6, [r0, r3]
  174.         ldr r7, [r1, r3]
  175.         ldr r3, [r2]                @sr
  176.         ldr r2, [r2, # 0x04]        @si
  177.         push {r4,r5}
  178.         mov r4, r6
  179.         muls r4, r4, r3
  180.         mov r5, r7
  181.         muls r5, r5, r2
  182.         subs r4, r4, r5                @r       
  183.         asrs r4, r4, # 15
  184.         mov r5, r6
  185.         muls r5, r5, r2
  186.         muls r7, r7, r3
  187.         adds r7, r7, r5                @i
  188.         asrs r7, r7, # 15
  189.         pop {r2,r5}
  190.         adds r3, r2, r4    @0r
  191.         subs r2, r2, r4    @1r
  192.         adds r4, r5, r7
  193.         subs r5, r5, r7
  194.         mov r6, r11
  195.         str r3, [r0]
  196.         str r4, [r1]
  197.         str r2, [r0, r6]
  198.         str r5, [r1, r6]
  199.         adds r0, r0, # 0x04
  200.         adds r1, r1, # 0x04
  201.         mov r9, r0
  202.         mov r8, r1
  203.         mov r2, r10
  204.         adds r2, r2, # 0x08
  205.         mov r10, r2
  206.         mov r4, lr
  207.         adds r4, r4, # 1
  208.         mov lr, r4
  209.         mov r7, r12
  210.         cmp r4, r7
  211.         bne _fftxunhuan
  212.         movs  r4, # 0
  213.         ldr r6, = xuanzhuanyinzi
  214.         ldr r5, = 0x20000080
  215.         ldr r6, [r6]
  216.         mov r10, r6
  217.         mov lr, r4
  218.         mov r7, r11
  219.         adds r0, r0, r7
  220.         adds r1, r1, r7
  221.         mov r9, r0
  222.         mov r8, r1
  223.         cmp r0, r5
  224.         bne _fftxunhuan
  225.         pop {pc}
  226.                
  227. _nmi_handler:
  228.         bx lr
  229. _hard_fault:
  230.         bx lr
  231. _svc_handler:
  232.         bx lr
  233. _pendsv_handler:
  234.         bx lr





mmuuss586 发表于 2018-1-4 21:28 | 显示全部楼层
还这么多汇编,厉害啊;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

123

主题

2969

帖子

54

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