一、項目準備
主要利用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);}
}
效果展示: