VC编程实现对波形数据的频谱分析修订稿

合集下载

基于VisualC++6.0通信信号频谱监测仿真系统的设计与实现

基于VisualC++6.0通信信号频谱监测仿真系统的设计与实现
( .武汉软件工程 职业学院, 1 湖北 武汉 4 0 0 ;.郑州大学升达经 贸管理学院 , 南 郑 州 4 19 ; 3252 河 5 11 3 .海军工程 大学 电子工程 学院, 湖北 武汉 4 0 3 ) 3 0 3
【 摘
要 】根 据无 线 电通信 频谱监 测系统原 理进行建 模 , 形成 了各种 常用信 号音 频和 视频模 型。 为 了显 示信号 时域 和频域 波形
律 去改 变载 波某 些参 数 的过程 。通 信信 号包 括基 带信 号、 载波和 已调波 。其 中模拟 调制系统是 用模拟信 号去
调 制载波 , 如调幅信号 、 调频信 号等 ; 字调制信号 是用 数
数 字信 号去 调制 载波 , 如相 移键 控信 号 、 频移键 控信 号
软件模 拟 就是 由计 算 机按 照数学 模 型产生 信号 , 济 、 经
上进行 了大量 的扩展 , 以适 应开发 各种 Wi o s 用程 n w应 d
序 的需要 。
2 通 信 信 号 频谱 监 测 系统 原 理
无 线 电通信 系 统从原 理 上可 以分 为模 拟调 制 系统 和数字 调制 系统 。所 谓调 制是按 照基 带信 号 的变化 规
基金 项 目 : 家 “ 6 ” 划项 目 (O 9 AJ 0 ) 国 83计 2 0 A 2 8
了这 些特 点 的 区别 。通 信信 号频 谱检 测 系统分 布式 仿
真 的结构 如图 1 所示 。 中间 的一条 中空 的粗线是用 双绞 线 和路 由器连 接在 一起 的数 据通 道 。无 线 电视频 信 号 和音 频信 号辐 射源 以及无 线 电通 信频谱 监 测系统 是用 计 算机进行模拟 。
谱数据结构 。
4 频谱 监测 系统 显 示控 制程 序 的设 计

使用C语言产生正弦波数据

使用C语言产生正弦波数据

使用C语言产生正弦波数据正弦波是一种连续的周期函数,在信号处理、音频处理、图像处理等领域中广泛应用。

在C语言中,我们可以使用数学库函数来生成正弦波数据。

要生成正弦波数据,我们需要确定以下参数:1.频率:正弦波的频率决定了波形的变化速度,单位为赫兹(Hz)。

2.采样率:采样率决定了每秒钟采集的样本数量,单位为赫兹(Hz)。

3.时长:正弦波的时长决定了生成的数据集中包含的周期数量,单位为秒(s)。

下面是一个简单的C语言程序,用于生成正弦波数据:```c#include <stdio.h>#include <math.h>void generateSineWave(float frequency, float sampleRate,float duration)int numSamples = (int)(duration * sampleRate);float dt = 1.0 / sampleRate;for (int i = 0; i < numSamples; i++)float t = i * dt;float value = sin(2 * PI * frequency * t);printf("%f\n", value);}int maifloat frequency = 440.0; // 正弦波频率为440Hz,即音符A4 float duration = 1.0; // 时长为1秒generateSineWave(frequency, sampleRate, duration);return 0;```在上面的代码中,`generateSineWave`函数接受频率、采样率和时长作为参数,并计算出样本数量`numSamples`以及每个样本的时间间隔`dt`。

然后,使用循环在指定的时长内生成正弦波数据,并通过`printf`函数打印出来。

c实现快速傅里叶变换输出频谱

c实现快速傅里叶变换输出频谱

标题:C语言实现快速傅里叶变换输出频谱一、简介在信号处理和频域分析中,快速傅里叶变换(FFT)是一种常用的算法,用于将时域的信号转换为频域的频谱。

在C语言中实现快速傅里叶变换可以帮助我们对信号进行高效的频域分析。

