【正点原子STM32连载】 第五十七章 DSP FFT实验(Julia分形)实验 摘自【正点原子】APM32F407最小系统板使用指南

1)实验平台:正点原子stm32f103战舰开发板V4
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html##

第五十七章 DSP FFT实验

本章将使用DSP进行快速傅里叶变换(FFT)的运算测试。通过本章的学习,读者将学习到DSP库中FFT运算的简单应用。
本章分为如下几个章节:
57.1 硬件设计
57.2 程序设计
57.3 下载验证

57.1 硬件设计
57.1.1 例程功能

  1. 按下KEY0按键进行FFT计算测试,LCD显示计算耗时,USART输出计算耗时和计算结果
  2. LED0闪烁,指示程序正在运行
    57.1.2 硬件资源
  3. LED
    LED0 - PF9
  4. 按键
    KEY0 - PE4
  5. USART1(PA9、PA10连接至板载USB转串口芯片上)
  6. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
  7. FPU(可选,使用后相关的计算耗时更少)
  8. 基本定时器6
    57.1.3 原理图
    本章使用的DSP库为软件库,因此没有对应的连接原理图。
    57.2 程序设计
    57.2.1 实验应用代码
    本章实验的应用代码,如下所示:
int main(void)
{/* 必要初始化,代码省略 */while (1){key = key_scan(0);switch (key){case KEY0_PRES:{/* 初始化FFT测试 */fft_test_init(fft_inputbuf, FFT_LENGTH);TMR_ConfigCounter(BTMR_TMRX_INT, 0);g_timeout = 0;/* FFT计算测试 */fft_test(fft_inputbuf);time = TMR_ReadCounter(BTMR_TMRX_INT) + g_timeout * 0x10000;sprintf(buf, "%0.1fms\r\n", (float)time / 10);lcd_show_string(30 + 12 * 8, 160, 100, 16, 16, buf, BLUE);/* 对FFT运算结果取模求得幅值 */fft_test_get_output(fft_inputbuf, fft_outputbuf, FFT_LENGTH);printf("\r\n%d point FFT runtime:%0.1fms\r\n",FFT_LENGTH, (float)time / 10);printf("FFT Result:\r\n");for (i=0; i<FFT_LENGTH; i++){printf("fft_outputbuf[%d]:%f\r\n", i, fft_outputbuf[i]);}break;}default:{break;}}/* 省略其他代码 */}
}

从上面的代码中可以看出,在检测到KEY0按键被按下后,便会调用函数fft_test_init()以及相关函数对FFT运算测试进行初始化准备,随后调用函数fft_test()进行FFT运算测试,同时使用定时器统计运算耗时,最后调用函数fft_test_get_output()对FFT的运算结果取模,然后在串口调试助手上显示最终的结果。
以上提到的函数fft_test_init()、函数fft_test()和函数fft_test_get_output(),如下所示:

static arm_cfft_radix4_instance_f32 scfft;/*** @brief	初始化FFT测试* @param	fft_inputbuf: FFT输入数组* @retval	fft_length: FFT长度*/
void fft_test_init(float *fft_inputbuf, uint16_t fft_length)
{uint16_t i;arm_cfft_radix4_init_f32(&scfft, fft_length, 0, 1);/* 生成信号序列 */for (i=0; i<fft_length; i++){fft_inputbuf[2 * i] = 	100 +									/* 实部 */10 * arm_sin_f32(2 * PI * i / fft_length) +30 * arm_sin_f32(2 * PI * i * 4 / fft_length) +50 * arm_cos_f32(2 * PI * i * 8 / fft_length);fft_inputbuf[2 * i + 1] = 0;									/* 虚部 */}
}/*** @brief	FFT计算测试* @param	fft_inputbuf: FFT输入数组* @retval	无*/
void fft_test(float *fft_inputbuf)
{arm_cfft_radix4_f32(&scfft, fft_inputbuf);
}/*** @brie	f对FFT计算测试结果取模求得幅值* @param	fft_inputbuf: FFT输入数组* @param	fft_outputbuf: FFT输出数组* @retval	fft_length: FFT长度* @retval	无*/
void fft_test_get_output(	float *fft_inputbuf,float *fft_outputbuf,uint16_t fft_length)
{arm_cmplx_mag_f32(fft_inputbuf, fft_outputbuf, fft_length);
}

