基于STM32的LCD信号波形和FFT频谱显示

news2025/7/18 19:51:41

一、项目准备

主要利用LCD驱动中的画点和画连线函数,驱动是正点原子给我写好了的画点和画线的函数等些相关函数

void LCD_Draw_Circle(u16 x0,u16 y0,u8 r);						 			//画圆
void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2);							//画线

二、画波形图函数实现

a. matlab测试数据生成

i. 这里我们使用matlab生成的是一个正弦波+三角波的叠波,右边是对应的波形和频谱

ii. 这是叠波的数据(就是下面的测试数据)

float waveform[1000] = {
    -1.000000, -0.817209, -0.634667, -0.452619, -0.271310, -0.090983, 0.088125, 0.265779, 0.441754, 0.615827, 0.787785, 0.957424, 1.124547, 1.288969, 1.450513, 1.609017, 1.764328, 1.836307, 1.744827, 1.649776, 1.551057, 1.448583, 1.342287, 1.232115, 1.118027, 1.000000, 0.878027, 0.752115, 0.622287, 0.488583, 0.351057, 0.209776, 0.064827, -0.083693, -0.075672, 0.009017, 0.090513, 0.168969, 0.244547, 0.317424, 0.387785, 0.455827, 0.521754, 0.585779, 0.648125, 0.709017, 0.768690, 0.827381, 0.885333, 0.942791, 1.000000, -0.817209, -0.634667, ...
};

b. 波形绘制

i. 使用stm32生成一个正弦波进行点画波形测试,参数介绍如下:

x_start: 绘制正弦波形的起始横坐标(屏幕上的左边界)。即正弦波起始位置。

y_center: 正弦波形的垂直中心位置。波形会围绕该值上下波动。

width: 绘制正弦波形的总横向宽度(像素数)。

amplitude: 正弦波的振幅,即波形的最大垂直偏移量。

cycles: 正弦波的周期数,决定波形的波动次数。

//使用点方式画波形(stm32生成正弦波)
void LCD_Draw_SineWave(u16 x_start, u16 y_center, u16 width, u16 amplitude, float cycles)
{
	u16 i;
	float angle;
	float y;
	u16 y_draw ;
    float angle_step = 2 * 3.1415926f * cycles / width;
    for ( i = 0; i < width; i++)
    {
         angle = i * angle_step;
         y = sinf(angle);  // 正弦值范围 -1 到 1
         y_draw = y_center - (s16)(y * amplitude);  // 映射到屏幕坐标(注意方向)
        LCD_DrawPoint(x_start + i, y_draw);
    }
}

演示调用代码

效果展示:

ii. 点画波形代码实现(使用matlab数据)参数介绍如下:

x_start: 波形绘制的起始横坐标(即图像左边界)。

y_center: 波形在 LCD 上的垂直中心线位置。

width: 整个波形在 LCD 上的横向宽度(像素数)。

amplitude: 显示波形的垂直振幅(即最大显示高度)。

data: 指向波形数据的数组,数据范围为 [-1, 1]。

len: 波形数据的总长度。

void LCD_Draw_SineFromData(u16 x_start, u16 y_center, u16 width, u16 amplitude, const float *data, u16 len)
{
	u16 i,y_draw,x_draw;
    for ( i = 0; i < len; i++)
    {
        float y = data[i];  // [-1, 1] 范围
         y_draw = y_center - (int16_t)(y * amplitude/5.0f);  //5.0f用来控制波形的缩放(可以自行调节)
         x_draw = x_start + (i * width) / len;
			POINT_COLOR=YELLOW;	
        LCD_DrawPoint(x_draw, y_draw);
			printf("x=%d y=%d",x_draw,y_draw);
    }
}

效果展示:

iii. 线画波形代码实现(使用matlab数据)参数介绍如下:

x_start: 波形绘制的起始横坐标。

y_center: 波形在 LCD 上的垂直中心线位置。

width: 整个波形在 LCD 上的横向宽度(像素数)。

amplitude: 显示波形的垂直振幅(即最大显示高度)。

data: 指向波形数据的数组,数据范围为。

len: 波形数据的总长度(即数组中的元素个数)。


void LCD_Draw_SineFromData_WithLine(u16 x_start, u16 y_center, u16 width, u16 amplitude, const float *data, u16 len)
{
	int16_t y1,y2;
	u16 i,x1,x2;
    for ( i = 0; i < len - 1; i++)
    {
         y1 = y_center - (int16_t)(data[i] * amplitude * 2.0f);
         y2 = y_center - (int16_t)(data[i + 1] * amplitude *2.0f);
         x1 = x_start + (i * width) / len;
         x2 = x_start + ((i + 1) * width) / len;
        LCD_DrawLine(x1, y1, x2, y2);
    }
}

演示调用代码

效果展示:

c. 频谱绘制

i. 这里也是使用了matlab的数据,通过stm32 傅里叶变换后拿到对应的频谱数据