本文将从基础开始,介绍C语言实现快速傅里叶变换并输出频谱的方法。

二、快速傅里叶变换概述快速傅里叶变换是一种将离散信号转换为频域表示的算法,它将N个离散时间域采样点转换成N个频域采样点。

快速傅里叶变换算法的核心是分治法,通过递归地将信号分解为奇偶部分,然后合并计算,从而实现高效的频谱分析。

三、C语言实现快速傅里叶变换1. 我们需要定义一个复数结构体,用于表示实部和虚部。

在C语言中,可以使用结构体来表示复数,例如:```ctypedef struct {double real; // 实部double imag; // 虚部} Complex;```2. 接下来,我们可以编写一个函数来实现快速傅里叶变换。

在函数中,我们可以按照快速傅里叶变换的递归算法,将信号分解为奇偶部分,并进行合并计算,最终得到频域表示的频谱。

```cvoid FFT(Complex* x, int N, int inv) {// 实现快速傅里叶变换的代码// ...}```3. 在实现快速傅里叶变换的过程中,我们还需要编写一些辅助函数,例如计算旋转因子和进行信号分解合并等操作。

四、输出频谱在C语言中实现快速傅里叶变换后,我们可以将得到的频域表示的频谱输出到文件或者直接在终端进行可视化。

通过频谱分析,我们可以了解信号的频域特性,包括频率成分、频谱密度等信息。

五、个人观点和理解C语言实现快速傅里叶变换需要深入理解算法的原理,同时对C语言的数据结构和递归算法有一定的掌握。

在实际应用中,我们可以将快速傅里叶变换应用于音频处理、图像处理、通信系统等领域,对信号的特性进行频域分析。

六、总结通过本文的介绍,我们了解了C语言实现快速傅里叶变换并输出频谱的方法。

VC编程实现对波形数据的频谱分析

VC编程实现对波形数据的频谱分析

V C编程实现对波形数据的频谱分析Document serial number【NL89WT-NY98YT-NC8CB-NNUUT-NUT108】法在实际运用中无法保证当点数较大时的运算速度,无法满足对信号的实时处理。

根据W矩阵中W元素的周期性和对称性我们可以将一个N点的DFT运算分解为两组N/2点的DFT运算,然后取和即可,为进一步提高效率,将上述两个矩阵按奇偶顺序逐级分解下去。

当采样点数为2的指数次方M时,可分解为M 级子矩阵运算,全部工作量仅为:复数乘法:M*N/2次复数加法:N*M次而直接DFT需要的运算量为:复数乘法:N*N次复数加法:N*(N-1)次当点数N为几十个点时FFT的优势还不明显,而一旦达到几千、几百个点时优势是十分明显的:N=1024时:DFT需1048576次运算,FFT仅需5120次运算,改善比。

N=2048时:DFT需4194304次运算,FFT仅需11264次运算,改善比达到。

三、 "时间抽选奇偶分解快速离散傅立叶变换"的程序实现当采样点数较多时,如变换前和变换后的序列都按自然顺序排列,则中间运算过程会占用大量的中间存储单元,造成效率的低下和存储单元的浪费。

根据FFT的实现原理我们可以对采样序列进行逐次奇偶抽选,打乱以前的次序重新排序,然后按此顺序参加运算,可以实现"即位运算"提高存储单元的利用率。

(一)复数的描述方法进行傅立叶变换时不可避免的要用到复数,而在VC中并没有现成的可用于表示复数的数据类型,可以自己定义一个含有两个成员变量的数据结构来表示复数,这两个成员变量可分别用于表示复数的实部与虚部:注:在此,FFT运算结果都倍乘了系数10毫秒(秒)。

在分析结果中产生了误差,是由于待分析的连续时间信号不具备离散性或周期性,也可能有无限长度。

为了适应FFT方法的需要,对波形进行了抽样和截断,这样再用程序分析采样数据必然会引入误差,从分析结果可以看出,频率越高,误差波动也越大,此分析结果产生的误差在允许范围之内,是一个可以满意的近似。