可以看到,这三个函数实际上是对DSP库中函数的简单封装,本质还是调用了DSP库中的函数。但是可以看到,在使用了DSP库后,进行FFT运算变得十分简便,这非常有利于缩短应用开发周期。
57.3 下载验证
在完成编译和烧录操作后,可以看到LCD上显示了本实验的相关信息,此时若按下KEY0按键进行FFT运算测试,测可以看到,在FFT运算结束后,LCD上显示了本次FFT运算的耗时时长,同时串口调试助手上也显示了本次FFT运算结果取模后的结果值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/159568.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot_项目重启问题

问题描述 在做一个文件上传功能的时候&#xff0c;我获取到类路径&#xff1a; String classPath ClassUtils.getDefaultClassLoader().getResource("").getPath();此方法获取到的路径是&#xff1a;/target/classes我将文件存储到/target/classes/template/中 此…

递归结构体数组链表实现

#ifndef _MODEL_SCHEDULE_H_ #define _MODEL_SCHEDULE_H_#define MODEL_SCHEDULE_IDLE 0x00000000 #define MODEL_SCHEDULE_OCCUPY 0x5A555A55#define MODEL_SCHEDULE_NUM 10typedef struct model_schedule_linked_list_unit {int idleFlag; //资源是否被占用vo…

文心一言 VS 讯飞星火 VS chatgpt (140)-- 算法导论11.4 5题

五、用go语言&#xff0c;考虑一个装载因子为a的开放寻址散列表。找出一个非零的a值&#xff0c;使得一次不成功查找的探查期望数是一次成功查找的探查期望数的 2 倍。这两个探查期望数可以使用定理11.6 和定理 11.8 中给定的上界。 文心一言&#xff0c;代码正常运行&#xf…

springboot宠物领养系统-计算机毕设 附源码 44261

springboot宠物领养系统 摘 要 网络发布信息有其突出的优点&#xff0c;即信息量大&#xff0c;资源丰富&#xff0c;更新速度快等&#xff0c;很符合人们希望以捷、便利的方式获得最多最有效信息的要求。本系统就是一个网上宠物领养系统&#xff0c;为宠物爱好者提供一个信息…

pyqt5 窗口调用网页高德地图kpi,进行实时地图导航

作为主项目功能的一部分&#xff0c;这部分我想单独记录下来 一&#xff0c;注册高德kpi【进行实名认证】 高德开放平台 | 高德地图API (amap.com) 二&#xff0c;申请Key 三&#xff0c;进入路径规划-API文档-开发指南-Web服务 API|高德地图API (amap.com) 找到你需要的路径…

【必读】从零开始,一步步教你安装nginx,搭建个人博客网站!

nginx搭建个人网站 Nginx是一款轻量级Web服务器、反向代理服务器以及电子邮件代理服务器&#xff0c;并且具有高并发连接处理能力和低内存消耗的特点。它也可以用于负载均衡和缓存控制等功能。 功能&#xff1a; 静态网站服务器&#xff1a;Nginx可以用来作为静态网站服务器&am…

员工微信私下收红包,企业如何加强监管

随着智能手机的普及和社交软件的兴起&#xff0c;越来越多的企业和员工开始使用微信等社交应用程序进行日常工作交流和业务协作。然而&#xff0c;与此同时&#xff0c;一些行业的员工在微信上私下收取红包的问题也日益严重&#xff0c;这不仅违反了公司的规定&#xff0c;也损…

Kubernetes+Gitlab+Jenkins+ArgoCD多集群部署

KubernetesGitlabJenkinsArgoCD多集群部署 文章目录 KubernetesGitlabJenkinsArgoCD多集群部署1. KubernetesGitlabJenkinsArgoCD多集群部署2. 添加WebHooks自动触发3. Jenkins-构建-执行Shell4. 制作镜像及修改Yaml文件4.1 Dockerfile4.2 Build-Shell 5.自动部署Demo测试5.1 推…

JSP EL表达式基本使用

今天我们来说EL表达式 这在整个jsp中都是非常重要的一章 因为 如果我们用 <%属性%> 属性为空时 直接就是个 null 这个肯定是不能让用户看到的东西 所以 我们就需要EL表达式 例如 我们jsp代码编写如下 <% page contentType"text/html; charsetUTF-8" page…

LeetCode每日一题(双指针)

