_jisuanfudu:        [url=home.php?mod=space&uid=72445]@[/url] 计算幅度

[url=home.php?mod=space&uid=72445]@[/url] 入r0= 实部,r1= 虚部

@ 出r0 = 幅度

@ Mag ~=Alpha * max(|I|, |Q|) + Beta * min(|I|, |Q|)

@ Alpha * Max + Beta * Min

push {r1-r3,lr}

movs r0, r0

bpl _shibubushifushu

mvns r0, r0                                @ 是负数转成正数

adds r0, r0, # 1

_shibubushifushu:                                @ 实部不是负数

movs r1, r1

bpl _xububushifushu

mvns r1, r1                                @ 是负数转成正数

adds r1, r1, # 1

_xububushifushu:                                @ 虚部不是负数

cmp r0, # 0

bne _panduanxubushibushi0

mov r0, r1

pop {r1-r3,pc}

_panduanxubushibushi0:

cmp r1, # 0

bne _jisuanfudu1

pop {r1-r3,pc}

_jisuanfudu1:

ldr r2, = 31066                @ Alpha q15 0.948059448969

ldr r3, = 12867                @ Beta q15 0.392699081699

cmp r1, r0

bhi _alpha_min_beta_max

_alpha_max_beta_min:

muls r0, r0, r2

muls r1, r1, r3

asrs r0, r0, # 15

asrs r1, r1, # 15

adds r0, r0, r1

movs r1, # 1

pop {r1-r3,pc}

_alpha_min_beta_max:

muls r0, r0, r3

muls r1, r1, r2

asrs r0, r0, # 15

asrs r1, r1, # 15

adds r0, r0, r1

movs r1, # 0

pop {r1-r3,pc}

_lvboqi:

@滤波器

@R0=地址,R1=长度,r2=表指针地址,r3=ADC数值

@出R0=结果

push {r1-r7,lr}

ldr r5, [r2]                @读出表指针

lsls r6, r1, # 1

strh r3, [r0, r5]        @数值写到滤波器缓冲区

adds r5, r5, # 2

cmp r5, r6

bne _lvboqimeidaohuanchongquding

movs r5, # 0

_lvboqimeidaohuanchongquding:

str r5, [r2]

movs r7, # 0

_lvboqixunhuan:

cmp r5, r6

bne _lvbozonghe

movs r5, # 0

_lvbozonghe:

ldrh r4, [r0, r5]

adds r5, r5, # 2

adds r7, r7, r4

subs r1, r1, # 1

bne _lvboqixunhuan

asrs r0, r7, # 10        @修改

pop {r1-r7,pc}

_fftjisuan:

@ 入口 R0=数据地址

@ 输出实部=0X20000000-0X20000400

@ 输出虚部=0X20000400-0X20000800

@ 结果左移6位(乘64)

push {r0-r7,lr}

_fft1:

ldr r1, = 0x20000000       @ 输出地址

movs r2, # 128             @ 蝴蝶数量

ldr r3, = hudieweifanzhuan @ 蝴蝶位反转表

_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           @ 蝴蝶数减1

bne _fft1xunhuan           @ 蝴蝶数不到

_fft2:

ldr r0, = 0x20000000       @ 实部输出地址0x20000000

movs r4, # 1

lsls r4, r4, # 10

adds r4, r4, r0            @ 虚部输出地址 0x20000400

mov r8, r4                 @ 实部和虚部中间

_fft2xunhuan:

ldr r4, [r0]               @ 取出数据0

