基于STM32的LCD信號波形和FFT頻譜顯示

一、項目準備

主要利用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 到 1y_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.pswp.cn/web/79771.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79771.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79771.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Go 語言即時通訊系統開發日志-day1:從簡單消息收發 Demo 起步

Go語言即時通訊系統開發日志day1&#xff0c;主要模擬實現的一個簡單的發送消息和接受消息的小demo&#xff0c;因為也才剛學習go語言的語法&#xff0c;對go的json、net/http庫了解不多&#xff0c;所以了解了一下go語言的encoding/json庫和net/http庫&#xff0c;以及websock…

基于vllm-ascend的華為atlas大模型部署

vllm-ascend介紹&#xff1a; vLLM 昇騰插件 (vllm-ascend) 是一個讓vLLM在Ascend NPU無縫運行的后端插件。 此插件是 vLLM 社區中支持昇騰后端的推薦方式。它遵循[RFC]: Hardware pluggable所述原則&#xff1a;通過解耦的方式提供了vLLM對Ascend NPU的支持。 使用 vLLM 昇騰…

貝葉斯優化Transformer融合支持向量機多變量時間序列預測,Matlab實現

貝葉斯優化Transformer融合支持向量機多變量時間序列預測&#xff0c;Matlab實現 目錄 貝葉斯優化Transformer融合支持向量機多變量時間序列預測&#xff0c;Matlab實現效果一覽基本介紹程序設計參考資料 效果一覽 基本介紹 1.BO-TransformerSVM多變量時間序列預測&#xff0c…

狀壓DP總結

前言 一般來講 n n n 數據范圍在 10 ~ 25 之間都是可以進行狀態壓縮的 -> 2 n 2^n 2n 狀壓 The 2024 Shanghai Collegiate Programming Contest Problem G.象棋大師 知識點&#xff1a;線性DP&#xff0c;狀壓DP&#xff0c;預處理 輔助轉移的技巧 首先看到 n*n 的方格…

SQLite 轉換為 MySQL 數據庫

一、導出 SQLite 數據庫 1. 使用 SQLite 命令行工具 ? 打開終端&#xff08;在 Linux 或 macOS 上&#xff09;或命令提示符&#xff08;在 Windows 上&#xff09;。 ? 輸入sqlite3 your_database_name.db&#xff08;將 your_database_name.db 替換為你的 SQLite 數據庫…

【技巧】使用UV創建python項目的開發環境

回到目錄 【技巧】使用UV創建python項目的開發環境 0. 為什么用UV 下載速度快、虛擬環境、多版本python支持、清晰的依賴關系 1. 安裝基礎軟件 1.1. 安裝python 下載地址&#xff1a;https://www.python.org/downloads/windows/ 1.2. 安裝UV > pip install uv -i ht…

Java SpringMVC 和 MyBatis 整合項目的事務管理配置詳解

目錄 一、事務管理的基本概念二、在 SpringMVC 和 MyBatis 整合項目中配置事務管理1. 配置數據源2. 配置事務管理器3. 使用事務注解4. 配置 MyBatis 的事務支持5. 測試事務管理三、總結在企業級應用開發中,事務管理是確保數據一致性和完整性的重要機制。特別是在整合了 Spring…

Nakama:讓游戲與應用更具互動性和即時性

在現代游戲和應用程序開發中,實現社交互動和實時功能已成為用戶體驗的核心需求。為滿足這種需求,許多開發者正轉向分布式服務器技術,在這些技術中,Nakama 構建起了一座橋梁。Nakama 是一個開源的分布式服務器,專門為社交和實時游戲及應用程序設計,為開發者提供了強大的工…

項目中會出現的css樣式

1.重復漸變邊框 思路&#xff1a; 主要是用重復的背景漸變實現的 如圖&#xff1a; <div class"card"><div class"container">全面收集中醫癌毒臨床醫案&#xff0c;建立醫案共享機制&#xff0c;構建癌毒病機知識圖譜&#xff0c;便于醫療人…

數組和切片的區別

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 非常期待和您一起在這個小…

Jenkins企業級實戰

