矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 8769|回复: 21

单片机ADC采样FFT计算试验

[复制链接]
     
发表于 2019-6-24 12:30:27 | 显示全部楼层 |阅读模式
本帖最后由 yjmwxwx 于 2019-6-24 13:13 编辑

        去年学了点数字信号处理,我数学一点看不懂,库也不会用,没办法当时写了个FFT的函数,想用ADC采样用FFT计算但是失败了,当时写的那个256点的溢出了,加上第一次接触这东西不会搞,最近一些日子又重新捡起来这阑尾工程,调试了几天终于成功了。

        做了简单电路,两个STM32F030F4P6,一个产生正弦波另一个ADC采样256点用FFT计算得到这个正弦波的幅度。

        0x20000000-0x20000400是实部 0x20000400-0x20000800是虚部, 取出第22个数据的实部和虚部计算出幅度用数码管显示。 由于是Q15定点数,每次保存右移了1位,结果需要乘64, 数码管显示位数有限没乘64,结果只显示了后4位没显示全。

内存里数据是对的,但是滤波器里面多右移了2位导致数码管显示的不对。。。

        电路图

dianlutu.png

实物图
截图_2019-06-24_11-18-44.png

截图_2019-06-24_11-20-56.png



下图上把单片机数据输入到电脑上软件计算的,用来和单片机计算的比对,第22个实部是-156265.198,虚部是-157711.28

截图_2019-06-24_11-26-25.png

截图_2019-06-22_22-54-39.png

单片机计算的实部,第22个是0XFFFFF675,十进制2443乘64=156352。地址是0X20000058

实部.png


单片机计算的虚部,第22个是0XFFFFF65F十进制是2465乘64=157760。 地址是0X20000458

虚部.png


结果和电脑上的差不太多,电脑上软件可能是浮点数,我这个是Q15定点数的。




ADC采集的波形,采样率1M 。

截图_2019-06-24_12-02-01.png

示波器波形

截图_2019-06-24_11-20-06.png

截图_2019-06-24_11-19-32.png

SPWM单片机程序
dingshiqispwm.tar.gz (5.99 KB, 下载次数: 100)

ADC——FFT单片机程序

adcfft1.tar.gz (28.48 KB, 下载次数: 186)




视频地址

https://v.youku.com/v_show/id_XNDI0MDcyMjcyMA==.html?spm=a2h3j.8428770.3416059.1


