矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 6806|回复: 14

cortex-m0的32点FFT程序

[复制链接]
     
发表于 2018-1-4 15:02:52 | 显示全部楼层 |阅读模式
经过好几天的努力终于写出来了,上次写的太垃圾了。

Radix-2的算法,输入32位数,从0到31。
程序所有文件 fft11.zip (9.58 KB, 下载次数: 261)


所有小数的旋转因子先乘32768,计算完后右移15位,目的是绕开小数计算,

上次很傻居然乘10。写完才知道原来FFT的程序这么简单,都不如驱动数码管的程序复杂。


计算旋转因子的程序,比如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在CORTEX-M0单片机上的程序

  1.         @ stm32f030f4p6 asm
  2.         @fft 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
复制代码




     
发表于 2018-1-5 00:19:46 | 显示全部楼层
其实arm都提供这个例程的,不用自己写的
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2018-1-5 00:37:54 | 显示全部楼层
la45088d1 发表于 2018-1-4 22:26
建议:ADC定时采样,FFT-128,LED或者TFT显示频谱。这样好玩些。

慢慢学,以前没接触过ADC采样显示频谱,先把用到的几个函数写出来。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2018-1-5 01:09:56 | 显示全部楼层
leo121 发表于 2018-1-5 00:19
其实arm都提供这个例程的,不用自己写的

有库,CMSIS DSP库里面有,不过我没用过不会用,等把这个库里的函数提取出来研究研究。

有现成收音机IC为啥还有这么多人做矿石机,一个道理就是玩呗。
回复 支持 反对

使用道具 举报

     
发表于 2018-1-5 09:18:28 | 显示全部楼层
算法很重要啊,这么肯定简单了。
回复 支持 反对

使用道具 举报

     
发表于 2018-1-5 12:54:43 | 显示全部楼层
yjmwxwx 发表于 2018-1-5 01:09
有库,CMSIS DSP库里面有,不过我没用过不会用,等把这个库里的函数提取出来研究研究。

有现成收音机I ...

矿坛牛人多啊
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2018-1-5 15:07:42 | 显示全部楼层
把用到辅助小程序贴出来。

这个是生成位反转表的小程序,结果乘4因为每个数据32位。
  1. //位反转
  2. #include <stdio.h>
  3. void main() {
  4.         int aa,a2,a3,a4,a5,bb,cc,dd;


  5.         bb=256;                                //长度
  6.         dd=bb;
  7.         for(aa=0;aa<bb;aa++){
  8.                 cc=1;
  9.                 a3=0;
  10.                 a4=a3;
  11.                 while(cc<dd){
  12.                 a2=aa & cc;
  13.                 a5=bb>>1;
  14.                 if(a2!=0){
  15.                 a5=a5>>a4;
  16.                 a3=a3 | a5;
  17. }
  18.                 cc=cc<<1;
  19.                 a4=a4+1;

  20.        
  21. }
  22.         printf("0x%04X,",a3*4);               
  23. }       
  24.         printf("\n");
  25. }

  26.        
复制代码


下面这个是生成旋转因子的函数
  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=256;
  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*0x8000;
  13.         ii=si*0x8000;
  14.        printf("0x%04X,0x%04X,",rr,ii);
  15. }
  16.         printf("\n");
  17. }
  18.        
复制代码


上边这俩自己写的,写的不太好。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2018-1-5 15:19:22 | 显示全部楼层
fft64.zip (10.65 KB, 下载次数: 224)

fft128.zip (312.91 KB, 下载次数: 203)

fft256.zip (521.98 KB, 下载次数: 225)


64、128、256的都写出来了,不过好像误差很大。


下面这个是256的,输入0-255

1.png

截图_2018-01-05_14-51-55.png

比较开头一部分,误差有点大


256点的程序

  1.         @ stm32f030f4p6 asm
  2.         @fft 256点
  3.         @2018-01-05
  4.          .thumb                 
  5.          .syntax unified
  6. .section .data       
  7.                .equ STACKINIT,                 0x20001000
  8.         .equ xuanzhuanyinzi,                0x20000804
  9.         .align 4
  10. shuru:
  11.         .int 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
  12.        
  13. hudieweifanzhuan:
  14.         .int 0x0000,0x0200,0x0100,0x0300,0x0080,0x0280,0x0180,0x0380,0x0040,0x0240,0x0140,0x0340,0x00C0,0x02C0,0x01C0,0x03C0,0x0020,0x0220,0x0120,0x0320,0x00A0,0x02A0,0x01A0,0x03A0,0x0060,0x0260,0x0160,0x0360,0x00E0,0x02E0,0x01E0,0x03E0,0x0010,0x0210,0x0110,0x0310,0x0090,0x0290,0x0190,0x0390,0x0050,0x0250,0x0150,0x0350,0x00D0,0x02D0,0x01D0,0x03D0,0x0030,0x0230,0x0130,0x0330,0x00B0,0x02B0,0x01B0,0x03B0,0x0070,0x0270,0x0170,0x0370,0x00F0,0x02F0,0x01F0,0x03F0,0x0008,0x0208,0x0108,0x0308,0x0088,0x0288,0x0188,0x0388,0x0048,0x0248,0x0148,0x0348,0x00C8,0x02C8,0x01C8,0x03C8,0x0028,0x0228,0x0128,0x0328,0x00A8,0x02A8,0x01A8,0x03A8,0x0068,0x0268,0x0168,0x0368,0x00E8,0x02E8,0x01E8,0x03E8,0x0018,0x0218,0x0118,0x0318,0x0098,0x0298,0x0198,0x0398,0x0058,0x0258,0x0158,0x0358,0x00D8,0x02D8,0x01D8,0x03D8,0x0038,0x0238,0x0138,0x0338,0x00B8,0x02B8,0x01B8,0x03B8,0x0078,0x0278,0x0178,0x0378,0x00F8,0x02F8,0x01F8,0x03F8,0x0004,0x0204,0x0104,0x0304,0x0084,0x0284,0x0184,0x0384,0x0044,0x0244,0x0144,0x0344,0x00C4,0x02C4,0x01C4,0x03C4,0x0024,0x0224,0x0124,0x0324,0x00A4,0x02A4,0x01A4,0x03A4,0x0064,0x0264,0x0164,0x0364,0x00E4,0x02E4,0x01E4,0x03E4,0x0014,0x0214,0x0114,0x0314,0x0094,0x0294,0x0194,0x0394,0x0054,0x0254,0x0154,0x0354,0x00D4,0x02D4,0x01D4,0x03D4,0x0034,0x0234,0x0134,0x0334,0x00B4,0x02B4,0x01B4,0x03B4,0x0074,0x0274,0x0174,0x0374,0x00F4,0x02F4,0x01F4,0x03F4,0x000C,0x020C,0x010C,0x030C,0x008C,0x028C,0x018C,0x038C,0x004C,0x024C,0x014C,0x034C,0x00CC,0x02CC,0x01CC,0x03CC,0x002C,0x022C,0x012C,0x032C,0x00AC,0x02AC,0x01AC,0x03AC,0x006C,0x026C,0x016C,0x036C,0x00EC,0x02EC,0x01EC,0x03EC,0x001C,0x021C,0x011C,0x031C,0x009C,0x029C,0x019C,0x039C,0x005C,0x025C,0x015C,0x035C,0x00DC,0x02DC,0x01DC,0x03DC,0x003C,0x023C,0x013C,0x033C,0x00BC,0x02BC,0x01BC,0x03BC,0x007C,0x027C,0x017C,0x037C,0x00FC,0x02FC,0x01FC,0x03FC
  15. fft3xuanzhuanyinzi:
  16.         .int 0x8000,0x0000,0x5A82,0xFFFFA57E,0x0000,0xFFFF8000,0xFFFFA57E,0xFFFFA57E
  17. fft4xuanzhuanyinzi:
  18.         .int 0x8000,0x0000,0x7641,0xFFFFCF05,0x5A82,0xFFFFA57E,0x30FB,0xFFFF89BF,0x0000,0xFFFF8000,0xFFFFCF05,0xFFFF89BF,0xFFFFA57E,0xFFFFA57E,0xFFFF89BF,0xFFFFCF05
  19. fft5xuanzhuanyinzi:
  20.         .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
  21. fft6xuanzhuanyinzi:
  22.         .int 0x8000,0x0000,0x7F62,0xFFFFF375,0x7D8A,0xFFFFE708,0x7A7D,0xFFFFDAD8,0x7641,0xFFFFCF05,0x70E2,0xFFFFC3AA,0x6A6D,0xFFFFB8E4,0x62F2,0xFFFFAECD,0x5A82,0xFFFFA57E,0x5133,0xFFFF9D0E,0x471C,0xFFFF9593,0x3C56,0xFFFF8F1E,0x30FB,0xFFFF89BF,0x2528,0xFFFF8583,0x18F8,0xFFFF8276,0x0C8B,0xFFFF809E,0x0000,0xFFFF8000,0xFFFFF375,0xFFFF809E,0xFFFFE708,0xFFFF8276,0xFFFFDAD8,0xFFFF8583,0xFFFFCF05,0xFFFF89BF,0xFFFFC3AA,0xFFFF8F1E,0xFFFFB8E4,0xFFFF9593,0xFFFFAECD,0xFFFF9D0E,0xFFFFA57E,0xFFFFA57E,0xFFFF9D0E,0xFFFFAECD,0xFFFF9593,0xFFFFB8E4,0xFFFF8F1E,0xFFFFC3AA,0xFFFF89BF,0xFFFFCF05,0xFFFF8583,0xFFFFDAD8,0xFFFF8276,0xFFFFE708,0xFFFF809E,0xFFFFF375
  23. fft7xuanzhuanyinzi:
  24.         .int 0x8000,0x0000,0x7FD8,0xFFFFF9B9,0x7F62,0xFFFFF375,0x7E9D,0xFFFFED38,0x7D8A,0xFFFFE708,0x7C29,0xFFFFE0E7,0x7A7D,0xFFFFDAD8,0x7884,0xFFFFD4E1,0x7641,0xFFFFCF05,0x73B5,0xFFFFC946,0x70E2,0xFFFFC3AA,0x6DCA,0xFFFFBE32,0x6A6D,0xFFFFB8E4,0x66CF,0xFFFFB3C1,0x62F2,0xFFFFAECD,0x5ED7,0xFFFFAA0B,0x5A82,0xFFFFA57E,0x55F5,0xFFFFA129,0x5133,0xFFFF9D0E,0x4C3F,0xFFFF9931,0x471C,0xFFFF9593,0x41CE,0xFFFF9236,0x3C56,0xFFFF8F1E,0x36BA,0xFFFF8C4B,0x30FB,0xFFFF89BF,0x2B1F,0xFFFF877C,0x2528,0xFFFF8583,0x1F19,0xFFFF83D7,0x18F8,0xFFFF8276,0x12C8,0xFFFF8163,0x0C8B,0xFFFF809E,0x0647,0xFFFF8028,0x0000,0xFFFF8000,0xFFFFF9B9,0xFFFF8028,0xFFFFF375,0xFFFF809E,0xFFFFED38,0xFFFF8163,0xFFFFE708,0xFFFF8276,0xFFFFE0E7,0xFFFF83D7,0xFFFFDAD8,0xFFFF8583,0xFFFFD4E1,0xFFFF877C,0xFFFFCF05,0xFFFF89BF,0xFFFFC946,0xFFFF8C4B,0xFFFFC3AA,0xFFFF8F1E,0xFFFFBE32,0xFFFF9236,0xFFFFB8E4,0xFFFF9593,0xFFFFB3C1,0xFFFF9931,0xFFFFAECD,0xFFFF9D0E,0xFFFFAA0B,0xFFFFA129,0xFFFFA57E,0xFFFFA57E,0xFFFFA129,0xFFFFAA0B,0xFFFF9D0E,0xFFFFAECD,0xFFFF9931,0xFFFFB3C1,0xFFFF9593,0xFFFFB8E4,0xFFFF9236,0xFFFFBE32,0xFFFF8F1E,0xFFFFC3AA,0xFFFF8C4B,0xFFFFC946,0xFFFF89BF,0xFFFFCF05,0xFFFF877C,0xFFFFD4E1,0xFFFF8583,0xFFFFDAD8,0xFFFF83D7,0xFFFFE0E7,0xFFFF8276,0xFFFFE708,0xFFFF8163,0xFFFFED38,0xFFFF809E,0xFFFFF375,0xFFFF8028,0xFFFFF9B9

  25. fft8xuanzhuanyinzi:
  26.         .int 0x8000,0x0000,0x7FF6,0xFFFFFCDC,0x7FD8,0xFFFFF9B9,0x7FA7,0xFFFFF696,0x7F62,0xFFFFF375,0x7F09,0xFFFFF055,0x7E9D,0xFFFFED38,0x7E1D,0xFFFFEA1E,0x7D8A,0xFFFFE708,0x7CE3,0xFFFFE3F5,0x7C29,0xFFFFE0E7,0x7B5D,0xFFFFDDDD,0x7A7D,0xFFFFDAD8,0x798A,0xFFFFD7DA,0x7884,0xFFFFD4E1,0x776C,0xFFFFD1EF,0x7641,0xFFFFCF05,0x7504,0xFFFFCC22,0x73B5,0xFFFFC946,0x7255,0xFFFFC674,0x70E2,0xFFFFC3AA,0x6F5F,0xFFFFC0E9,0x6DCA,0xFFFFBE32,0x6C24,0xFFFFBB86,0x6A6D,0xFFFFB8E4,0x68A6,0xFFFFB64C,0x66CF,0xFFFFB3C1,0x64E8,0xFFFFB141,0x62F2,0xFFFFAECD,0x60EC,0xFFFFAC65,0x5ED7,0xFFFFAA0B,0x5CB4,0xFFFFA7BE,0x5A82,0xFFFFA57E,0x5842,0xFFFFA34C,0x55F5,0xFFFFA129,0x539B,0xFFFF9F14,0x5133,0xFFFF9D0E,0x4EBF,0xFFFF9B18,0x4C3F,0xFFFF9931,0x49B4,0xFFFF975A,0x471C,0xFFFF9593,0x447A,0xFFFF93DC,0x41CE,0xFFFF9236,0x3F17,0xFFFF90A1,0x3C56,0xFFFF8F1E,0x398C,0xFFFF8DAB,0x36BA,0xFFFF8C4B,0x33DE,0xFFFF8AFC,0x30FB,0xFFFF89BF,0x2E11,0xFFFF8894,0x2B1F,0xFFFF877C,0x2826,0xFFFF8676,0x2528,0xFFFF8583,0x2223,0xFFFF84A3,0x1F19,0xFFFF83D7,0x1C0B,0xFFFF831D,0x18F8,0xFFFF8276,0x15E2,0xFFFF81E3,0x12C8,0xFFFF8163,0x0FAB,0xFFFF80F7,0x0C8B,0xFFFF809E,0x096A,0xFFFF8059,0x0647,0xFFFF8028,0x0324,0xFFFF800A,0x0000,0xFFFF8000,0xFFFFFCDC,0xFFFF800A,0xFFFFF9B9,0xFFFF8028,0xFFFFF696,0xFFFF8059,0xFFFFF375,0xFFFF809E,0xFFFFF055,0xFFFF80F7,0xFFFFED38,0xFFFF8163,0xFFFFEA1E,0xFFFF81E3,0xFFFFE708,0xFFFF8276,0xFFFFE3F5,0xFFFF831D,0xFFFFE0E7,0xFFFF83D7,0xFFFFDDDD,0xFFFF84A3,0xFFFFDAD8,0xFFFF8583,0xFFFFD7DA,0xFFFF8676,0xFFFFD4E1,0xFFFF877C,0xFFFFD1EF,0xFFFF8894,0xFFFFCF05,0xFFFF89BF,0xFFFFCC22,0xFFFF8AFC,0xFFFFC946,0xFFFF8C4B,0xFFFFC674,0xFFFF8DAB,0xFFFFC3AA,0xFFFF8F1E,0xFFFFC0E9,0xFFFF90A1,0xFFFFBE32,0xFFFF9236,0xFFFFBB86,0xFFFF93DC,0xFFFFB8E4,0xFFFF9593,0xFFFFB64C,0xFFFF975A,0xFFFFB3C1,0xFFFF9931,0xFFFFB141,0xFFFF9B18,0xFFFFAECD,0xFFFF9D0E,0xFFFFAC65,0xFFFF9F14,0xFFFFAA0B,0xFFFFA129,0xFFFFA7BE,0xFFFFA34C,0xFFFFA57E,0xFFFFA57E,0xFFFFA34C,0xFFFFA7BE,0xFFFFA129,0xFFFFAA0B,0xFFFF9F14,0xFFFFAC65,0xFFFF9D0E,0xFFFFAECD,0xFFFF9B18,0xFFFFB141,0xFFFF9931,0xFFFFB3C1,0xFFFF975A,0xFFFFB64C,0xFFFF9593,0xFFFFB8E4,0xFFFF93DC,0xFFFFBB86,0xFFFF9236,0xFFFFBE32,0xFFFF90A1,0xFFFFC0E9,0xFFFF8F1E,0xFFFFC3AA,0xFFFF8DAB,0xFFFFC674,0xFFFF8C4B,0xFFFFC946,0xFFFF8AFC,0xFFFFCC22,0xFFFF89BF,0xFFFFCF05,0xFFFF8894,0xFFFFD1EF,0xFFFF877C,0xFFFFD4E1,0xFFFF8676,0xFFFFD7DA,0xFFFF8583,0xFFFFDAD8,0xFFFF84A3,0xFFFFDDDD,0xFFFF83D7,0xFFFFE0E7,0xFFFF831D,0xFFFFE3F5,0xFFFF8276,0xFFFFE708,0xFFFF81E3,0xFFFFEA1E,0xFFFF8163,0xFFFFED38,0xFFFF80F7,0xFFFFF055,0xFFFF809E,0xFFFFF375,0xFFFF8059,0xFFFFF696,0xFFFF8028,0xFFFFF9B9,0xFFFF800A,0xFFFFFCDC
  27.                           
  28. .section .text
  29. vectors:        
  30.         .word STACKINIT         
  31.         .word _start + 1        
  32.         .word _nmi_handler + 1  
  33.         .word _hard_fault  + 1  
  34.         .word 0
  35.         .word 0   
  36.         .word 0
  37.         .word 0
  38.         .word 0
  39.         .word 0
  40.         .word 0
  41.         .word _svc_handler +1
  42.         .word 0
  43.         .word 0
  44.         .word _pendsv_handler +1
  45.         .align 2
  46. _start:
  47. _shizhong:                             @时钟设置
  48.         ldr r2, = 0x40022000   @FLASH访问控制
  49.         movs r1, # 0x32
  50.         str r1, [r2]
  51.         ldr r0, = 0x40021000 @ rcc
  52.         @0x34时钟控制寄存器 2 (RCC_CR2)
  53.         movs r1, # 0x01
  54.         str r1, [r0, # 0x34]  @ HSI开14M时钟
  55. _dengdai14mshizhongwending:            @等14M时钟稳定
  56.         ldr r1, [r0, # 0x34]
  57.         lsls r1, r1, # 30     @ 左移30位
  58.         bpl _dengdai14mshizhongwending  @ 等待14M时钟稳定

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



  68.        
  69. _fftjisuan:
  70. _fft1:       
  71.         ldr r0, = shuru
  72.         ldr r1, = 0x20000000
  73.         movs r2, # 128
  74.         ldr r3, = hudieweifanzhuan
  75. _fft1xunhuan:
  76.         ldr r6, [r3]
  77.         ldr r7, [r3, # 0x04]
  78.         ldr r6, [r0, r6]
  79.         ldr r7, [r0, r7]
  80.         adds r4, r6, r7
  81.         subs r5, r6, r7
  82.         str r4, [r1]
  83.         str r5, [r1, # 0x04]
  84.         adds r1, r1, # 0x08
  85.         adds r3, r3, # 0x08
  86.         subs r2, r2, # 1
  87.         bne _fft1xunhuan
  88.        
  89. _fft2:
  90.         ldr r0, = 0x20000000
  91.         movs r4, # 1
  92.         lsls r4, r4, # 10
  93.         adds r4, r4, r0
  94.         mov r8, r4
  95. _fft2xunhuan:
  96.         ldr r4, [r0]
  97.         ldr r5, [r0, # 0x08]
  98.         ldr r6, [r0, # 0x04]
  99.         ldr r7, [r0, # 0x0c]
  100.         adds r1, r4, r5
  101.         subs r2, r4, r5
  102.         mov r3, r6                @0r
  103.         movs r4, # 0       
  104.         subs r4, r4, r7                @0i
  105.         mov r5, r6                @3r
  106.         mov r6, r7                @3i
  107.         movs r7, # 1
  108.         lsls r7, r7, # 10
  109.         adds r7, r7, r0
  110.         str r1, [r0]
  111.         str r2, [r0, # 0x08]
  112.         str r3, [r0, # 0x04]
  113.         str r4, [r7, # 0x04]
  114.         str r5, [r0, # 0x0c]
  115.         str r6, [r7, # 0x0c]
  116.         adds r0, r0, # 0x10
  117.         cmp r0, r8
  118.         bne _fft2xunhuan
  119. _fft3:
  120.         ldr r6, = xuanzhuanyinzi
  121.         ldr r2, = fft3xuanzhuanyinzi
  122.         ldr r0, = 0x20000000
  123.         str r2, [r6]
  124.         movs r1, # 1
  125.         lsls r1, r1, # 10
  126.         adds r1, r1, r0
  127.         mov r8, r1
  128.         mov r9, r0
  129.         mov r10, r2
  130.         movs r5, # 0x10
  131.         mov r11, r5
  132.         movs r5, # 4
  133.         mov r12, r5
  134.         bl _fftg
  135. _fft4:
  136.         ldr r6, = xuanzhuanyinzi
  137.         ldr r2, = fft4xuanzhuanyinzi
  138.         ldr r0, = 0x20000000
  139.         str r2, [r6]
  140.         movs r1, # 1
  141.         lsls r1, r1, # 10
  142.         adds r1, r1, r0
  143.         mov r8, r1
  144.         mov r9, r0
  145.         mov r10, r2
  146.         movs r5, # 0x20
  147.         mov r11, r5
  148.         movs r5, # 8
  149.         mov r12, r5
  150.         bl _fftg
  151. _fft5:
  152.         ldr r6, = xuanzhuanyinzi
  153.         ldr r2, = fft5xuanzhuanyinzi
  154.         ldr r0, = 0x20000000
  155.         str r2, [r6]
  156.         movs r1, # 1
  157.         lsls r1, r1, # 10
  158.         adds r1, r1, r0
  159.         mov r8, r1
  160.         mov r9, r0
  161.         mov r10, r2
  162.         movs r5, # 0x40
  163.         mov r11, r5
  164.         movs r5, # 16
  165.         mov r12, r5
  166.         bl _fftg

  167. _fft6:
  168.         ldr r6, = xuanzhuanyinzi
  169.         ldr r2, = fft6xuanzhuanyinzi
  170.         ldr r0, = 0x20000000
  171.         str r2, [r6]
  172.         movs r1, # 1
  173.         lsls r1, r1, # 10
  174.         adds r1, r1, r0
  175.         mov r8, r1
  176.         mov r9, r0
  177.         mov r10, r2
  178.         movs r5, # 0x80
  179.         mov r11, r5
  180.         movs r5, # 32
  181.         mov r12, r5
  182.         bl _fftg
  183.        
  184. _fft7:
  185.         ldr r6, = xuanzhuanyinzi
  186.         ldr r2, = fft7xuanzhuanyinzi
  187.         ldr r0, = 0x20000000
  188.         str r2, [r6]
  189.         movs r1, # 1
  190.         lsls r1, r1, # 10
  191.         adds r1, r1, r0
  192.         mov r8, r1
  193.         mov r9, r0
  194.         mov r10, r2
  195.         movs r5, # 1
  196.         lsls r5, r5, # 8
  197.         mov r11, r5
  198.         movs r5, # 64
  199.         mov r12, r5
  200.         bl _fftg

  201. _fft8:
  202.         ldr r6, = xuanzhuanyinzi
  203.         ldr r2, = fft8xuanzhuanyinzi
  204.         ldr r0, = 0x20000000
  205.         str r2, [r6]
  206.         movs r1, # 1
  207.         lsls r1, r1, # 10
  208.         adds r1, r1, r0
  209.         mov r8, r1
  210.         mov r9, r0
  211.         mov r10, r2
  212.         movs r5, # 1
  213.         lsls r5, r5, # 9
  214.         mov r11, r5
  215.         movs r5, # 128
  216.         mov r12, r5
  217.         bl _fftg
  218.        
  219.        
  220. tingting:
  221.         b tingting
  222. _fftg:
  223.         push {lr}
  224.         movs r4, # 0
  225.         mov lr, r4
  226. _fftxunhuan:
  227.         mov r0, r9
  228.         mov r1, r8
  229.         mov r2, r10
  230.         mov r3, r11
  231.         ldr r4, [r0]
  232.         ldr r5, [r1]
  233.         ldr r6, [r0, r3]
  234.         ldr r7, [r1, r3]
  235.         ldr r3, [r2]                @sr
  236.         ldr r2, [r2, # 0x04]        @si
  237.         push {r4,r5}
  238.         mov r4, r6
  239.         muls r4, r4, r3
  240.         mov r5, r7
  241.         muls r5, r5, r2
  242.         subs r4, r4, r5                @r
  243.         asrs r4, r4, # 15
  244.         mov r5, r6
  245.         muls r5, r5, r2
  246.         muls r7, r7, r3
  247.         adds r7, r7, r5    @i
  248.         asrs r7, r7, # 15
  249.         pop {r2,r5}
  250.         adds r3, r2, r4    @0r
  251.         subs r2, r2, r4    @1r
  252.         adds r4, r5, r7
  253.         subs r5, r5, r7
  254.         mov r6, r11
  255.         str r3, [r0]
  256.         str r4, [r1]
  257.         str r2, [r0, r6]
  258.         str r5, [r1, r6]
  259.         adds r0, r0, # 0x04
  260.         adds r1, r1, # 0x04
  261.         mov r9, r0
  262.         mov r8, r1
  263.         mov r2, r10
  264.         adds r2, r2, # 0x08
  265.         mov r10, r2
  266.         mov r4, lr
  267.         adds r4, r4, # 1
  268.         mov lr, r4
  269.         mov r7, r12
  270.         cmp r4, r7
  271.         bne _fftxunhuan
  272.         movs  r4, # 0
  273.         ldr r6, = xuanzhuanyinzi
  274.         ldr r5, = 0x20000400
  275.         ldr r6, [r6]
  276.         mov r10, r6
  277.         mov lr, r4
  278.         mov r7, r11
  279.         adds r0, r0, r7
  280.         adds r1, r1, r7
  281.         mov r9, r0
  282.         mov r8, r1
  283.         cmp r0, r5
  284.         bne _fftxunhuan
  285.         pop {pc}
  286.         .ltorg
  287. _nmi_handler:
  288.         bx lr
  289. _hard_fault:
  290.         bx lr
  291. _svc_handler:
  292.         bx lr
  293. _pendsv_handler:
  294.         bx lr
复制代码



回复 支持 反对

使用道具 举报

     
发表于 2018-1-5 15:32:32 来自手机 | 显示全部楼层
一大堆汇编,看的头晕
回复 支持 反对

使用道具 举报

     
发表于 2023-8-1 14:07:52 | 显示全部楼层
我也用的DSP库搞的fft。
不过您这个真厉害!
回复 支持 反对

使用道具 举报

     
发表于 2023-8-1 14:36:50 | 显示全部楼层
本帖最后由 iffi123 于 2023-8-1 14:49 编辑

M3内核有ST官方汇编库(64,256,1024),但fft最好用在有硬件浮点的芯片,速度快很多,84M主频,1024点耗时不到1ms,  现在F3,F4也很便宜
回复 支持 反对

使用道具 举报

     
发表于 2023-8-1 18:05:56 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-8-1 18:10:30 | 显示全部楼层
iffi123 发表于 2023-8-1 14:36
M3内核有ST官方汇编库(64,256,1024),但fft最好用在有硬件浮点的芯片,速度快很多,84M主频,1024点耗时不 ...

这多年下来我其实还没用过FFT做过什么东西。。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-8-1 18:15:46 | 显示全部楼层
bis 发表于 2023-8-1 18:05
1)CMSIS里面有FFT。

2)M0没有FPU,浮点运算非常慢,CMSIS自带定点运算库。

多年下来感觉这数学计算类的程序写起来好麻烦,自己写的效果不好,速度慢、算的不准、动不动就溢出。。官方库当年也看过,看不懂具体怎么算的,人家写库的经验丰富写出来的东西确实好用。
回复 支持 反对

使用道具 举报

     
发表于 2023-8-1 19:45:39 | 显示全部楼层
本帖最后由 iffi123 于 2023-8-1 19:50 编辑
yjmwxwx 发表于 2023-8-1 18:10
这多年下来我其实还没用过FFT做过什么东西。。


最多的就是频谱显示了,比如sdr, 音频播放这些,我用过官方库,不过包含相关dsp文件后,代码增加很多,主要那个系数表奇大无比,增加约100K
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-27 21:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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