data:指向频谱数据数组的指针,数组中的每个元素代表一个频率点对应的幅值。

len:频谱数据的长度,即 data 数组中的元素个数。

x_start:绘图的起始横坐标,决定频谱图在屏幕上从哪里开始画。

y_base:绘图的基准纵坐标,通常为零幅值对应的参考线(基线)位置,纵坐标从此处开始向上绘制。

width:整个频谱图在水平方向上占据的像素宽度。

max_height:在幅值最大时,频谱图可以绘制的最大像素高度,用于控制纵向缩放。

max_value:频谱数据中的最大预期幅值,用于归一化数据,将实际幅值映射到 max_height 范围内。

void LCD_Draw_FreqSpectrum(float *data, u16 len, u16 x_start, u16 y_base, u16 width, u16 max_height, float max_value)
{
	u16 x1,i,x2;
	int16_t y1,y2;
    for ( i = 0; i < len - 1; i++)
    {
         x1 = x_start + (i * width) / len;
         x2 = x_start + ((i + 1) * width) / len;

         y1 = y_base - (int16_t)((data[i] / max_value) * max_height*2.0f);
         y2 = y_base - (int16_t)((data[i + 1] / max_value) * max_height*2.0f);

        LCD_DrawLine(x1, y1, x2, y2);
    }
}

效果展示:

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

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

相关文章

(9)被宏 QT_DEPRECATED_VERSION_X_6_0(“提示内容“) 修饰的函数,在 Qt6 中使用时,会被编译器提示该函数已过时

&#xff08;1&#xff09;起因是看到 Qt 的官方源代码里有这样的写法&#xff1a; #if QT_DEPRECATED_SINCE(6, 0) //里面的都是废弃的成员函数QT_WARNING_PUSHQT_WARNING_DISABLE_DEPRECATEDQT_DEPRECATED_VERSION_X_6_0("Use the constructor taking a QMetaType inst…

关于mac配置hdc(鸿蒙)

关于mac配置hdc(鸿蒙) 在最开始配置的hdc -v时候老是出现格式不匹配 于是乎在网上找官网也不行&#xff0c;最后在csdn上找到了这篇文章Mac配置hdc才有的头绪 环境变量的问题 自己做一个简单的总结 首先在访达里面打开ide 打开之后输入下面的命令&#xff0c;一步一步的找…

是 OpenCV 的 CUDA 模块中用于在 GPU 上对图像或矩阵进行转置操作函数cv::cuda::transpose

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::transpose 是 OpenCV 的 CUDA 模块中的一个函数&#xff0c;用于在 GPU 上对图像或矩阵进行转置操作&#xff08;Transpose&#xff0…

PPT图表怎么制作?说5款自己使用过的PPT图表制作工具

PPT图表怎么制作&#xff1f;准备一份吸引人的PPT演示文稿时&#xff0c;图表往往能起到画龙点睛的作用。但是&#xff0c;对于很多人来说&#xff0c;制作既美观又专业的图表却不是一件容易的事情。今天&#xff0c;我们就来聊聊如何利用一些优秀的工具制作PPT图表。 1、亿图图…

[传输层]TCP协议

文章目录 报文格式连接管理可靠传输 面向连接的传输层协议 每一条TCP连接只能有两个端点&#xff0c;每一条TCP连接只能是点对点的 TCP提供可靠有序&#xff0c;不丢不重 TCP是面向字节流的 TCP工作模型&#xff1a; 发送方有一个缓存&#xff0c;缓存&#xff1a; 1.待发送 2…

Linux(1)编译链接和gcc

1、gcc分布编译链接 &#xff08;1&#xff09;预编译 gcc -E main.c -o main.i &#xff08;2&#xff09;编译 gcc -S main.i -o main.s &#xff08;3&#xff09;汇编 gcc -c main.s -o main.o &#xff08;4&#xff09;链接 gcc main.o -o main 执行&#xff1a…

【Java ee初阶】网络编程 UDP socket

网络编程 socket api 是传输层提供的api。 UDP 无连接&#xff0c;不可靠传输&#xff0c;面向数据报&#xff0c;全双工。 TCP 有链接&#xff0c;可靠传输&#xff0c;面向字节流&#xff0c;全双工。 UDP socket api 数据报 DatagrammSocket 代表了操作系统中的socket文…

旅游推荐数据分析可视化系统算法

旅游推荐数据分析可视化系统算法 本文档详细介绍了旅游推荐数据分析可视化系统中使用的各种算法&#xff0c;包括推荐算法、数据分析算法和可视化算法。 目录 推荐算法 基于用户的协同过滤推荐基于浏览历史的推荐主题推荐算法 亲子游推荐算法文化游推荐算法自然风光推荐算法…

c语言第一个小游戏:贪吃蛇小游戏08(贪吃蛇完结)