VC编程实现对波形数据的频谱分析

VC编程实现对波形数据的频谱分析

要计算一个N点的离散傅立叶变换需要同一个N*N点的W矩阵(关于W矩阵请参阅信号与系统方面的书籍)相运算,随着N值的增大,运算次数显着上升,当点数达到1024时,需要进行复数乘法运算1,048,576次,显然这种算法在实际运用中无法保证当点数较大时的运算速度,无法满足对信号的实时处理。

根据W矩阵中W元素的周期性和对称性我们可以将一个N点的DFT 运算分解为两组N/2点的DFT运算,然后取和即可,为进一步提高效率,将上述两个矩阵按奇偶顺序逐级分解下去。

当采样点数为2的指数次方M 时,可分解为M级子矩阵运算,全部工作量仅为:复数乘法:M*N/2次复数加法:N*M次而直接DFT需要的运算量为:复数乘法:N*N次复数加法:N*(N-1)次当点数N为几十个点时FFT的优势还不明显,而一旦达到几千、几百个点时优势是十分明显的:N=1024时:DFT需1048576次运算,FFT仅需5120次运算,改善比204.8。

N=2048时:DFT需4194304次运算,FFT仅需11264次运算,改善比达到372.4。

三、"时间抽选奇偶分解快速离散傅立叶变换"的程序实现当采样点数较多时,如变换前和变换后的序列都按自然顺序排列,则中间运算过程会占用大量的中间存储单元,造成效率的低下和存储单元的浪费。

根据FFT的实现原理我们可以对采样序列进行逐次奇偶抽选,打乱以前的次序重新排序,然后按此顺序参加运算,可以实现"即位运算"提高存储单元的利用率。

(一)复数的描述方法进行傅立叶变换时不可避免的要用到复数,而在VC中并没有现成的可用于表示复数的数据类型,可以自己定义一个含有两个成员变量的数据结构来表示复数,这两个成员变量可分别用于表示复数的实部与虚部:来,也可以将其存成数据文件,以备进一步使用。

四、测试及运算结果分析编译运行程序,打开一三角脉冲的数据文件,并将分析结果保存,该三角脉冲幅度为1,持续时间2毫秒,采样时抽样时间间隔是20微秒,延拓周期(数据记录长度)为10毫秒,采样点数目500点,取2的整数次幂512个样点。

基于VC++的多波形信号参数自动校准软件的开发

基于VC++的多波形信号参数自动校准软件的开发
动测量 。 大模块 的物理层关系如 图 1 所示 。
\ 酥

㈤ 都 是 依 据 标 准 器 的测 量 指 标 进 行 最 后 测 载 ) 件体 酾信 发 器 数号生 r 腑 、 , 、 电
G I . S 适 配 器 PB U B
7 r
本次科研 的意 义存 于:一 、利刚 高级 程序 编
写语 言 和 G I PB总线控 制技 术 使 函数信 号 发生 器 的测 量成 为 自动 化测量 方式 。二 、对测 量数据 的
记录从 以往 的人 丁录 入变为 自动 录入并 自动十成
_ 7

测试结果文档 , 大大提 高 j , 后期数据处理效 率。 、
8 0— 19 函数信号发 生器检定规程 》的要求 , 4 3《 9
测量项 目包 括:频 率准确度 、输 出幅度 、衰减器 、 幅度 平坦 度、正 弦波总 失真 系数 、线性 度 、前 后

图2 界 面所 包 括 的 模 块
过渡时 间、脉 冲 占空系数 、调幅特性 、调频特性 、 扫频特性 和直流偏置等等 。
学 术 论 文
≯ 上海计 试 量测
仪器 模块 和软件模 块 ,在 两者 之间形成 数据传 输 件 的程控可 以顺利 地对信 号进行捕 捉和 分析 ,进
一G C机和 G I 和指 令传输 的通道 。特别指 出 :P一 PB总 行参数 测量 并最后 生成数据 记录文本 。程 序指令
线 的连接 需要 使用 G I . S PB U B转 化适 配器 。在 三 的编写 和 函数模 块 的涮用遵 循效 率至 J、f 错 率 I I 大模块 的运 行下就 能实现对 多 波形信 号参数 的 自 最小 的原 则 ,使 其 最 优 化 地 运 行 。其 余 的指 标