程序代码,有点长,查找表和初始化部分删除了,只贴关键部分

  1.         @@单片机stm32f030f4p6


  2. dmachushihua:
  3.         @+0=LSR,+4=IFCR,
  4.         @+8=CCR1,+c=CNDTR1,+10=CPAR1+14=CMAR1,
  5.         @+1c=CCR2,+20=CNDTR2,+24=CPAR2,+28=CMAR2
  6.         @+30=CCR3,+34=CNDTR3,+38=CPAR2,+3c=CMAR3
  7.         @+44=CCR4,+48=CNDTR4,+4c=CPAR4,+50=CMAR4
  8.         @+58=CCR5,+5c=CNDTR5,+60=CPAR5,+64=CMAR5
  9.         @+6C=CCR6,+70=CNDTR6,+74=CPAR6,+78=CMAR6
  10.         @+80=CCR7,+84=CNDTR7,+88=CPAR7,+8c=CMAR7
  11.         @ tim1DMA
  12.         @ adc dma
  13.         ldr r0, = 0x40020000
  14.         ldr r1, = 0x40012440
  15.         str r1, [r0, # 0x10]
  16.         ldr r1, = dianyabiao
  17.         str r1, [r0, # 0x14]
  18.         ldr r1, =  256
  19.         str r1, [r0, # 0x0c]
  20.         ldr r1, = 0xa81
  21.         str r1, [r0, # 0x08]
  22.        


  23. _adcchushihua:
  24.         ldr r0, = 0x40012400  @ adc基地址
  25.         ldr r1, = 0x80000000
  26.         str r1, [r0, # 0x08]  @ ADC 控制寄存器 (ADC_CR)  @adc校准
  27. _dengadcjiaozhun:
  28.         ldr r1, [r0, # 0x08]
  29.          movs r1, r1
  30.         bmi _dengadcjiaozhun   @ 等ADC校准
  31. _kaiadc:
  32.         ldr r1, [r0, # 0x08]
  33.         movs r2, # 0x01
  34.         orrs r1, r1, r2
  35.         str r1, [r0, # 0x08]
  36. _dengdaiadcwending:
  37.         ldr r1, [r0]
  38.         lsls r1, r1, # 31
  39.         bpl _dengdaiadcwending @ 等ADC稳定
  40. _tongdaoxuanze:
  41.         ldr r1, = 0x01
  42.         str r1, [r0, # 0x28]    @ 通道选择寄存器 (ADC_CHSELR)
  43. @        ldr r1, = 0xcC3         @ tim3触发ADC
  44.         ldr r1, = 0x3003
  45.         str r1, [r0, # 0x0c]    @ 配置寄存器 1 (ADC_CFGR1)
  46.         movs r1, # 0        
  47.         str r1, [r0, # 0x14]    @ ADC 采样时间寄存器 (ADC_SMPR)
  48.         ldr r1, [r0, # 0x08]
  49.         ldr r2, = 0x04         @ 开始转换
  50.         orrs r1, r1, r2
  51.         str r1, [r0, # 0x08]    @ 控制寄存器 (ADC_CR)


  52.        
  53. _waishezhongduan:                @外设中断
  54.         @0xE000E100    0-31  写1开,写0没效
  55.         @0XE000E180    0-31 写1关,写0没效
  56.         @0XE000E200    0-31 挂起,写0没效
  57.         @0XE000E280    0-31 清除, 写0没效




  58. ting:
  59.        
  60.         ldr r0, = dianyabiao
  61.         bl _fftjisuan
  62.         ldr r0, = 0x20000058
  63.         movs r1, # 0x01
  64.         lsls r1, r1, # 10
  65.         adds r1, r1, r0
  66.         ldr r0, [r0]
  67.         ldr r1, [r1]
  68.         bl _jisuanfudu
  69.         mov r3, r0
  70.         ldr r0, = lvbohuanchong
  71.         ldr r1, = 256
  72.         ldr r2, = lvbozhizhen
  73.         bl _lvboqi
  74.         ldr r2, = shumaguanma
  75.         movs r1, # 8
  76.         bl _zhuanshumaguanma
  77.         movs r0, # 8
  78.         bl _xieshumaguan
  79. neicunqingling1:
  80.         ldr r0, = 0x20000000
  81.         movs r1, # 0
  82.         ldr r3, = 0x850
  83. neicunqinglingxunhuan1:
  84.         subs r3, # 4
  85.         str r1, [r0, r3]
  86.         bne neicunqinglingxunhuan1
  87.         ldr r0, = 0x40020000
  88.         ldr r1, [r0, # 0x0c]
  89.         cmp r1, # 0
  90.         bne ting
  91.         str r1, [r0, # 0x08]
  92.         movs r1, # 0xff
  93.         ldr r2, = 0xa81
  94.         str r1, [r0, # 0x0c]
  95.         str r2, [r0, # 0x08]
  96.         b ting
  97.        

  98.        
  99.        
  100. _maopaopaixu:
  101.         push {r0-r7,lr}
  102.         @ r0= 表地址, r1= 长度
  103.         mov r7, r1
  104. _paixu:
  105.         lsls r1, r7, # 2
  106. _paixuxunhuan:       
  107.         ldrh r2, [r0, r1]
  108.         subs r1, r1, # 2
  109.         bmi _paixu1
  110.         ldrh r4, [r0, r1]
  111.         cmp r2, r4
  112.         bls _paixuxunhuan
  113.         strh r2, [r0, r1]
  114.         adds r3, r1, # 2
  115.         strh r4, [r0, r3]
  116.         b _paixuxunhuan
  117. _paixu1:
  118.         adds r0, r0, # 2
  119.         subs r7, r7, # 1
  120.         bne _paixu
  121.         pop {r0-r7,pc}

  122. _zhuanshumaguanma:@ 16进制转数码管码
  123.                 @ R0要转的数据, R1长度,R2结果表首地址
  124.         push {r0-r7,lr}
  125.         ldr r7, = shumaguanmabiao
  126.         mov r5, r0
  127.         mov r6, r1
  128.         movs r1, # 10
  129. _xunhuanqiuma:
  130.         bl _chufa
  131.         mov r4, r0
  132.         muls r4, r1
  133.         subs r3, r5, r4
  134.         lsls r3, # 2
  135.         ldr r4, [r7, r3]
  136.         str r4, [r2]
  137.         mov r5, r0
  138.         adds r2, r2, # 4
  139.         subs r6, # 1
  140.         bne _xunhuanqiuma
  141.         pop {r0-r7,pc}
  142. _xieshumaguan: @ r0=位数 @数码管码
  143.         push {r0-r7,lr}
  144.         lsls r0, r0, # 2
  145.         movs r7, # 0
  146.         mov r6, r0
  147.         ldr r5, = shumaguanma
  148.         ldr r2, = shumaguanshuaxinbiao
  149. _shumaguanshuaxin:
  150.         ldr r3, [r5, r7]
  151.         ldr r4, [r2, r7]
  152.         orrs r4, r4, r3
  153.         mov r0, r4
  154.         bl _xie595
  155.         adds  r7, r7, # 4
  156.         cmp r7, r6
  157.         bls _shumaguanshuaxin
  158.         pop {r0-r7,pc}
  159.        
  160. _xie595: @ R0=要写的数据
  161.         push {r0-r7,lr}
  162.         mov r5, r0
  163.         movs r0, # 0x40
  164.         movs r7, # 0x80
  165.         movs r6, # 0x20
  166.         movs r3, # 16   @16位
  167.         ldr r2, = 0x48000000 @ gpioa
  168.         movs r1, # 0x01
  169. _xunhuan595:
  170.         str r7, [r2, # 0x18]
  171.         bl _yanshi
  172.         tst r5, r1
  173.         bne _xie595_0
  174.         str r0, [r2, # 0x28]
  175.         b _suocun595
  176. _xie595_0:
  177.         str r0, [r2, # 0x18]
  178. _suocun595:
  179.         bl _yanshi
  180.         lsrs r5, # 1
  181.         str r7, [r2, # 0x28]
  182.         bl _yanshi
  183.         subs r3, r3, # 1
  184.         bne _xunhuan595
  185.         str r6, [r2, # 0x18]
  186.         bl _yanshi
  187.         str r6, [r2, # 0x28]
  188.         bl _yanshi
  189.         pop {r0-r7,pc}


  190. _yanshi:
  191.         push {r7}
  192.         ldr r7, = 30
  193. _yanshi11:
  194.         subs r7, # 1
  195.         bne _yanshi11
  196.         pop {r7}
  197.         bx lr
  198. _chufa:                        @软件除法
  199.         @ r0 除以 r1 等于 商(r0)余数R1
  200.         push {r1-r4,lr}
  201.         cmp r0, # 0
  202.         beq _chufafanhui
  203.         cmp r1, # 0
  204.         beq _chufafanhui
  205.         mov r2, r0
  206.         movs r3, # 1
  207.         lsls r3, r3, # 31
  208.         movs r0, # 0
  209.         mov r4, r0
  210. _chufaxunhuan:
  211.         lsls r2, r2, # 1
  212.         adcs r4, r4, r4
  213.         cmp r4, r1
  214.         bcc _chufaweishubudao0
  215.         adds r0, r0, r3
  216.         subs r4, r4, r1
  217. _chufaweishubudao0:
  218.         lsrs r3, r3, # 1
  219.         bne _chufaxunhuan
  220. _chufafanhui:
  221.         pop {r1-r4,pc}
  222.         .ltorg

  223. _jisuanfudu:        @ 计算幅度
  224.                 @ 入r0= 实部,r1= 虚部
  225.                 @ 出r0 = 幅度
  226.                 @ Mag ~=Alpha * max(|I|, |Q|) + Beta * min(|I|, |Q|)
  227.                 @ Alpha * Max + Beta * Min
  228.         push {r1-r3,lr}
  229.         movs r0, r0
  230.         bpl _shibubushifushu
  231.         mvns r0, r0                                @ 是负数转成正数
  232.         adds r0, r0, # 1       
  233. _shibubushifushu:                                @ 实部不是负数
  234.         movs r1, r1
  235.         bpl _xububushifushu
  236.         mvns r1, r1                                @ 是负数转成正数
  237.         adds r1, r1, # 1
  238. _xububushifushu:                                @ 虚部不是负数
  239.         cmp r0, # 0
  240.         bne _panduanxubushibushi0               
  241.         mov r0, r1                               
  242.         pop {r1-r3,pc}
  243. _panduanxubushibushi0:       
  244.         cmp r1, # 0
  245.         bne _jisuanfudu1
  246.         pop {r1-r3,pc}
  247. _jisuanfudu1:
  248.         ldr r2, = 31066                @ Alpha q15 0.948059448969
  249.         ldr r3, = 12867                @ Beta q15 0.392699081699
  250.         cmp r1, r0
  251.         bhi _alpha_min_beta_max
  252. _alpha_max_beta_min:
  253.         muls r0, r0, r2
  254.         muls r1, r1, r3
  255.         asrs r0, r0, # 15
  256.         asrs r1, r1, # 15
  257.         adds r0, r0, r1
  258.         movs r1, # 1
  259.         pop {r1-r3,pc}
  260. _alpha_min_beta_max:
  261.         muls r0, r0, r3
  262.         muls r1, r1, r2
  263.         asrs r0, r0, # 15
  264.         asrs r1, r1, # 15
  265.         adds r0, r0, r1
  266.         movs r1, # 0
  267.         pop {r1-r3,pc}

  268. _lvboqi:
  269.                         @滤波器
  270.                         @R0=地址,R1=长度,r2=表指针地址,r3=ADC数值
  271.                         @出R0=结果
  272.         push {r1-r7,lr}       
  273.         ldr r5, [r2]                @读出表指针
  274.         lsls r6, r1, # 1       
  275.         strh r3, [r0, r5]        @数值写到滤波器缓冲区
  276.         adds r5, r5, # 2
  277.         cmp r5, r6
  278.         bne _lvboqimeidaohuanchongquding
  279.         movs r5, # 0
  280. _lvboqimeidaohuanchongquding:
  281.         str r5, [r2]
  282.         movs r7, # 0
  283. _lvboqixunhuan:
  284.         cmp r5, r6
  285.         bne _lvbozonghe
  286.         movs r5, # 0
  287. _lvbozonghe:
  288.         ldrh r4, [r0, r5]
  289.         adds r5, r5, # 2
  290.         adds r7, r7, r4
  291.         subs r1, r1, # 1
  292.         bne _lvboqixunhuan
  293.         asrs r0, r7, # 10        @修改
  294.         pop {r1-r7,pc}

  295.        
  296. _fftjisuan:
  297.                                 @ 入口 R0=数据地址
  298.                                 @ 输出实部=0X20000000-0X20000400
  299.                                 @ 输出虚部=0X20000400-0X20000800
  300.                                 @ 结果左移6位(乘64)
  301.         push {r0-r7,lr}
  302. _fft1:
  303.         ldr r1, = 0x20000000       @ 输出地址
  304.         movs r2, # 128             @ 蝴蝶数量
  305.         ldr r3, = hudieweifanzhuan @ 蝴蝶位反转表
  306. _fft1xunhuan:
  307.         ldr r6, [r3]               @ 取出位反转表里的地一个数据
  308.         ldr r7, [r3, # 0x04]       @ 取出第二个
  309.         ldr r6, [r0, r6]           @ 根据位反转表找到对应的输入数据  
  310.         ldr r7, [r0, r7]           @ 第二个
  311.         adds r4, r6, r7            @ 求出蝴蝶上
  312.         subs r5, r6, r7            @ 求出蝴蝶下
  313.         str r4, [r1]
  314.         str r5, [r1, # 0x04]       @ 把反过来的顺序排列
  315.         adds r1, r1, # 0x08        @ 输出的地址自增
  316.         adds r3, r3, # 0x08        @ 反转表自增
  317.         subs r2, r2, # 1           @ 蝴蝶数减1
  318.         bne _fft1xunhuan           @ 蝴蝶数不到

  319. _fft2:
  320.         ldr r0, = 0x20000000       @ 实部输出地址0x20000000
  321.         movs r4, # 1               
  322.         lsls r4, r4, # 10         
  323.         adds r4, r4, r0            @ 虚部输出地址 0x20000400
  324.         mov r8, r4                 @ 实部和虚部中间
  325. _fft2xunhuan:
  326.         ldr r4, [r0]               @ 取出数据0
  327.         ldr r5, [r0, # 0x08]       @ 取出数据2
  328.         ldr r6, [r0, # 0x04]       @ 取出数据1
  329.         ldr r7, [r0, # 0x0c]       @ 取出数据3
  330.         adds r1, r4, r5            @ 计算蝴蝶上
  331.         subs r2, r4, r5            @ 计算蝴蝶下
  332.         mov r3, r6                @ 0 r 蝴蝶上实部
  333.         movs r4, # 0
  334.         subs r4, r4, r7                @ 0i 蝴蝶上虚部
  335.         mov r5, r6                @ 3r 蝴蝶下实部
  336.         mov r6, r7                @ 3i 蝴蝶下虚部
  337.         movs r7, # 1
  338.         lsls r7, r7, # 10       @ 内存实部和虚部中间
  339.         adds r7, r7, r0         @ R7等于虚部首地址  
  340.         str r1, [r0]            @ 蝴蝶上保存实部
  341.         str r2, [r0, # 0x08]    @ 蝴蝶下实部
  342.         str r3, [r0, # 0x04]    @ 第二组蝴蝶上实部
  343.         str r4, [r7, # 0x04]    @ 第二组蝴蝶上虚部
  344.         str r5, [r0, # 0x0c]        @ 第二组蝴蝶下实部
  345.         str r6, [r7, # 0x0c]    @ 第二组下虚部
  346.         adds r0, r0, # 0x10     @ 蝴蝶组自增
  347.         cmp r0, r8     
  348.         bne _fft2xunhuan        @ 地址不到循环
  349. _fft3:
  350.         ldr r6, = xuanzhuanyinzi       @ 旋转因子自增变量
  351.         ldr r2, = fft3xuanzhuanyinzi   @ 旋转因子第三步的表
  352.         ldr r0, = 0x20000000           @ 实部输出地址
  353.         str r2, [r6]                   @ 旋转因子表首地址写到变量
  354.         movs r1, # 1
  355.         lsls r1, r1, # 10            
  356.         adds r1, r1, r0                @ 虚部输出地址
  357.         mov r8, r1                       @ R8虚部地址自增变量
  358.         mov r9, r0                     @ R9实部地址自增变量
  359.         mov r10, r2                       @ 旋转因子地址写到R10
  360.         movs r5, # 0x10                       @ 两组蝴蝶的距离       
  361.         mov r11, r5                    @ 写到R11
  362.         movs r5, # 4                   @ 旋转因子数量
  363.         mov r12, r5                       @ 旋转因子数量写到R12
  364.         bl _fftg

  365. _fft4:
  366.         ldr r6, = xuanzhuanyinzi        @ 旋转因子自增变量
  367.         ldr r2, = fft4xuanzhuanyinzi        @ 旋转因子第四步表
  368.         ldr r0, = 0x20000000                @ 实部地址
  369.         str r2, [r6]                        @ 第四步旋转因子表写到自增变量
  370.         movs r1, # 1
  371.         lsls r1, r1, # 10
  372.         adds r1, r1, r0                        @ r1 = 虚部地址
  373.         mov r8, r1                        @
  374.         mov r9, r0
  375.         mov r10, r2
  376.         movs r5, # 0x20
  377.         mov r11, r5
  378.         movs r5, # 8
  379.         mov r12, r5
  380.         bl _fftg


  381. _fft5:
  382.         ldr r6, = xuanzhuanyinzi
  383.         ldr r2, = fft5xuanzhuanyinzi
  384.         ldr r0, = 0x20000000
  385.         str r2, [r6]
  386.         movs r1, # 1
  387.         lsls r1, r1, # 10
  388.         adds r1, r1, r0
  389.         mov r8, r1
  390.         mov r9, r0
  391.         mov r10, r2
  392.         movs r5, # 0x40
  393.         mov r11, r5
  394.         movs r5, # 16
  395.         mov r12, r5
  396.         bl _fftg

  397. _fft6:
  398.         ldr r6, = xuanzhuanyinzi
  399.         ldr r2, = fft6xuanzhuanyinzi
  400.         ldr r0, = 0x20000000
  401.         str r2, [r6]
  402.         movs r1, # 1
  403.         lsls r1, r1, # 10
  404.         adds r1, r1, r0
  405.         mov r8, r1
  406.         mov r9, r0
  407.         mov r10, r2
  408.         movs r5, # 0x80
  409.         mov r11, r5
  410.         movs r5, # 32
  411.         mov r12, r5
  412.         bl _fftg
  413. _fft7:
  414.         ldr r6, = xuanzhuanyinzi
  415.         ldr r2, = fft7xuanzhuanyinzi
  416.         ldr r0, = 0x20000000
  417.         str r2, [r6]
  418.         movs r1, # 1
  419.         lsls r1, r1, # 10
  420.         adds r1, r1, r0
  421.         mov r8, r1
  422.         mov r9, r0
  423.         mov r10, r2
  424.         movs r5, # 1
  425.         lsls r5, r5, # 8
  426.         mov r11, r5
  427.         movs r5, # 64
  428.         mov r12, r5
  429.         bl _fftg

  430. _fft8:
  431.         ldr r6, = xuanzhuanyinzi
  432.         ldr r2, = fft8xuanzhuanyinzi
  433.         ldr r0, = 0x20000000
  434.         str r2, [r6]
  435.         movs r1, # 1
  436.         lsls r1, r1, # 10
  437.         adds r1, r1, r0
  438.         mov r8, r1
  439.         mov r9, r0
  440.         mov r10, r2
  441.         movs r5, # 1
  442.         lsls r5, r5, # 9
  443.         mov r11, r5
  444.         movs r5, # 128
  445.         mov r12, r5
  446.         bl _fftg
  447.         pop {r0-r7,pc}
  448. _fftg:
  449.         push {lr}                @ LR保存到堆栈
  450.         movs r4, # 0
  451.         mov lr, r4
  452. _fftxunhuan:
  453.         mov r0, r9                @ R0实部地址自增变量地址
  454.         mov r1, r8                @ R1虚部地址自增变量地址       
  455.         mov r2, r10                @ 旋转因子表地址地址
  456.         mov r3, r11                @ 两组蝴蝶的距离
  457.         ldr r4, [r0]                @ r4=蝴蝶上实部
  458.         ldr r5, [r1]                @ r5=蝴蝶上虚部
  459.         ldr r6, [r0, r3]        @ r6=蝴蝶下实部
  460.         ldr r7, [r1, r3]        @ r7=蝴蝶下虚部
  461.         ldr r3, [r2]                @ SR
  462.         ldr r2, [r2, # 0x04]        @ SI
  463.         push {r4,r5}                @ R4 R5保存到堆栈
  464.                                 @ (a+bi)(c+di)=(ac-bd)+(ad+bc)i
  465.         mov r4, r6                @ r4=蝴蝶下实部
  466.         muls r4, r4, r3                @ 乘旋转因子        ac
  467.         mov r5, r7                @ R5=蝴蝶下虚部
  468.         muls r5, r5, r2                @ 乘旋转因子        bd
  469.         subs r4, r4, r5                @ ac-bd
  470.         asrs r4, r4, # 15        @ 截断Q15
  471.         mov r5, r6
  472.         muls r5, r5, r2                @ ad
  473.         muls r7, r7, r3                @ bc
  474.         adds r7, r7, r5         @ ad+bc
  475.         asrs r7, r7, # 15        @ 截断Q15
  476.         pop {r2,r5}                @ R2= 蝴蝶上实部
  477.                                 @ r5= 蝴蝶上虚部
  478.         adds r3, r2, r4            @ 上实部加下实部=结果上实部
  479.         subs r2, r2, r4            @ 下实部减上实部=结果下实部
  480.         adds r4, r5, r7                @ 上虚部加下虚部=结果上虚部
  481.         subs r5, r5, r7                @ 上虚部减下虚部=结果下虚部
  482.         mov r6, r11                @ r6=蝴蝶距离
  483.         asrs r3, r3, # 1        @ 右移一位防止溢出
  484.         asrs r4, r4, # 1        @ 右移一位防止溢出
  485.         asrs r2, r2, # 1        @ 右移一位防止溢出
  486.         asrs r5, r5, # 1        @ 右移一位防止溢出
  487.         str r3, [r0]                @ 保存上实部
  488.         str r4, [r1]                @ 保存上虚部
  489.         str r2, [r0, r6]        @ 保存下实部
  490.         str r5, [r1, r6]        @ 保存下虚部
  491.         adds r0, r0, # 0x04        @ 实部地址加4
  492.         adds r1, r1, # 0x04        @ 虚部地址加4
  493.         mov r9, r0                @ r9=当前实部地址
  494.         mov r8, r1                @ R8=当前虚部地址
  495.         mov r2, r10                @ r2= 当前旋转因子地址
  496.         adds r2, r2, # 0x08        @ R2 = 旋转因子地址加8
  497.         mov r10, r2             @ 保存回去
  498.         mov r4, lr                @ 一个蝴蝶旋转因子变量
  499.         adds r4, r4, # 1        @ 自增
  500.         mov lr, r4                 @ 保存回去
  501.         mov r7, r12             @ 取出旋转因子总数量
  502.         cmp r4, r7              @ 到没到数量
  503.         bne _fftxunhuan         @ 没到继续循环
  504.         movs  r4, # 0                @ 到了R4=0
  505.         mov lr, r4                @ 一个蝴蝶旋转因子变量清0
  506.         ldr r6, = xuanzhuanyinzi @ R6=旋转因子自增变量地址       
  507.         ldr r5, = 0x20000400         @ R5=虚部地址
  508.         ldr r6, [r6]                 @ 取出旋转因子自增变量
  509.         mov r7, r11                @ R7= 蝴蝶距离
  510.         mov r10, r6              @ R10 = 旋转因子自增变量
  511.         adds r0, r0, r7                @ 实部地址加蝴蝶距离
  512.         adds r1, r1, r7                @ 虚部地址加蝴蝶距离
  513.         mov r9, r0                @ R9等于当前实部地址
  514.         mov r8, r1                @ R8等于当前虚部地址
  515.         cmp r0, r5                @ 实部到没到虚部边界
  516.         bne _fftxunhuan                @ 没到循环计算
  517.         pop {pc}                @ 返回
  518.         .ltorg                        @ 文字池
  519.        
  520. _nmi_handler:
  521.         bx lr
  522. _hard_fault:
  523.         bx lr
  524. _svc_handler:
  525.         bx lr
  526. _pendsv_handler:
  527.         bx lr
  528. _systickzhongduan:
  529.         ldr r0, = 0xe000ed04
  530.         movs r1, # 1
  531.         lsls r1, r1, # 25
  532.         str r1, [r0]                 @ 清除SYSTICK中断
  533. aaa:
  534.         bx lr
复制代码



评分

2

查看全部评分

     
 楼主| 发表于 2019-6-24 13:17:43 | 显示全部楼层
本帖最后由 yjmwxwx 于 2019-6-24 13:58 编辑

256点,滤波器里面右移了10位忘记修改,因该移8位 ,下面的改过来了。

软件计算的单次,数码管显示的是256次计算结果的平均

mpv-shot0002.jpg


adcfft2.tar.gz (31.92 KB, 下载次数: 78)
回复 支持 反对

使用道具 举报

     
发表于 2019-6-24 13:38:17 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

     
发表于 2019-6-24 13:58:01 | 显示全部楼层
对非正弦波的采样计算效果怎么样?
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-6-24 14:03:06 | 显示全部楼层
岑蓉络阳 发表于 2019-6-24 13:58
对非正弦波的采样计算效果怎么样?


还没试过,应该和电脑上计算的差不太多,计算方法都是一样的。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-6-24 14:04:30 | 显示全部楼层


人家专业的搞这个很容易,我这个就是参照书上算法写的。
回复 支持 反对

使用道具 举报

     
发表于 2019-6-24 15:48:51 | 显示全部楼层
全汇编程序,厉害了
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-6-24 16:56:04 | 显示全部楼层
spiral_wave 发表于 2019-6-24 15:48
全汇编程序,厉害了


语言都一样的,只要知道怎么算就容易写了。

下面这个里面有FFT详细计算的步骤,可以看到每一步怎么算的。

FFT.tar.gz (17.54 KB, 下载次数: 140)


截图_2019-06-23_13-14-46.png

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-6-24 18:03:43 | 显示全部楼层
yjmwxwx 发表于 2019-6-24 13:17
256点,滤波器里面右移了10位忘记修改,因该移8位 ,下面的改过来了。

软件计算的单次,数码管显示的是2 ...

2楼传错了,那个是固定的数据计算的,下面这个是实时计算的

adcfft2.tar.gz (29.07 KB, 下载次数: 93)
回复 支持 反对

使用道具 举报

     
发表于 2019-6-24 19:17:42 | 显示全部楼层
stm32汇编 可以用C实现 。汇编 更厉害了,有C版本的么,比较 下效率。
回复 支持 反对

使用道具 举报

     
发表于 2019-6-24 21:46:33 | 显示全部楼层
yjmwxwx 发表于 2019-6-24 14:03
还没试过,应该和电脑上计算的差不太多,计算方法都是一样的。

要检验效果怎么样,可以用一个已知的非正弦波,例如锯齿波,做一个高次谐波的幅度和相角分析,然后写一个程序,把那些分析出来的各高次谐波的幅度和相角按照时间轴叠加起来,看是否还会变回到原来的波形,或者是非常接近的波形(函数)。
还有的就是,你的程序里能否留下一两个可修改参数的端口,用来输入采样频率,以适应不同频率(周期)的信号处理的需要。二是输入分析到高次谐波的最高次数。原则上说,所得到的次数越高,就越精确。但是计算工作量也随着采样频率的增加以及分析次数的增大而增加的,或者带来速度也随着下降。
回复 支持 反对

使用道具 举报

     
发表于 2019-6-24 22:13:58 | 显示全部楼层
yjmwxwx 发表于 2019-6-24 18:03
2楼传错了,那个是固定的数据计算的,下面这个是实时计算的

写软件这么溜可否考虑下合作开发做个VFD频谱  
https://item.taobao.com/item.htm ... amp;id=563113013993
TB2ysEYczgy_uJjSZLeXXaPlFXa_!!72580441.jpg
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-6-25 07:18:38 | 显示全部楼层
jysl 发表于 2019-6-24 19:17
stm32汇编 可以用C实现 。汇编 更厉害了,有C版本的么,比较 下效率。


        学51时候学过C但是没怎么用忘的差不多了,我这个是radix-2,STM32F030F4P6时钟48M,测了下Q15计算256点FFT需要 1.6毫秒。




回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-6-25 07:35:00 | 显示全部楼层
岑蓉络阳 发表于 2019-6-24 21:46
要检验效果怎么样,可以用一个已知的非正弦波,例如锯齿波,做一个高次谐波的幅度和相角分析,然后写一个 ...


还没学怎么计算相位角,初中数学都没学过,要现学。

可以用定时器触发控制采样率,但是暂时用不到,我都是直接修改程序。

这单片机就4K RAM,虽然速度快但是储存空间比较小,只能计算点数比较少的。



我这个正弦波不纯,只有36点是PWM生成的,从表里可以看出来几乎没有0的数据。

软件生成个干净的三角波试验下

截图_2019-06-25_07-04-46.png

可以看到非常干净很多都是0

截图_2019-06-25_07-05-20.png

单片机计算的实部和虚部

截图_2019-06-25_07-06-10.png

截图_2019-06-25_07-06-48.png

对比下第八个,地址实部0X20000020= -1792,虚部0x20000420= -384 差的不是太多




回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-6-25 07:38:41 | 显示全部楼层
ylyfxzsx 发表于 2019-6-24 22:13
写软件这么溜可否考虑下合作开发做个VFD频谱   
https://item.taobao.com/item.htm?spm ...


        我写这个没什么用的,就是自己玩,根本就是个不成熟的程序,官方有DSP库那个比较好,而我还不会用那个库,我是业余的不是专业的,专业电子工程师会用官方那个库,用官方库做比较好。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

蒙公网安备 15040402000005号

GMT+8, 2024-5-10 20:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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