贪吃蛇撞墙和想不开咬死自己 #include <curses.h> #include <stdlib.h> struct snake{ int hang; int lie; struct snake *next; }; struct snake food; struct snake *head; struct snake *tail; int key; int dir; #define UP 1 #define DOWN -1 …

使用PhpStudy搭建Web测试服务器

一、安装PhpStudy 从以下目录下载PhpStudy安装文件 Windows版phpstudy下载 - 小皮面板(phpstudy) (xp.cn) 安装成功之后打开如下界面 点击启动Apache 查看网站地址 在浏览器中输入localhost:88,出现如下页面就ok了 二、与Unity交互 1.配置下载文件路径&#xff0c;点击…

c语言第一个小游戏:贪吃蛇小游戏06

实现贪吃蛇四方向的风骚走位 实现代码 #include <curses.h> #include <stdlib.h> struct snake{ int hang; int lie; struct snake *next; }; struct snake *head; struct snake *tail; int key; int dir; //全局变量 #define UP 1 //这个是宏定义&a…

Qt应用程序启动时的一些思路:从单实例到性能优化的处理方案

程序启动时优化的价值 在桌面软件开发领域&#xff0c;应用程序的启动过程就像音乐的序曲&#xff0c;决定了用户对软件品质的第一印象。比如首次启动等待超过3秒时&#xff0c;会让大多数用户产生负面看法&#xff0c;而专业工具软件的容忍阈值甚至更低。Qt框架作为跨平台开发…

一文详解Spring Boot如何配置日志

一、写在前面 对于日志文件&#xff0c;相信大家都并不陌生&#xff0c;通过在关键位置打印相关的日志&#xff0c;有利于快速跟踪和定位软件系统运行中存在的问题。 在之前的 Java 实现日志记录的文章中&#xff0c;我们介绍了能实现日志记录的主流框架有 Log4j、Log4j2、Lo…

Springboot | 如何上传文件

文章目录 1. 核心上传逻辑&#xff1a;FileUploadController2. 使文件系统中的文件可通过 HTTP 访问&#xff1a;WebConfig3. 安全性配置&#xff1a;WebSecurityConfig4. 前端实现&#xff08;这里用的是Angular&#xff09; 在许多应用程序开发中&#xff0c;我们经常需要实现…

spring中的@Async注解详解

一、核心功能与作用 Async 是Spring框架提供的异步方法执行注解&#xff0c;用于将方法标记为异步任务&#xff0c;使其在独立线程中执行&#xff0c;从而提升应用的响应速度和吞吐量。其主要作用包括&#xff1a; 非阻塞调用&#xff1a;主线程调用被标记方法后立即返回&…

MyBatis 报错:Column count doesn‘t match value count at row 1 详解与解决

本文适用于使用 MyBatis MySQL 开发中出现 “Column count doesnt match value count at row 1” 报错的朋友&#xff0c;尤其是在批量插入或更新数据时&#xff0c;遇到 XML 映射文件中 insert 标签报错的问题。 一、遇到的问题&#xff1a; 二、错误原因分析 列数与值数量不…

【人工智能】自然语言编程革命:腾讯云CodeBuddy实战5步搭建客户管理系统,效率飙升90%

CodeBuddy 导读一、产品介绍1.1 **什么是腾讯云代码助手&#xff1f;**1.2 插件安装1.2.1 IDE版本要求1.2.2 注意事项1.2.4 插件安装1.2.4.1 环境安装1.2.4.2 安装腾讯云AI代码助手** 1.2.5 功能介绍1.2.5.1 Craft&#xff08;智能代码生成&#xff09;1.2.5.2 Chat&#xff08…

麦肯锡110页PPT企业组织效能提升调研与诊断分析指南

“战略清晰、团队拼命、资源充足&#xff0c;但业绩就是卡在瓶颈期上不去……”这是许多中国企业面临的真实困境。表面看似健康的企业&#xff0c;往往隐藏着“组织亚健康”问题——跨部门扯皮、人才流失、决策迟缓、市场反应滞后……麦肯锡最新研究揭示&#xff1a;组织健康度…

【MySQL】第二弹——MySQL表的增删改查(CRUD)初阶

文章目录 &#x1f393;一. CRUD&#x1f393;二. 新增(Create)&#x1f393;三. 查询(Rertieve)&#x1f4d6;1. 全列查询&#x1f4d6;2. 指定列查询&#x1f4d6;3. 查询带有表达式&#x1f4d6;4. 起别名查询(as )&#x1f4d6; 5. 去重查询(distinct)&#x1f4d6;6. 排序…

离散制造企业WMS+MES+QMS+条码管理系统高保真原型全解析

在离散型制造企业的生产过程中&#xff0c;库存管理混乱、生产进度不透明、质检流程繁琐等问题常常成为制约企业发展的瓶颈。为了帮助企业实现全流程数字化管控&#xff0c;我们精心打造了一款基于离散型制造企业&#xff08;涵盖单件生产、批量生产、混合生产模式&#xff09;…