如果光 遺忘了要將前方照亮 你會(huì)握著我的手嗎
如果路 要通往不知名的地方 你會(huì)跟我一起走嗎
我想 也許不會(huì)吧
疫情下的開(kāi)學(xué)
第一周快要過(guò)去了,新學(xué)期以一種從未見(jiàn)過(guò)的方式開(kāi)始了,這一周終于把上個(gè)學(xué)期的尾項(xiàng)結(jié)了,算是還清了吧。從中學(xué)到的就是做事情不要逃避,你越逃避它越害怕,當(dāng)它變成一件必須要做退無(wú)可退(的事情)的時(shí)候,不再害怕了。
說(shuō)實(shí)話以前真的夢(mèng)想可以躺著上課,可以不用去教室不用去占座,上學(xué)的時(shí)候可以吃到家里美味的飯菜,只是它突然實(shí)現(xiàn)的時(shí)候反而沒(méi)了原來(lái)的味道。武漢加油,中國(guó)加油。
項(xiàng)目背景
在傳統(tǒng)模式中,要對(duì)信號(hào)進(jìn)行分析,示波器是必不可少的。通過(guò)示波器,我們可以得到信號(hào)的幅值、頻譜、瀑布圖等一系列信息。然而示波器過(guò)于笨重,我們要想做分析就必須跑到實(shí)驗(yàn)室里去。于是有人提出,能不能做一個(gè)數(shù)字信號(hào)分析軟件呢?將信號(hào)的某些特征作為輸入,得到想要的輸出。在這種背景下,信號(hào)時(shí)頻分析軟件應(yīng)運(yùn)而生。
思路
首先要明白要的是什么。我們選取信號(hào)的時(shí)域圖、頻譜圖、IQ矢量圖和瀑布圖作為需求,信號(hào)的IQ分量作為輸入,共有50k個(gè)信號(hào)點(diǎn),即50k個(gè)IQ矢量對(duì)。
思路是根據(jù)設(shè)定的每幀點(diǎn)數(shù),將這些點(diǎn)讀取進(jìn)double類(lèi)型的數(shù)組中得到時(shí)域數(shù)組,進(jìn)行fftw得到頻域數(shù)組,調(diào)用高速繪圖軟件High-speed-Chart-Control進(jìn)行顯示,而矢量圖和瀑布圖使用CDC類(lèi)進(jìn)行繪制。再根據(jù)設(shè)定的幀率,動(dòng)態(tài)地進(jìn)行數(shù)組的更新,再重新顯示。
開(kāi)發(fā)方案為VS2017+MFC
對(duì)話框設(shè)計(jì)
主對(duì)話框分為四個(gè)窗口,分別顯示時(shí)域圖、頻域圖、IQ矢量圖和瀑布圖。菜單欄中,F(xiàn)ile下有打開(kāi)文件和保存圖片的按鈕,View下有播放、暫停和停止的按鈕,Parameters下有幀率和每幀長(zhǎng)度設(shè)置的按鈕。



所遇問(wèn)題
①如何繪制動(dòng)態(tài)曲線?
以500點(diǎn)為1幀,根據(jù)幀率調(diào)整定時(shí)器的時(shí)間間隔,在一個(gè)時(shí)間段內(nèi)進(jìn)行一幀圖像的顯示,到下一個(gè)時(shí)間段則更新顯示數(shù)組,重新繪制圖像。
②幀緩存技術(shù)?
可以把幀緩存看成是顯示內(nèi)存的一個(gè)映像,將其映射到進(jìn)程地址空間之后,就可以直接進(jìn)行讀寫(xiě)操作,而寫(xiě)操作可以立即反應(yīng)在屏幕上。這就好比一個(gè)水池,CPU將處理后的數(shù)據(jù)“流”到水池中,再“流”向顯示器。
③如何編寫(xiě)選擇文件的對(duì)話框,得到所選擇源文件的路徑?
用CFileDialog構(gòu)建對(duì)話框,OFN_HIDEREADONLY表示隱藏只讀選項(xiàng),用GetPathName()函數(shù)得到完整的文件名,包括目錄名和擴(kuò)展名。
④如何將整型數(shù)據(jù)轉(zhuǎn)化為Cstring類(lèi)型并查看?
構(gòu)造CString變量,調(diào)用Format寫(xiě)入整型數(shù)據(jù),用MessageBox查看。
⑤如何定義全局變量以在整個(gè)項(xiàng)目中使用?
在stdafx.cpp中定義該變量,如inttimer=333;
在stdafx.h中聲明該變量,如externinttimer;
⑥快速傅立葉變換庫(kù)fftw
一維離散傅立葉變換函數(shù)fftw_plan_dft_1d()
fftw_planfftw_plan_dft_1d(intn,fftw_complexin,fftw_complexout,intsign,unsigned
flags);
n為需要進(jìn)行傅里葉變換的數(shù)據(jù)個(gè)數(shù),in指向輸入數(shù)據(jù),out指向輸出數(shù)據(jù),sign(+1:逆傅里葉變換,-1:正傅里葉變換),F(xiàn)FTW_ESTIMATE表示不進(jìn)行任何的測(cè)試,直接創(chuàng)建局部最優(yōu)的fftw_plan
創(chuàng)建完畢后調(diào)用fftw_execute進(jìn)行傅里葉變換,調(diào)用后要進(jìn)行內(nèi)存回收
⑦如何點(diǎn)擊主對(duì)話框按鈕彈出參數(shù)設(shè)置的對(duì)話框?
在資源中新建對(duì)話框,添加需要的編輯框等控件,添加類(lèi)如CMyNewDlg,自動(dòng)生成.cpp和.h文件,在主對(duì)話框的.cpp文件中包含新生成的.h文件,在需要點(diǎn)擊按鈕的響應(yīng)函數(shù)中添加CMyNewDlgdlg;dlg.DoModal();
DoModal負(fù)責(zé)對(duì)模態(tài)話框的創(chuàng)建和撤銷(xiāo)。完成對(duì)話框的創(chuàng)建后,DoModal啟動(dòng)一個(gè)消息循環(huán),以響應(yīng)用戶的輸入。由于該消息循環(huán)截獲了幾乎所有的輸入消息,使主消息循環(huán)收不到對(duì)對(duì)話框的輸入,致使用戶只能與模態(tài)對(duì)話框進(jìn)行交互,而其它用戶界面對(duì)象收不到輸入信息。
⑧如何取消最大化按鈕?
在主對(duì)話框的屬性欄中將MaximizeBox設(shè)置為false。
⑨定義完OnTimer()函數(shù)后發(fā)現(xiàn)沒(méi)有按預(yù)期調(diào)用?
在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之間添加ON_WM_TIMER()消息
⑩當(dāng)嘗試在其它設(shè)備上運(yùn)行時(shí)報(bào)錯(cuò):找不到WindowsSDK版本xxxxxxxx

在項(xiàng)目屬性中更改Winows SDK版本