目標 在Windows操作系統上使用Jenkins完成代碼的自動拉取、編譯、打包、發布工作。 實施 1.安裝Java開發工具包&#xff08;JDK&#xff09; Jenkins是基于Java的應用程序&#xff0c;因此需要先安裝JDK。可以從Oracle官網或OpenJDK下載適合的JDK版本。推薦java17版本&#x…

C++ 異常捕獲 try 和 __try的區別筆記

最近碰到了try 和 __try的區別的問題&#xff0c;經過實測與驗證&#xff0c;發現在vs2019下&#xff0c;確實存在try無法捕獲特定異常的問題&#xff0c;比如下面的代碼&#xff1a; //以空格作為分割符的符號個數 //內存復制功能 // test1.cpp : 定義控制臺應用程序的入口點…

Spark基礎介紹

1. Spark 核心概念 1.1 RDD&#xff08;彈性分布式數據集&#xff09; 定義&#xff1a;RDD&#xff08;Resilient Distributed Dataset&#xff09;是 Spark 的核心抽象&#xff0c;是不可變、可分區、容錯的分布式數據集合。特性&#xff1a; 彈性&#xff1a;自動進行內存…

采用SqlSugarClient創建數據庫實例引發的異步調用問題

基于SqlSugar編寫的多個WebApi接口&#xff0c;項目初始化時采用單例模式注冊SqlSugarClient實例對象&#xff0c;前端頁面采用layui布局&#xff0c;并在一個按鈕事件中通過Ajax連續調用多個WebApi接口獲取數據。實際運行時點擊按鈕會隨機報下面幾種錯誤&#xff1a; Execute…

[原創](現代Delphi 12指南):[macOS 64bit App開發]: 如何獲取當前用戶主目錄(即:~波浪符號目錄)?

[作者] 常用網名: 豬頭三 出生日期: 1981.XX.XX 企鵝交流: 643439947 個人網站: 80x86匯編小站 編程生涯: 2001年~至今[共24年] 職業生涯: 22年 開發語言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 開發工具: Visual Studio、Delphi、XCode、…

pdf url 轉 圖片

背景&#xff1a;vue2.0需要把pdf轉成圖片&#xff0c;顯示在url里面&#xff0c;使用pdfjs-dist來解決 步驟&#xff1a; 1、安裝依賴包(我的項目是node12&#xff0c;安裝太高版本會報錯) npm i pdfjs-dist2.16.105 2、vue代碼 <template><div class"main…

理解 Open vSwitch (OVS)

Open vSwitch&#xff08;簡稱 OVS&#xff09;是一個開源的 虛擬交換機&#xff0c;主要用于 虛擬化環境&#xff08;如 KVM、Xen、Docker&#xff09;和 軟件定義網絡&#xff08;SDN&#xff09;。它類似于物理交換機&#xff0c;但在軟件層面實現&#xff0c;可以靈活地管理…

S7-1500——零基礎入門1、工業編程基本概念

工業編程基本概念 一,數制與基本數據類型二,數字量信號三,模擬量信號一,數制與基本數據類型 本節主要內容 類別內容主題數制與基本數據類型數制講解十進制、十六進制、二進制及其進位規則;基數、位權概念數據類型介紹PLC 使用的數據類型:未序列數據類型(bit、byte、wor…

kotlin-協程(什么是一個協程)

1.什么指一個協程對于線程來說一個thread就是就是指一個線程&#xff0c;thread為什么成為線程呢&#xff1f;因為他實現了對線程的一個抽象管理&#xff0c;可以管理這個線程&#xff0c;啟動&#xff0c;可以查看各種信息 那么協程呢&#xff1f; public fun CoroutineScop…

七、深入 Hive DDL:管理表、分區與洞察元數據

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月13日 專欄&#xff1a;Hive教程 內容導航 一、表的 DDL 操作 (非創建)二、分區的 DDL 操作三、洞察元數據&#xff1a;SHOW 命令的威力結語&#xff1a;DDL 與 SHOW&#xff0c;Hive 管理的雙翼練習題一、選擇題二、代碼題…