ldr r5, [r0, # 0x08]       @ 取出数据2

ldr r6, [r0, # 0x04]       @ 取出数据1

ldr r7, [r0, # 0x0c]       @ 取出数据3

adds r1, r4, r5            @ 计算蝴蝶上

subs r2, r4, r5            @ 计算蝴蝶下

mov r3, r6                @ 0 r 蝴蝶上实部

movs r4, # 0

subs r4, r4, r7                @ 0i 蝴蝶上虚部

mov r5, r6                @ 3r 蝴蝶下实部

mov r6, r7                @ 3i 蝴蝶下虚部

movs r7, # 1

lsls r7, r7, # 10       @ 内存实部和虚部中间

adds r7, r7, r0         @ R7等于虚部首地址

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, # 1

lsls r1, r1, # 10

adds r1, r1, r0                @ 虚部输出地址

mov r8, r1                       @ R8虚部地址自增变量

mov r9, r0                     @ R9实部地址自增变量

mov r10, r2                       @ 旋转因子地址写到R10

movs r5, # 0x10                       @ 两组蝴蝶的距离

mov r11, r5                    @ 写到R11

movs r5, # 4                   @ 旋转因子数量

mov r12, r5                       @ 旋转因子数量写到R12

bl _fftg

_fft4:

ldr r6, = xuanzhuanyinzi        @ 旋转因子自增变量

ldr r2, = fft4xuanzhuanyinzi        @ 旋转因子第四步表

ldr r0, = 0x20000000                @ 实部地址

str r2, [r6]                        @ 第四步旋转因子表写到自增变量

movs r1, # 1

lsls r1, r1, # 10

adds r1, r1, r0                        @ r1 = 虚部地址

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, # 1

lsls r1, r1, # 10

adds r1, r1, r0

mov r8, r1

mov r9, r0

mov r10, r2

movs r5, # 0x40

mov r11, r5

movs r5, # 16

mov r12, r5

bl _fftg

_fft6:

ldr r6, = xuanzhuanyinzi

ldr r2, = fft6xuanzhuanyinzi

ldr r0, = 0x20000000

str r2, [r6]

movs r1, # 1

lsls r1, r1, # 10

adds r1, r1, r0

mov r8, r1

mov r9, r0

mov r10, r2

movs r5, # 0x80

mov r11, r5

movs r5, # 32

mov r12, r5

bl _fftg

_fft7:

ldr r6, = xuanzhuanyinzi

ldr r2, = fft7xuanzhuanyinzi

ldr r0, = 0x20000000

str r2, [r6]

movs r1, # 1

lsls r1, r1, # 10

adds r1, r1, r0

mov r8, r1

mov r9, r0

mov r10, r2

movs r5, # 1

lsls r5, r5, # 8

mov r11, r5

movs r5, # 64

mov r12, r5

bl _fftg

_fft8:

ldr r6, = xuanzhuanyinzi

ldr r2, = fft8xuanzhuanyinzi

ldr r0, = 0x20000000

str r2, [r6]

movs r1, # 1

lsls r1, r1, # 10

adds r1, r1, r0

mov r8, r1

mov r9, r0

mov r10, r2

movs r5, # 1

lsls r5, r5, # 9

mov r11, r5

movs r5, # 128

mov r12, r5

bl _fftg

pop {r0-r7,pc}

_fftg:

push {lr}                @ LR保存到堆栈

movs r4, # 0

mov lr, r4

_fftxunhuan:

mov r0, r9                @ R0实部地址自增变量地址

mov r1, r8                @ R1虚部地址自增变量地址

mov r2, r10                @ 旋转因子表地址地址

mov r3, r11                @ 两组蝴蝶的距离

ldr r4, [r0]                @ r4=蝴蝶上实部

ldr r5, [r1]                @ r5=蝴蝶上虚部

ldr r6, [r0, r3]        @ r6=蝴蝶下实部

ldr r7, [r1, r3]        @ r7=蝴蝶下虚部

ldr r3, [r2]                @ SR

ldr r2, [r2, # 0x04]        @ SI

push {r4,r5}                @ R4 R5保存到堆栈

@ (a+bi)(c+di)=(ac-bd)+(ad+bc)i

mov r4, r6                @ r4=蝴蝶下实部

muls r4, r4, r3                @ 乘旋转因子        ac

mov r5, r7                @ R5=蝴蝶下虚部

muls r5, r5, r2                @ 乘旋转因子        bd

subs r4, r4, r5                @ ac-bd

asrs r4, r4, # 15        @ 截断Q15

mov r5, r6

muls r5, r5, r2                @ ad

muls r7, r7, r3                @ bc

adds r7, r7, r5         @ ad+bc

asrs r7, r7, # 15        @ 截断Q15

pop {r2,r5}                @ R2= 蝴蝶上实部

@ r5= 蝴蝶上虚部

adds r3, r2, r4            @ 上实部加下实部=结果上实部

subs r2, r2, r4            @ 下实部减上实部=结果下实部

adds r4, r5, r7                @ 上虚部加下虚部=结果上虚部

subs r5, r5, r7                @ 上虚部减下虚部=结果下虚部

mov r6, r11                @ r6=蝴蝶距离

asrs r3, r3, # 1        @ 右移一位防止溢出

asrs r4, r4, # 1        @ 右移一位防止溢出

asrs r2, r2, # 1        @ 右移一位防止溢出

asrs r5, r5, # 1        @ 右移一位防止溢出

str r3, [r0]                @ 保存上实部

str r4, [r1]                @ 保存上虚部

str r2, [r0, r6]        @ 保存下实部

str r5, [r1, r6]        @ 保存下虚部

adds r0, r0, # 0x04        @ 实部地址加4

adds r1, r1, # 0x04        @ 虚部地址加4

mov r9, r0                @ r9=当前实部地址

mov r8, r1                @ R8=当前虚部地址

mov r2, r10                @ r2= 当前旋转因子地址

adds r2, r2, # 0x08        @ R2 = 旋转因子地址加8

mov r10, r2             @ 保存回去

mov r4, lr                @ 一个蝴蝶旋转因子变量

adds r4, r4, # 1        @ 自增

mov lr, r4                 @ 保存回去

mov r7, r12             @ 取出旋转因子总数量

cmp r4, r7              @ 到没到数量

bne _fftxunhuan         @ 没到继续循环

movs  r4, # 0                @ 到了R4=0

mov lr, r4                @ 一个蝴蝶旋转因子变量清0

ldr r6, = xuanzhuanyinzi @ R6=旋转因子自增变量地址

ldr r5, = 0x20000400         @ R5=虚部地址

ldr r6, [r6]                 @ 取出旋转因子自增变量

mov r7, r11                @ R7= 蝴蝶距离

mov r10, r6              @ R10 = 旋转因子自增变量

adds r0, r0, r7                @ 实部地址加蝴蝶距离

adds r1, r1, r7                @ 虚部地址加蝴蝶距离

mov r9, r0                @ R9等于当前实部地址

mov r8, r1                @ R8等于当前虚部地址

cmp r0, r5                @ 实部到没到虚部边界

bne _fftxunhuan                @ 没到循环计算

pop {pc}                @ 返回

.ltorg                        @ 文字池

单片机c语言fft函数,单片机ADC采样FFT计算试验相关推荐

  1. 51单片机c语言编程函数,单片机C语言教程:C51函数

    其实一直出现在例子中的 main()也算是一个函数,只不过它比较特殊,编译时以它做为程序的开始段.有了函数C 语言就有了模块化的优点,一般功能较多的程序,会在编写程序时把每项单独的功能分成数个子程序模 ...

  2. 51c语言延时作用,51单片机C语言延时函数怎么定义和使用

    描述 51单片机C语言延时函数怎么定义 C语言定义延时函数主要通过无意义指令的执行来达到延时的目的.C程序中可使用不同类型的变量来进行延时设计.经实验测试,使用unsigned char类型具有比un ...

  3. STC单片机LCD1602四线驱动模式显示ADC采样电压和温度

    STC单片机LCD1602四线驱动模式显示ADC采样电压和温度

  4. R语言sample函数数据对象采样实战

    R语言sample函数数据对象采样实战 目录 R语言sample函数数据对象采样实战 #基本语法 #仿真数据

  5. 单片机c语言编程下载,单片机C语言编程.doc

    单片机C语言编程.doc 单片机C语言编程指令格式 功能简述 字节数 周期 一.数据传送类指令 MOV A, Rn 寄存器送累加器 1 1 MOV Rn,A 累加器送寄存器 1 1 MOV A ,Ri ...

  6. 单片机c语言调用函数费时,下头函数,只要被调用就会导致单片机死机,请大家帮忙分析...

    当前位置:我的异常网» C语言 » 下头函数,只要被调用就会导致单片机死机,请大家帮 下头函数,只要被调用就会导致单片机死机,请大家帮忙分析 www.myexceptions.net  网友分享于:2 ...

  7. 单片机c语言条件语句,单片机c语言教程:C51复合语句和条件语句

    曾经在BBS上有朋友问过我{}是什么意思?什么作用?在  C  中是有不少的括号,如{},[],()等,确实会让一些初入门的朋友不解.在 VB 等一些语言中同一个()号会有不一样的 作用,它能用于组合 ...

  8. 单片机C语言仿真图,单片机C语言程序设计代码和仿真图.doc

    word完美格式 精心整理 学习帮手 <单片机C语言程序设计实训100例-基于8051+Proteus仿真>案例 第 01 篇 基础程序设计 01闪烁的LED /* 名称:闪烁的LED 说 ...

  9. 51单片机c语言程序控制,51单片机C语言程序设计源代码

    <51单片机C语言程序设计源代码>由会员分享,可在线阅读,更多相关<51单片机C语言程序设计源代码(281页珍藏版)>请在人人文库网上搜索. 1.51 SCM c语言教程示例2 ...

  10. 单片机c语言设计数据,单片机C语言设计.doc

    单片机C语言设计 第5章 单片机C语言程序设计 C-51的特点 C语言作为一种非常方便的语言而得到广泛的支持,很多硬件开发都用C语言编程,如:各种单片机.DSP.ARM等. C语言程序本身不依赖于机器 ...

最新文章

  1. 计算机网络谢希仁第七版课后答案第三章 数据链路层
  2. mysql单列索引和多列索引_mysql 单列索引与多列索引
  3. qemu模拟armlinux执行目标文件系统的可执行文件
  4. 编写原生的Node.js模块
  5. mysql5.7 hibenate5.1_5.7 Spring与Hibernate整合应用
  6. HBase之HRegionServer处理put请求
  7. go-基础知识二-数据类型-变量
  8. 用ng-view创建单页APP
  9. 程序员面对分歧和难题应当具备的态度
  10. js 对象中属性的来源
  11. BizTalk database lookup funcatoid DbConnectionString 设定问题有解了
  12. Oracle函数写法和举例
  13. greensock下载_面向初学者的GreenSock(第2部分):GSAP的时间表
  14. 专科程序员,学历可能会成为发展障碍
  15. linux node安装菜鸟教程,手把手告诉你如何安装多个版本的node
  16. php批量发邮件,使用phpmailer发送批量邮件
  17. 【转载】ANSYS 动力分析 (9) - 瞬态动力分析 (1)
  18. 上周四的复盘 | 市场回暖了?割肉吗?
  19. 软件自动化测试框架STAF
  20. Jenkins节点添加采用agent出错解决方案-not reachable

热门文章

  1. 【April Fools Day Contest 2014F】【愚人节脑洞 OEIS大法】000001 输出序列某一项
  2. hadoop大数据架构
  3. python数据结构之匿名函数lambda
  4. Weblogic的下载、安装、使用
  5. Selenium2+python自动化6-八种元素元素定位(Firebug和firepath)
  6. android 5.1声道,加入5.1声道音效非常强大_三星 I699(GALAXY Trend/电信版)_手机Android频道-中关村在线...
  7. Unity美术字体教程--BMFont美术字体的制作流程以及在unity中美术字体的生成
  8. 如何用VsCode进行Debug
  9. 基于MATLAB BP神经网络的数字图像识别
  10. telnet php,使用php实现telnet功能