编程实现任意确定信号的频谱分析算法

编程实现任意确定信号的频谱分析算法

编程实现任意确定信号的频谱分析算法IMB standardization office【IMB 5AB- IMBK 08- IMB 2C】广西科技大学数字信号处理课程设计说明书题目:编程实现任意确定信号的频谱分析算法系别:计算机工程学院专业班级:通信学号:学生姓名:指导教师:目录摘要 (3)一、设计内容 (3)二、设计原理 (4)三、设计过程 (7)和弦音音频文件的频谱分析 (7)2.对该信号频谱能量较集中的频带滤波 (9)3.比较滤波前后的音频文件 (21)4.对滤波后的音频信号再滤出三个能量最集中的频簇 (21)5.重建信号与原信号的音频进行声音回放比较 (33)6.分析什么是和弦音 (35)收获 (36)参考文献 (36)摘要:随着计算机和信息科学的飞速发展,信号处理逐渐发展成为一门独立的学科,成为信息科学的重要组成部分,在语音处理、雷达、图像处理、通信、生物医学工程等众多领域中得到广泛应应用。

Matlab语言是一种广泛应用于工程计算及数值分析领域的新型高级语言,Matlab功能强大、简单易学、编程效率高,深受广大科技工作者的喜爱。

特别是Matlab还具有信号分析工具箱,不需具备很强的编程能力,就可以很方便地进行语音信号分析、处理和设计。

数字信号处理课程在现代科学中具有很大重要性及自身特点,理解与掌握课程中的基本概念、基本原理、基本分析方法,对用Matlab进行数字信号处理课程设计的思路,具有很大帮助。

语音信号的处理与滤波的设计主要是用Matlab作为工具平台,设计中涉及到声音的录制、播放、存储和读取,语音信号的抽样、频谱分析,滤波器的设计及语音信号的滤波,通过数字信号处理课程的理论知识的综合运用。

从实践上初步实现对数字信号的处理。

关键词:抽样频率;频谱分析;滤波器;窗函数一、设计内容(1)对给定的CEG和弦音音频文件取合适长度的采样记录点,然后进行频谱分析(信号的时域及幅频特性曲线要画出)。

基于VC++和SQLServer的频谱分析仪检定/校准系统设计及实现

基于VC++和SQLServer的频谱分析仪检定/校准系统设计及实现

De s i g n a nd i mp l e me nt a t i o n o f v e r i ic f a t i o n /c a l i b r a t i o n s y s t e m f o r
s p e c t r u m a n a l y z e r b a s e d o n VC+ +a n d S QL S e r v e r
结语本文介绍了基于vc60和sqlsever数据库软件开发平台设计了由应用软件测试平台tps和数据库构成的软件体系架构融合了visa技术仪器驱动简单ivi技术仪器驱动易使用的特点将visa和数据库技术用于频谱分析仪检定系统的程控指令模板结合多驱动码库管理技术实现测量过程和程控指令相分离应用软件与测试仪器无关可互换解决了无须编程标准设备可替换被检设备型号可扩充难题提高了应用软件的可移植性和健壮性技术上保证应用软件具有较长的生命周期
SONG To ng ・ g e n, TAN Do n g — l a n, M A Hui , Li Pi n g
( Un i t 6 3 8 9 2 o f P L A,L u o y a n g 4 7 1 0 0 3 ,C h i n a )
Abs t r act :I n o r de r t o s a t i s f y t h e me as u r i n g r e q ui r e me n t o f t he s p e c t r u m a na l y z e r ,a s e t o f t h e a u t o — v e r i ic f a t i on s y s t e m f o r s p e c t r u m a na l yz e r wa s d e s i g n e d.Th e s ys t e m c o mpo s i t i o n,pr i n c i p i u m a nd s o f t wa r e a r c h i t e c t u r e a r e i nt r o du c e d b r i e f l y .Th e ke y pr o b l e ms a n d s o l ut i o n s o f t he “ pr o gr am c o n t r o l c o m ma n ds t e mpl a t e ”a n d TPS me a s ur e me nt mo du l e o f t he v e r i ic f a t i o n/c a l i br a — t i o n s y s t e m o f s p e c t r u m a na l y z e r ba s e d o n t he VI SA a n d da t a ba s e t e c hn o l o g y a r e e mp ha t i c de s c r i b e d.The s e p a r a t i o n o f me a s ur — i n g c o n t r o l p r o c e s s a nd t he pr o g r a mm e d i ns t r uc t i o n i s us e d b y t h e me t h o d i n t h e s y s t e m ,t o r ea l i z e t h a t t h e s t a n da r d i ns t r u me n t o f t h e s ame ki n ds c a n b e r e pl a c e d a n d t he DUT c a n be e xt e nd wi t h o ut pr o g r a mm i ng,a nd t h e v e r i ic f a t i on s y s t e m f o r s pe c t r um a n—
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