最大连续1的个数Ⅲ 使用双指针每次当0的个数达到k&#xff0c;开始反转&#xff0c;返回最大。 class Solution {public int longestOnes(int[] nums, int k) {int ans-1;for(int i0,j0,cnt0;i< nums.length;i){if(nums[i]0)cnt;while(cnt>k){if(nums[j]0)cnt--;j;}ans…

React函数组件渲染两次

渲染两次是因为react默认开启了严格模式 React.StrictMode标签作用&#xff1a; 1、识别不安全的生命周期 2、关于使用过时字符串 ref API 的警告 3、关于使用废弃的 findDOMNode 方法的警告 4、检测意外的副作用 5、检测过时的 context API 注释掉React.StrictMode即为关闭严…

【Windows 常用工具系列 12 -- win11怎么设置不睡眠熄屏 |win11设置永不睡眠的方法】

文章目录 win11 怎么设置不睡眠熄屏 使用笔记本电脑的时候&#xff0c;如果离开电脑时间稍微长一点就会发现息屏了&#xff0c;下面介绍 设置 Win11 永不睡眠息屏的方法&#xff0c;有需要的朋友们快来看看以下详细的教程。 win11 怎么设置不睡眠熄屏 在电脑桌面上&#xff0c…

最快的ebpf开发环境搭建方式

环境搭建 启动容器 sudo docker run --rm -it --privileged \-v /lib/modules:/lib/modules:ro \-v /sys:/sys:ro \-v /usr/src:/usr/src:ro \alpine:3.12 安装依赖 sed -i s/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g /etc/apk/repositoriesapk add bcc-too…

微信怎么设置自动回复?

自动回复的用处 微信自动回复可以提高沟通效率。当你无法立即回复消息时&#xff0c;设置自动回复可以让对方知道你的情况&#xff0c;并且不会因为长时间没有回复而产生误解或不满。 微信自动回复可以节省时间和精力。如果你经常收到类似的询问或回复&#xff0c;通过设置自动…

STM32CubeMX学习笔记(2)--DSP库的使用

1.DSP库简介 STM32的DSP库是为了支持数字信号处理应用而设计的&#xff0c;它包含了一系列优化的数学函数和算法&#xff0c;能够在STM32微控制器上高效地执行数字信号处理任务。 DSP库通常包括以下主要特性&#xff1a; 1.数学函数库&#xff1a; 包括各种基本的数学运算函数…

JS 循环JSON将数据遍历到Table里面

在研发过程中&#xff0c;我们有时候需要在页面弹出框中展示表格数据&#xff0c;这就需要将JSON数据循环&#xff0c;遍历到一个Table里面&#xff0c;具体代码如下&#xff1a; JS&#xff1a; function LoadFun() {$("#detail").html("");var html &q…

LinkedBlockingQueue的drainTo方法

LinkedBlockingQueue是Java中的一个阻塞队列实现&#xff0c;它支持多线程并发操作。drainTo方法是LinkedBlockingQueue提供的一个方法&#xff0c;用于将队列中的元素转移到另一个集合中。 drainTo方法有两个重载方法&#xff0c;分别为&#xff1a; 1. drainTo(Collection&…

Python语言:猜数字游戏案例讲解

猜数字游戏题目要求如下&#xff1a;该程序随机生成一个1到100之间的整数&#xff0c;然后要求玩家在有限的次数内猜出这个数字。如果玩家猜对了&#xff0c;游戏结束并显示成功信息&#xff1b;如果玩家猜错了&#xff0c;程序会提示玩家猜的数字是偏大还是偏小&#xff0c;并…

Django(ORM事务操作|ORM常见字段类型|ORM常见字段参数|关系字段|Meta元信息)

文章目录 ORM事务操作什么是事务&#xff1f;事务的产生事务的四大特征ORM中如何使用事务 ORM字段类型常用字段与不常用字段类型ORM还支持用户自定义字段类型 ORM字段参数关系字段ForeignKey外键on_delete参数设置的值 OneToOneField与ForeignKey的区别多对多关系建立的方式ORM…

O2OA(翱途)开发平台 V8.2已发布,更安全、更高效、更开放

尊敬的 O2OA (翱途) 平台合作伙伴、用户以及亲爱的开发小伙伴们&#xff0c;V8.2 版本已正式发布&#xff0c;大家可以去官网上下载最新版本。 上次 8.1 的发布是在 9 月 1 日&#xff0c;又过去两个多月&#xff0c;O2OA 研发团队始终踏踏实实地做好产品的研发及优化工作&…