week27 信号时频分析软件结项

如果光 遗忘了要将前方照亮 你会握着我的手吗
如果路 要通往不知名的地方 你会跟我一起走吗
我想 也许不会吧

疫情下的开学

第一周快要过去了,新学期以一种从未见过的方式开始了,这一周终于把上个学期的尾项结了,算是还清了吧。从中学到的就是做事情不要逃避,你越逃避它越害怕,当它变成一件必须要做退无可退(的事情)的时候,不再害怕了。
说实话以前真的梦想可以躺着上课,可以不用去教室不用去占座,上学的时候可以吃到家里美味的饭菜,只是它突然实现的时候反而没了原来的味道。武汉加油,中国加油。

项目背景

在传统模式中,要对信号进行分析,示波器是必不可少的。通过示波器,我们可以得到信号的幅值、频谱、瀑布图等一系列信息。然而示波器过于笨重,我们要想做分析就必须跑到实验室里去。于是有人提出,能不能做一个数字信号分析软件呢?将信号的某些特征作为输入,得到想要的输出。在这种背景下,信号时频分析软件应运而生。

思路

首先要明白要的是什么。我们选取信号的时域图、频谱图、IQ矢量图和瀑布图作为需求,信号的IQ分量作为输入,共有50k个信号点,即50k个IQ矢量对。
思路是根据设定的每帧点数,将这些点读取进double类型的数组中得到时域数组,进行fftw得到频域数组,调用高速绘图软件High-speed-Chart-Control进行显示,而矢量图和瀑布图使用CDC类进行绘制。再根据设定的帧率,动态地进行数组的更新,再重新显示。
开发方案为VS2017+MFC

对话框设计

主对话框分为四个窗口,分别显示时域图、频域图、IQ矢量图和瀑布图。菜单栏中,File下有打开文件和保存图片的按钮,View下有播放、暂停和停止的按钮,Parameters下有帧率和每帧长度设置的按钮。


打开文件后预览

菜单栏

播放

所遇问题

①如何绘制动态曲线?
以500点为1帧,根据帧率调整定时器的时间间隔,在一个时间段内进行一帧图像的显示,到下一个时间段则更新显示数组,重新绘制图像。
②帧缓存技术?
可以把帧缓存看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这就好比一个水池,CPU将处理后的数据“流”到水池中,再“流”向显示器。
③如何编写选择文件的对话框,得到所选择源文件的路径?
用CFileDialog构建对话框,OFN_HIDEREADONLY表示隐藏只读选项,用GetPathName()函数得到完整的文件名,包括目录名和扩展名。
④如何将整型数据转化为Cstring类型并查看?
构造CString变量,调用Format写入整型数据,用MessageBox查看。
⑤如何定义全局变量以在整个项目中使用?
在stdafx.cpp中定义该变量,如inttimer=333;
在stdafx.h中声明该变量,如externinttimer;
⑥快速傅立叶变换库fftw
一维离散傅立叶变换函数fftw_plan_dft_1d()
fftw_planfftw_plan_dft_1d(intn,fftw_complexin,fftw_complexout,intsign,unsigned
flags);
n为需要进行傅里叶变换的数据个数,in指向输入数据,out指向输出数据,sign(+1:逆傅里叶变换,-1:正傅里叶变换),FFTW_ESTIMATE表示不进行任何的测试,直接创建局部最优的fftw_plan
创建完毕后调用fftw_execute进行傅里叶变换,调用后要进行内存回收
⑦如何点击主对话框按钮弹出参数设置的对话框?
在资源中新建对话框,添加需要的编辑框等控件,添加类如CMyNewDlg,自动生成.cpp和.h文件,在主对话框的.cpp文件中包含新生成的.h文件,在需要点击按钮的响应函数中添加CMyNewDlgdlg;dlg.DoModal();
DoModal负责对模态话框的创建和撤销。完成对话框的创建后,DoModal启动一个消息循环,以响应用户的输入。由于该消息循环截获了几乎所有的输入消息,使主消息循环收不到对对话框的输入,致使用户只能与模态对话框进行交互,而其它用户界面对象收不到输入信息。
⑧如何取消最大化按钮?
在主对话框的属性栏中将MaximizeBox设置为false。
⑨定义完OnTimer()函数后发现没有按预期调用?
在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间添加ON_WM_TIMER()消息
⑩当尝试在其它设备上运行时报错:找不到WindowsSDK版本xxxxxxxx

报错

在项目属性中更改Winows SDK版本

你可能感兴趣的:(week27 信号时频分析软件结项)