V C编程实现对波形数据的频谱分析文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]到1024时,需要进行复数乘法运算1,048,576次,显然这种算法在实际运用中无法保证当点数较大时的运算速度,无法满足对信号的实时处理。

根据W矩阵中W元素的周期性和对称性我们可以将一个N点的DFT运算分解为两组N/2点的DFT运算,然后取和即可,为进一步提高效率,将上述两个矩阵按奇偶顺序逐级分解下去。

当采样点数为2的指数次方M时,可分解为M级子矩阵运算,全部工作量仅为:复数乘法:M*N/2次复数加法:N*M次而直接DFT需要的运算量为:复数乘法:N*N次复数加法:N*(N-1)次当点数N为几十个点时FFT的优势还不明显,而一旦达到几千、几百个点时优势是十分明显的:N=1024时:DFT需1048576次运算,FFT仅需5120次运算,改善比。

N=2048时:DFT需4194304次运算,FFT仅需11264次运算,改善比达到。

三、 "时间抽选奇偶分解快速离散傅立叶变换"的程序实现当采样点数较多时,如变换前和变换后的序列都按自然顺序排列,则中间运算过程会占用大量的中间存储单元,造成效率的低下和存储单元的浪费。

根据FFT的实现原理我们可以对采样序列进行逐次奇偶抽选,打乱以前的次序重新排序,然后按此顺序参加运算,可以实现"即位运算"提高存储单元的利用率。

(一)复数的描述方法进行傅立叶变换时不可避免的要用到复数,而在VC中并没有现成的可用于表示复数的数据类型,可以自己定义一个含有两个成员变量的数据结构来表示复数,这两个成员变量可分别用于表示复数的实部与虚部:注:在此,FFT运算结果都倍乘了系数10毫秒(秒)。

在分析结果中产生了误差,是由于待分析的连续时间信号不具备离散性或周期性,也可能有无限长度。

为了适应FFT方法的需要,对波形进行了抽样和截断,这样再用程序分析采样数据必然会引入误差,从分析结果可以看出,频率越高,误差波动也越大,此分析结果产生的误差在允许范围之内,是一个可以满意的近似。

实践证明,本程序的算法是正确可靠的。

小结:DFT尤其是FFT的应用已遍及各个科学领域,"DFT的应用"与 "FFT的应用"几乎成为同义语。

通过本文介绍和程序示例可以清楚的看到FFT方法在直接处理离散信号数据的作用,而且也可以很好的用于对连续时间信号分析的逼近。

本程序在Windows 2000 Professional下、由Microsoft Visual C++ 编译通过用VB实现数字波形显示程序减小字体增大字体作者:佚名来源:本站整理发布时间:2009-07-15 18:03:17id=126063>摘要:本文详细介绍了在VB集成环境下数字波形高速显示的方法,同时对双通道波形显示和数字滤波方法也进行了介绍。

