打印
[STM32F0]

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

[复制链接]
1893|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
经过好几天的努力终于写出来了,上次写的太垃圾了。写完才知道原来FFT的程序这么简单,都不如驱动数码管的程序复杂。



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

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

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

  int rr,ii, n,i;
  n=8;
  pi=3.1415927;   
        for(i=0;i<n/2;i++){
           sr=cos(2*pi*i/n);
           si=-sin(2*pi*i/n);
        rr=sr*32768;
        ii=si*32768;
       printf("0x%04X,0x%04X,",rr,ii);
}
        printf("\n");
}



计算器计算的


单片机计算的


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

全部顺序排列

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


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

       
                   
                   
       
.section .text
vectors:        
        .word STACKINIT         
        .word _start + 1        
        .word _nmi_handler + 1  
        .word _hard_fault  + 1  
        .word 0
        .word 0   
        .word 0
        .word 0
        .word 0
        .word 0
        .word 0
        .word _svc_handler +1
        .word 0
        .word 0
        .word _pendsv_handler +1
        .align 2
_start:
_shizhong:                             @时钟设置
        ldr r2, = 0x40022000   @FLASH访问控制
        movs r1, # 0x32
        str r1, [r2]
        ldr r0, = 0x40021000 @ rcc
        @0x34时钟控制寄存器 2 (RCC_CR2)
        movs r1, # 0x01
        str r1, [r0, # 0x34]  @ HSI开14M时钟
_dengdai14mshizhongwending:            @等14M时钟稳定
        ldr r1, [r0, # 0x34]
        lsls r1, r1, # 30     @ 左移30位
        bpl _dengdai14mshizhongwending  @ 等待14M时钟稳定

_neicunqingling:                                 @ 0x1000的内存清零
                                         @ 1K=1024BIT=0X400
        ldr r0, = 0x20000000
        movs r1, # 0
        ldr r3, = 0x1000
_neicunqinglingxunhuan:                           @ 内存清零循环
        subs r3, # 4
        str r1, [r0, r3]
        bne _neicunqinglingxunhuan                @



       
_fftjisuan:
_fft1:       
        ldr r0, = shuru
        ldr r1, = 0x20000000
        movs r2, # 16
        ldr r3, = hudie
_fft1xunhuan:
        ldr r6, [r3]
        ldr r7, [r3, # 0x04]
        ldr r6, [r0, r6]
        ldr r7, [r0, r7]
        adds r4, r6, r7
        subs r5, r6, r7
        str r4, [r1]
        str r5, [r1, # 0x04]
        adds r1, r1, # 0x08
        adds r3, r3, # 0x08
        subs r2, r2, # 1
        bne _fft1xunhuan
       
_fft2:
        ldr r0, = 0x20000000
        mov r4, r0
        adds r4, r4, # 0x80
        mov r8, r4
_fft2xunhuan:
        ldr r4, [r0]
        ldr r5, [r0, # 0x08]
        ldr r6, [r0, # 0x04]
        ldr r7, [r0, # 0x0c]
        adds r1, r4, r5
        subs r2, r4, r5
        mov r3, r6                @0r
        movs r4, # 0       
        subs r4, r4, r7                @0i
        mov r5, r6                @3r
        mov r6, r7                @3i
        mov r7, r0
        adds r7, r7, # 0x80
        str r1, [r0]
        str r2, [r0, # 0x08]
        str r3, [r0, # 0x04]
        str r4, [r7, # 0x04]
        str r5, [r0, # 0x0c]
        str r6, [r7, # 0x0c]
        adds r0, r0, # 0x10
        cmp r0, r8
        bne _fft2xunhuan
_fft3:
        ldr r6, = xuanzhuanyinzi
        ldr r2, = fft3xuanzhuanyinzi
        ldr r0, = 0x20000000
        str r2, [r6]
        movs r1, r0
        adds r1, r1, # 0x80
        mov r8, r1
        mov r9, r0
        mov r10, r2
        movs r5, # 0x10
        mov r11, r5
        movs r5, # 4
        mov r12, r5
        bl _fftg
_fft4:
        ldr r6, = xuanzhuanyinzi
        ldr r2, = fft4xuanzhuanyinzi
        ldr r0, = 0x20000000
        str r2, [r6]
        movs r1, r0
        adds r1, r1, # 0x80
        mov r8, r1
        mov r9, r0
        mov r10, r2
        movs r5, # 0x20
        mov r11, r5
        movs r5, # 8
        mov r12, r5
        bl _fftg
_fft5:
        ldr r6, = xuanzhuanyinzi
        ldr r2, = fft5xuanzhuanyinzi
        ldr r0, = 0x20000000
        str r2, [r6]
        movs r1, r0
        adds r1, r1, # 0x80
        mov r8, r1
        mov r9, r0
        mov r10, r2
        movs r5, # 0x40
        mov r11, r5
        movs r5, # 16
        mov r12, r5
        bl _fftg
       
       
tingting:
        b tingting
_fftg:
        push {lr}
        movs r4, # 0
        mov lr, r4
_fftxunhuan:
        mov r0, r9
        mov r1, r8
        mov r2, r10
        mov r3, r11
        ldr r4, [r0]
        ldr r5, [r1]
        ldr r6, [r0, r3]
        ldr r7, [r1, r3]
        ldr r3, [r2]                @sr
        ldr r2, [r2, # 0x04]        @si
        push {r4,r5}
        mov r4, r6
        muls r4, r4, r3
        mov r5, r7
        muls r5, r5, r2
        subs r4, r4, r5                @r       
        asrs r4, r4, # 15
        mov r5, r6
        muls r5, r5, r2
        muls r7, r7, r3
        adds r7, r7, r5                @i
        asrs r7, r7, # 15
        pop {r2,r5}
        adds r3, r2, r4    @0r
        subs r2, r2, r4    @1r
        adds r4, r5, r7
        subs r5, r5, r7
        mov r6, r11
        str r3, [r0]
        str r4, [r1]
        str r2, [r0, r6]
        str r5, [r1, r6]
        adds r0, r0, # 0x04
        adds r1, r1, # 0x04
        mov r9, r0
        mov r8, r1
        mov r2, r10
        adds r2, r2, # 0x08
        mov r10, r2
        mov r4, lr
        adds r4, r4, # 1
        mov lr, r4
        mov r7, r12
        cmp r4, r7
        bne _fftxunhuan
        movs  r4, # 0
        ldr r6, = xuanzhuanyinzi
        ldr r5, = 0x20000080
        ldr r6, [r6]
        mov r10, r6
        mov lr, r4
        mov r7, r11
        adds r0, r0, r7
        adds r1, r1, r7
        mov r9, r0
        mov r8, r1
        cmp r0, r5
        bne _fftxunhuan
        pop {pc}
               
_nmi_handler:
        bx lr
_hard_fault:
        bx lr
_svc_handler:
        bx lr
_pendsv_handler:
        bx lr





沙发
mmuuss586| | 2018-1-4 21:28 | 只看该作者
还这么多汇编,厉害啊;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

111

主题

2590

帖子

45

粉丝