关键词:数字;波形;显示;滤波1 前言:随着计算机技术及电子技术的发展,数字采集技术在检测领域的应用越来越广泛,检测速度越来越高,检测的数据量越来越大,特别是在无损检测领域,将检测数据通过计算机处理后绘制出波形,并实时显示,对及时发现伤损、分析伤损具有重要意义。

2 波形显示检测数据通常是离散的数据,将离散的数据绘制出波形,可通过在两点间连接线段的方法实现。

用Line方法显示波形VB提供了Line画直线方法,可在窗体上增加一个图片框控件,适当设置图片的大小和背景颜色,用Line方法将离散数据按检测顺序连接成线段,即可将波形显示在图片框中。

但该方法显示波形速度较慢,不适合高速显示的应用。

Windows API函数显示波形在VB中两点间连线的另一种方法是用Windows API函数,Win32 API提供了以下两个函数,联合使用可实现波形的快速显示,经过测试,显示速度比使用Line方法快70%以上。

LineTo函数:函数功能:画出由数组定义的点连接的一系列线段。

函数原型:BOOL LineTo(HDC hdc,int nXEnd,int nYEnd);参数:hdc:设备环境句柄。

nXEnd:定义线段终点的X坐标。

nYEnd:定义线段终点的Y坐标。

返回值:若函数调用成功,则返回非0值;若函数调用失败,则返回值为0。

MoveToEx函数:函数功能:将当前位置更新为指定的点,并有选择的返回原先的位置。

函数原型:BOOL MoveToEx (HDC hdc,int X,int Y,LPPOINT lpPoint);参数:hdc:设备环境句柄。

X:定义新位置的X坐标(逻辑坐标)。

Y:定义新位置的Y坐标(逻辑坐标)。

lpPoint:指向一个POINT结构,结构中存放原先的位置。

若此参数为NULL,则不返回原先的位置返回值:若函数调用成功,则返回非0值;若函数调用失败,则返回值为0。

在连接线段时,首先将检测数据放入一个数组中,用MoveToEx函数定位画线的起始点坐标,然后用LineTo函数画出起始点至下一个点之间的线段,再用MoveToEx将画线的起始点定位到下一个点,继续用LineTo函数画线,如此循环,即可将离散点连接成波形。

例:zz = MoveToEx, i, Mwave(i ), LpPoint1)zz = LineTo, i, Mwave(i+1))实时波形显示界面程序代码:COLORREF m_crTextColor;用编程运用该控件在VS2008环境下的编程步骤如下:1.建立一个对话框的MFC工程,在对话框上按照上图所示的界面布置控件。

其中波形控件那里布置一个Picture Control控件将其Modal Frame和Type均属性设置为true,其他均设置为False。

注意给Picture Control取的ID!后面编程将会用到。

2.将波形控件类的定义文件和实现文件拷贝至你的工程目录下。

但这实际上并没有将该类真正添加到你的工程下,需手动添加类。

常规操作,不详述。

3.在对话框的定义和实现文件中分别添加如下代码:程序代码:#include ""4.在对话框定义文件中(我给的供下载的例程中的是这个文件)中定义一个该控件类的变量:程序代码:private:C2DPushGraph m_PushGraph;5.在对话框的实现文件中(我给的供下载的例程中的是这个文件)的对话框初始化函数中添加如下代码:程序代码:(IDC_REALCTRL, this); 在不妨试着运行以下该程序,应该可以观察到那个控件显示出来了吧。

在添加以下代码:程序代码:(m_sin, RGB(255,255,255));(m_tra, RGB(255,0,0))这两行代码分别添加了一个正弦波形,ID号为m_sin,一个三角波形,ID号为m_tra。

不过运行之后并没有数据点绘制出来。

那是应为还没有调用bool Push( int nMagnitude, UINT uiLineID )函数添加数据点。

试着添加几个数据点再运行即可观察到波形。

7.还有一些控件的响应代码看看那个下载的例程吧。

四.结束语成功了吧,Any Problem,Contact me please!控件设计]Nobi's StatusChart - 野比的状态波形图控件从构思到实现Nobi's StatusChart - 野比的状态波形图控件从构思到实现野比着源程序下载:Demo控件背景目前比较流行的 WinForm 程序设计都会提供形象的可视化数据流动记录功能,如FlashGet 及其衍生软件的悬浮窗网速监视图,Windows 任务管理器的 CPU、内存使用图等。

构思为了在我们自己的程序中实现这种效果,就需要研究、分析它们的原理,掌握其规律,然后加以实现。

很明显,从软件可重用性以及各种随之而来的好处考虑,我们要求将这个“波形显示”效果做成一个控件(Control)。

分析还是以 FlashGet 的悬浮窗和 Windows 任务管理器作为研究对象。

仔细观察它们的工作方式,发现它们有以下的共同点:•在右边更新当前的波形值•更新后的波形不消失,而是整体向左平移•可以设置波形颜色、更新速度等而通过深入研究,发现二者不同点如下:•不同的显示方式,有曲线显示和直方图显示•有无定位网格•各部分颜色可自定义设计通过分析,可以决定如下:凡是二者共同点,加以重点实现;凡二者不同之处,通过设置属性(Property)进行更改。

最后绘制时,基于所设置的属性,使用共同方法加以实现。

因此自定义属性如下:•BackColor(重写基类属性)•Enabled(重写)•ForeColor(重写)•GridColor 网格颜色•GridHeight 网格每格高度•GridShiftting 是否平移网格•GridWidth 网格每格宽度•Interval 波形刷新间隔(单位:毫秒)•Mode 波形显示方式(曲线/直方图)•Range 数值范围•ShifttingIncrement 向左平移增量•Value 当前值控件因为要定时更新,因此具有一个内部的Timer 对其进行定时,其 Interval 由控件的 Interval 属性指定。

对于此自定义控件,需要每次更新时在其OnPaint() 事件中对整个控件进行绘制。

绘制顺序为:背景 - 网格 - 波形,如此保证所有部分均正确画出且无遮挡。

从波形看,很明显,我们需要一个长度至少等于波形控件宽度的数组来存放每时刻波形的值,因此可以确定这个数组是和控件绘图画布宽度一致的。

算法绘图最重要的是算法部分,如何计算如网格位置,如何将图形整体平移,如何设置波形值是本控件的重点和难点部分。

计算网格位置,以上面的 ShifttingIncrement 为offset 参数传入//网格数(不计边缘)float div;float pos = 0F;//先画垂直方向//可以少画一根线div = (float)w / (float)gridWidth + 1;for (int i = 0; i < (int)div; i++){pos += gridWidth;(penGrid, pos - offset, 0, pos - offset, h);}//画水平方向div = (float)h / (float)gridHeight;pos = 0F;for (int i = 0; i < (int)div;i++){pos += gridHeight;(penGrid, 0, pos, w, pos);}对于波形,传入其波形值数组作为参数//从 0 到 w 绘制int len = w;//根据绘制方式if (chartMode == for (int i = 0; i < len; i++){(p, i, h - val[i], i, h);}(p, len, h - val[len - 1], len, h);}else{len--;for (int i = 0; i < len; i++){(p, i, h - val[i], i + 1, h - val[i + 1]);}len++;(p, len - 1, h - val[len - 2], len, h - val[len - 1]);}如何平移,是一个难点,需要在内部定时器的Tick()事件中加以处理//更新网格偏移//只有启用了网格移动才处理if (gridShiftting){iOffset += gridShifttingIncrement;iOffset %= gridWidth;}//更新图形(整体左移)//必须在这里而不能在画图的同时移动,//若在画图中移动,则当画面被遮挡(OnPaint)事件不发生时无法更新int len = w;for (int i = 0; i < len; i++){//判断数组越界if (i < len - 1){val[i] = val[i + 1];}else{val[len - 1] =currentValue;//break;}}//val[len] = currentValue;Invalidate();最后引发控件的Invalidate() 方法使控件重绘自身。

相关文档
最新文档