賽爾編程
⑴ 鎬庢牱鐢–++緙栫▼緇樺埗y=sinx 鐨勪竴孌墊洸綰匡紵
涓庝綘鎷ユ湁鐨勮蔣浠舵湁鍏熾傜粯鏇茬嚎鐨勫叧閿鏄璁$畻鍑烘洸綰跨殑x,y鍧愭爣錛岀劧鍚庝袱鐐硅繛涓綰褲
涓嬮潰鏄鐢∕S VC++ API 鍐欑殑緇樻洸綰跨▼搴忥紝鐢繪椂搴忔洸綰匡紝鍙緙╂斁錛岀敾搴ф爣鍒誨害..錛岀幇鍒犲幓浜嗕竴浜涘姛鑳斤紙鏈鍒犲噣錛夛紝渚涘弬鑰冦
緙栬瘧鏃惰嫢鏈夎﹀憡淇℃伅錛屽彲浠ユ垨鐣ャ
璁緓0=0;dx=0.01;1000鐐廣
#include <afxwin.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <Winuser.h>
#pragma comment (lib, "LIBCMT.LIB")
#define DEBUG 0
HWND hWndMain;
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
BOOL InitWindowsClass(HINSTANCE hInstance);
BOOL InitWindows(HINSTANCE hInstance,int nCmdShow);
void OnDisplayMessage(char *str);
void set_n_scale_y(int *ndiv, float ymin, float ymax, float *yu, float *yd, float *dy);
void set_n_scale_x(int *ndiv, float t0, float te, float *td, float *tu,float *draw_dt );
static float *yt,rx,ry,y_min,y_max,y_ran,y_shift;
static float draw_yu,draw_yd,draw_dy,draw_min,draw_max;
static float t0=0.0,dt=1.0,draw_tu,draw_td,draw_dt;
int flag_t0=0;
float bt_scale_1=1.0;
int draw_n=4,draw_nt=6;
char pname[40],namein[50],str[120],para2[10],para3[10],para4[10];;
char one_line[80];
int len,NN;
LPTSTR argv;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)
{
MSG Msg;
int i;
//get cmd line
argv = GetCommandLine();
len = strlen(argv);
sprintf(one_line,"%s",argv);
i = sscanf(one_line,"%s %s %s %s %s",&pname[0],&namein[0],¶2[0],¶3[0],¶4[0]);
///===========
t0 = 0;
dt = 0.02;
draw_nt=6;
NN = 1000;
yt = (float *) malloc(NN * sizeof(float));
for (i=0;i<NN;i++) yt[i] = sin(t0+dt*i);
y_min=y_max=yt[0];
for (i=0;i<NN;i++){
if (yt[i] < y_min) y_min=yt[i];
if (yt[i] > y_max) y_max=yt[i];
};
y_ran = y_max - y_min;
ry = 150.0 / y_ran;
for (i=0;i<NN;i++) yt[i]= yt[i] - y_min;
y_shift = 180 ;
draw_max = y_max;
draw_min = y_min;
(void) set_n_scale_y(&draw_n, draw_min, draw_max, &draw_yu, &draw_yd, &draw_dy);
if (DEBUG == 1){
sprintf(str,"yd=%f yu=%f dy=%f y_max=%f y_min=%f n=%d", draw_yd,draw_yu,draw_dy,y_max,y_min,draw_n);
OnDisplayMessage(str);
};
(void) set_n_scale_x(&draw_nt, t0, t0+ dt*(NN), &draw_td, &draw_tu,&draw_dt);
if (DEBUG == 1){
sprintf(str,"td=%f tu=%f dt=%f n=%d", draw_td,draw_tu,draw_dt,draw_nt);
OnDisplayMessage(str);
};
rx = 900.0 / (draw_tu - draw_td);
if(!InitWindowsClass(hInstance))
return FALSE;
if(!InitWindows(hInstance,nCmdShow))
return FALSE;
ShowWindow(hWndMain,nCmdShow);
UpdateWindow(hWndMain);
while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static long nXChar,nYChar;
HDC hdc;
short x;
TEXTMETRIC tm;
PAINTSTRUCT ps;
COLORREF color;
HFONT font;
HPEN hP1; // pen
// CPoint aP,mousePos;
int i;
switch(message)
{
case WM_LBUTTONDOWN:
bt_scale_1 = bt_scale_1 + 0.05;
ry=ry*bt_scale_1;
y_shift = y_shift * bt_scale_1;
ShowWindow(hwnd, SW_HIDE);
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);
return 0;
case WM_RBUTTONDOWN:
ry=ry/bt_scale_1;
y_shift = y_shift / bt_scale_1;
ShowWindow(hwnd, SW_HIDE);
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);
return 0;
case WM_CREATE:
ScrollWindow(hwnd, 0, -800, NULL, NULL);
hdc=GetDC(hwnd);
GetTextMetrics(hdc,&tm);
nXChar=tm.tmAveCharWidth;
nYChar=tm.tmHeight;
ReleaseDC(hwnd,hdc);
return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps); // begin paint
SetWindowExtEx(hdc,1200,800,NULL);
SetViewportExtEx(hdc,1200,800*bt_scale_1,NULL);
SetViewportOrgEx(hdc,100,150,NULL);
// draw grids
color=RGB(0,128,128);
hP1=CreatePen(PS_SOLID,0,color);
SelectObject(hdc,hP1);
MoveToEx( hdc,0, y_shift-(draw_yu-y_min)*ry, NULL );
LineTo(hdc,900,y_shift-(draw_yu-y_min)*ry);
LineTo(hdc,900,y_shift-(draw_yd-y_min)*ry);
LineTo(hdc,0,y_shift-(draw_yd-y_min)*ry);
LineTo(hdc,0,y_shift-(draw_yu-y_min)*ry);
for (i=0;i<=draw_n;i++)
{
MoveToEx( hdc, 0, y_shift-(draw_yd -y_min + i* draw_dy)*ry, NULL );
LineTo( hdc, 900, y_shift-(draw_yd -y_min + i * draw_dy)*ry );
}
for (i=1;i<draw_nt;i++) {
MoveToEx( hdc, 900 * i /draw_nt, y_shift-(draw_yd -y_min)*ry, NULL );
LineTo( hdc, 900 * i /draw_nt, y_shift-(draw_yu -y_min)*ry );
}
// draw curve
color=RGB(255,0,0);
hP1=CreatePen(PS_SOLID,0,color);
SelectObject(hdc,hP1);
MoveToEx( hdc, (t0-draw_td)* rx, y_shift-yt[0]*ry, NULL );
for (i=1;i<NN ;i++){
LineTo(hdc,(t0+i*dt-draw_td)*rx, y_shift-yt[i]*ry);
}
font=CreateFont(
24,10,0,0, FW_NORMAL,0,0,0, ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,NULL,"myfont"
);
SelectObject(hdc,font);
GetTextMetrics(hdc,&tm);
nYChar=tm.tmHeight;
color=RGB(0,0,0);
for (i=0;i<=draw_n;i++)
{
sprintf(one_line,"%.2f",draw_yd +i * draw_dy);
TextOut(hdc,-60,y_shift-(draw_yd-y_min + i* draw_dy)*ry-5,one_line,strlen(one_line));
}
for (i=0;i<=draw_nt;i++)
{
sprintf(one_line,"%.1f",draw_td +i * draw_dt);
TextOut(hdc,900 * i /draw_nt-30,y_shift-(draw_yd -y_min)*ry+20, one_line,strlen(one_line));
}
sprintf(one_line,"%s N=%d",namein,NN);
TextOut(hdc,20,y_shift-(draw_yu-y_min )*ry-40,one_line,strlen(one_line));
EndPaint(hwnd,&ps); // end paint
return 0L;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
}
BOOL InitWindowsClass(HINSTANCE hInstance)
{
WNDCLASS wndclass;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
// wndclass.hIcon=LoadIcon(NULL,"END");
wndclass.hIcon=LoadIcon(hInstance,"uni03.ico");
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WndProc;
wndclass.lpszClassName="Windows Fill";
wndclass.lpszMenuName=NULL;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
return(RegisterClass(&wndclass));
}
BOOL InitWindows(HINSTANCE hInstance,int nCmdShow)
{
HWND hWnd;
char str[100];
sprintf(str,"%s %s",pname,namein);
hWnd=CreateWindow(
"Windows Fill",
str,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
NULL
);
if(!hWnd)
return FALSE;
hWndMain=hWnd;
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
void OnDisplayMessage(char *str)
{
MessageBox(NULL,str,"msg",MB_OK | MB_ICONINFORMATION);
}
void set_n_scale_y(int *ndiv, float ymin, float ymax, float *yu, float *yd, float *dy)
{
int n ;
float yuu,ydd;
float yr;
if (*ndiv <= 0) {n = 2;} else n = *ndiv;
yr = ymax - ymin;
if ( yr >= 0.0001 && yr < 0.001) {
yuu = (float) ((int) (ymax * 10000.0)) / 10000.0f + 0.0001f;
ydd = (float) ((int) (ymin * 10000.0)) / 10000.0f - 0.0001f;
}
else if (yr >= 0.001 && yr < 0.01) {
yuu = (float) ((int) (ymax * 1000.0)) / 1000.0f + 0.001f;
ydd = (float) ((int) (ymin * 1000.0)) / 1000.0f - 0.001f;
}
else if ( yr >= 0.01 && yr < 0.1) {
yuu = (float) ((int) (ymax * 100.0)) / 100.0f + 0.01f;
ydd = (float) ((int) (ymin * 100.0)) / 100.0f - 0.01f;
}
else if ( yr >= 0.1 && yr < 1.0) {
yuu = (float) ((int) (ymax * 10.0)) / 10.0f + 0.1f;
ydd = (float) ((int) (ymin * 10.0)) / 10.0f - 0.1f;
}
else if ( yr >= 1.0 && yr < 10.0) {
yuu = (float) ((int) (ymax)) + 1.0f;
ydd = (float) ((int) (ymin)) - 1.0f;
}
else if ( yr >= 10.0 && yr < 100.0) {
yuu = (float) ((int) (ymax * 0.1)) / 0.1f + 10.0f;
ydd = (float) ((int) (ymin * 0.1)) / 0.1f - 10.0f;
}
else if ( yr >= 100.0 && yr < 1000.0) {
yuu = (float) ((int) (ymax * 0.01)) / 0.01f + 100.0f;
ydd = (float) ((int) (ymin * 0.01)) / 0.01f - 100.0f;
}
else if ( yr >= 1000.0 && yr < 10000.0) {
yuu = (float) ((int) (ymax * 0.001)) / 0.001f + 1000.0f;
ydd = (float) ((int) (ymin * 0.001)) / 0.001f - 1000.0f;
}
else if ( yr >= 10000.0 && yr < 100000.0) {
yuu = (float) ((int) (ymax * 0.0001)) / 0.0001f + 10000.0f;
ydd = (float) ((int) (ymin * 0.0001)) / 0.0001f - 10000.0f;
} else {
yuu = ymax; ydd = ymin;
};
if (yuu == ydd) {
yuu = ydd * 1.1f;
ydd = ydd * 0.9f;
};
*yu = yuu; *yd = ydd;
*dy = (yuu - ydd) / n;
if (*dy > 1.0) *dy = (float) ((int) *dy );
*ndiv = (yuu - ydd)/ (*dy) ;
}
void set_n_scale_x(int *ndiv, float t0, float te, float *td, float *tu,float *draw_dt )
{
int i;
int n ;
double tr,dt,d;
if (*ndiv <= 0) {n = 6;} else n = *ndiv;
tr = (double) (te - t0);
dt = tr / (double) n;
if (dt >= 1.0 ){d = (double) ((int) (dt + 0.9));}
else { d = dt;};
i = (int)( (double) t0 / d);
if (t0 < 0) i=i-1;
// if ( (float)(d * i) < t0) i = i + 1;
*td = (float) (d * i);
*ndiv = (int) ((te - *td) / d);
if ( *ndiv * d < (te - *td) ) *ndiv= *ndiv+1;
*tu = *td + *ndiv * d;
*draw_dt = (float) d;
}
⑵ 簡述虛擬儀器技術及LabVIEW編程課程的認識和理解
虛擬儀器--軟體就是儀器
虛擬儀器, 虛擬示波器, 虛擬儀器技術, 虛擬儀器軟體, 虛擬儀器開發, 虛擬儀器組成
一、引言
當前多媒體計算機、信息高速公路和計算機網路是計算機信息科學的三個重要發展方向。它們相互聯系、相互促進、共同發展,已經滲透到人們日常工作、生活、學習、娛樂的各個方面,逐步地由辦公室、實驗室走向家庭。
虛擬現實是多媒體計算機的一個重要應用領域,多媒體技術是虛擬現實的技術基礎。虛擬現實(Virtual Reality)是利用多媒體計算機技術生成的一個具有逼真的視覺、聽覺、觸覺及嗅覺的模擬現實環境。用戶可以用人的自然技能對這一虛擬的現實進行交互體驗,而用戶體驗到的結果--該虛擬現實的反應與用戶在相應的真實現實中的體驗結果相似或完全相同。虛擬現實的概念包括如下三個層次的含義:
1、虛擬現實是利用計算機技術而生成的逼真的實體,人們對該實體具有真實的三維視覺、立體聽覺、質感的觸覺和嗅覺。
2、人們可以通過自然技能與虛擬現實進行對話,即人的頭、眼、四肢等的各種動作在虛擬現實中的反應具有真實感。
3、虛擬現實技術往往要藉助一些三維感測設備來完成交互動作,如頭盔式立體顯示器、數據手套、數據衣服、三維操縱器等。
虛擬現實技術雖然現在還處於初級階段,但已在科學可視化、CAD、飛行器/汽車/外科手術、虛擬儀器等的操作模擬等方面得到了應用。已經在航空航天、國防軍事、生物醫學、教育培訓、娛樂游戲、旅遊等領域顯示出廣闊的應用前景。
虛擬儀器(Virtual Instrument--VI)是虛擬現實在儀器儀表領域中的一個重要應用,目前已在國際上悄然興起。虛擬儀器是以多媒體計算機作為基礎,使用圖形界面編程技術,模擬實際儀器的面板、功能和操作,從而生成完成各種任務的專用儀器。
由於科學技術的高度發展,導致了各種功能強大、越來越復雜的儀器不斷涌現,其中很多儀器都以計算機作為基礎,出現了儀器計算機化的趨勢,其主要表現為:
1、硬體與計算機的介面標准化
2、硬體軟體化
3、軟體模塊化
4、模塊控制項化
5、系統集成化
6、程序設計圖形化
7、科學計算可視化
8、硬體介面軟體驅動化
由於計算機軟、硬體技術的不斷發展,加之實際應用的需要,使人們對虛擬儀器的興趣越來越濃厚,研製虛擬儀器也成為了現實的可能。研製虛擬儀器主要源於以下目的:
1、節省儀器開發的時間和經費
2、充分利用計算機數據處理和分析的功能
3、統一儀器的用戶界面
4、增強儀器的功能和適用范圍
5、集成儀器的需要
6、使儀器容易擴展
虛擬儀器主要由以下幾部分組成:
1、界面控制項庫
2、數據輸入、輸出
3、數據處理方法庫
4、數據表示庫
5、數據存儲與管理
6、任意信號發生
7、圖形界面編程環境
界面控制項庫中包括一些常用儀器的面板部件,如指示器、計量表、發光二極體、按鈕、轉盤、刻度盤、滑動條等,每個控制項都帶有可編程的函數與屬性。
數據輸入與輸出是指從外部設備獲取數據進入計算機或從計算機輸出數據去控制外部設備,需要建立與數據採集板、串並口、以及其他標准化介面(IEEE-488、GPIB、RS-232、RS-422、SCSI、VXI等)通信的驅動軟體,從而擴展儀器的適用
范圍與應用領域。
數據處理方法庫中集中了許多數據處理方法,如FFT計算、濾波、建模、參數估計等,並提供這些處理方法的編程介面,只需把這些方法簡單的組合即可完成各種復雜的任務。
數據表示是指用一定的方式來顯示數據和處理結果,其中包括數字顯示、曲線顯示、直方圖、散點圖、二維圖形、三維網格圖形、三維填充圖形、四維圖形、圖象乃至動態圖形或圖象等,使得數據表示十分直觀,易於理解。
數據存儲與管理主要是指提供數據存儲的格式、數據查詢方法、數據瀏覽方法等。
信號產生是指根據需要產生任意信號,其中一些標准信號可以用於儀器測試和自檢之用。
圖形編程環境是指用戶可以任意組合控制項與方法,將其聯接成一個整體,形成專用儀器的工具。利用虛擬儀器用戶可以象搭積木一樣很快生成所需要的各種儀器。
二、現有虛擬儀器與集成環境舉例
1、MATLAB:高性能數值計算和數據分析軟體
MATLAB是由美國Mathworks公司研製的高性能數值計算和數據分析軟體。它已經成為工程和科學研究的工業標准,它具有獨特的用戶交互界面、復雜的數值計算、強大的數據分析、靈活的科學圖形、快速的計算、方便的擴展等特點,是高產和創造性科學研究的首選軟體。
MATLAB的基本功能有:
※ 矩陣運算
※ 矩陣分解
※ 矩陣特徵值與特徵向量計算
※ 信號卷積
※ 譜估計
※ 復數運算
※ 一維和二維FFT
※ 濾波器設計與濾波
※ 曲線擬合
※ 三次樣條擬合
※ 貝賽爾函數
※ 非線性優化
※ 線性方程組求解
※ 微分方程
MATLAB包括的工具箱有:
※ 數字信號處理工具箱
※ 控制系統設計工具箱
※ 系統辨識工具箱
※ 自擴展工具箱
MATLAB包括的繪圖函數:
※ 直方圖
※ 散點圖
※ 曲線圖
※ 三維網格圖
※ 三維填充圖
※ 等值線圖
※ 極坐標圖形
※ X-Y繪圖
※ 圖象顯示
2、DADiSP:科學家和工程師的數據分析與圖形軟體
DADiSP軟體由美國DSP Development Corporation公司研製,主要作為科學家和工程師用於數據分析和圖形顯示工具。它包括以下功能:
※ 矩陣運算
※ 特徵向量與特徵值計算
※ 一維、二維FFT與卷積
※ 二維、三維、四維圖形顯示
※ 醫學圖象處理
※ 衛星遙感圖象處理
※ 地震信號處理
※ 統計分析與處理
※ 實驗設計
※ 假設檢驗
※ 濾波器設計
※ 聲納雷達信號處理
※ 語音與通信信號處理
※ 振動分析
3、MP100:醫學信號採集與處理系統
MP100是由美國BIOPAC System公司研製的醫學信號採集與處理系統,它與AcqKnowledge軟體一起運行,提供靈活的、易於使用的模塊化系統,使您能隨心所欲的完成數據採集和分析任務。AcqKnowledge是一個功能強大、十分靈活的軟體包,它使用下拉式菜單和對話框,無需學習另外的編程語言,就可以設計出復雜的數據採集、模擬、觸發和分析系統。主要包括實時數據記錄、分析和濾波,離線數據分析與處理,數據的各種圖形表示等功能。該系統可以與虛擬儀器LabVIEW聯接,提供可視化圖形編程環境。它的主要應用領域有:
※ 運動生理學
※ 肌電信號記錄
※ 心信電記錄與分析
※ 腦電記錄與分析
※ 誘發電位記錄與分析
※ 眼震電圖和眼球運動分析
※ 神經傳導分析
※ 精神生理學
※ 葯理學
※ 遙測監護
4、LabVIEW:圖形編程虛擬儀器
LabVIEW是美國National Instrument Corporation公司研製的圖形編程虛擬儀器系統。主要包括數據採集、控制、數據分、數據表示等功能,它提供一種新穎的編程方法,即以圖形方式組裝軟體模塊,生成專用儀器。LabVIEW由面板、流程方框圖、圖標/連接器組成,其中面板是用戶界面,流程方框圖是虛擬儀器源代碼,圖標/連接器是調用介面(Calling Interface)。流程方框圖包括輸入/輸出(I/O)部件、計算部件和子VI部件,它們用圖標和數據流的連線表示;I/O部件直接與數據採集板、GPIB板、或其他外部物理儀器通信;計算部件完成數學或其他運算與操作;子VI部件調用其他虛擬儀器。
5、LabWINDOWS/CVI:C語言編程的虛擬儀器
LabWINDOWS的功能與LabVIEW相似,且由同一家公司研製,不同之處是它可用C語言對虛擬儀器進行編程。
6、LabLinc V:模塊化的虛擬儀器系統
LabLinc V由美國COULBOURN INSTRUMENTS公司研製的模塊化虛擬儀器系統,它由基本單元、信號採集與處理、控制等模塊組成,主要應用於生理學、生物醫學和生物力學等領域中的數據採集、實時顯示和過程式控制制等。
7、HyperSignal:可視化信號處理系統設計
HyperSignal由美國Hyperception公司研製的可視化信號處理系統設計軟體,它使信號處理系統設計的過程可視化,同時使信號處理結果可視化。
8、Model900:靈活的數據採集與波形產生系統
Model900由美國Applied Signal Technology公司研製,提供高速大容量數據採集、波形產生等功能,使用虛擬儀器環境以節省開發時間和資金。
9、DASP:大容量數據自動採集與處理分析軟體
DASP由東方振動和雜訊技術研究所研製,主要用於科學實驗數據記錄與分析,多功能信號採集與分析,自動化數據採集、顯示、讀數、計算、分析、存儲、列印、繪圖等。
10、LabDoc:集成儀器軟體包
LabDoc由日本康泰克電子技術有限公司研製,它具有多種測量儀器功能,通過圖形用戶界面和在線幫助,能提供容易操作的儀器畫面。可以應用於實驗室、生產線檢查、教育與培訓等領域,主要測試功能有:
※ 數字濾波
※ 脈沖發生
※ 函數發生
※ 波形發生
※ 調諧信號發生
※ FFT分析
※ 頻率計
以上我們列舉了十種目前比較流行的虛擬儀器和集成環境系統,其中以美國在這方面的工作最為出色,而我國在這方面才剛剛起步,尚未見到完整的虛擬儀器系統。由以上列舉的例子可以看出,虛擬儀器具備如下特點:
※ 涉及較深奧的數值計算方法
※ 集成了信號處理與過程式控制制演算法
※ 軟、硬體模塊互相獨立
※ 具備二次開發的集成編程環境
※ 是多學科交叉、滲透的產物
三、虛擬醫學信號處理儀器
醫學信號范圍十分廣泛,其中常見的醫學信號有心電、腦電、誘發電位、肌電、眼電、胃電、神經脈沖電位、血壓、脈搏波、呼吸波、溫度等信號,它們特點各
不相同,有各自的頻帶、幅度范圍、干擾來源等,因而使得醫學信號處理變得十分復雜。
無論哪種醫學信號儀器,幾乎都涉及到信號放大、採集、分析、處理、濾波等共同的任務,同時不同的信號又具有各自特殊的處理方法,這些共同性和特異性的有機結合,形成集成環境是虛擬儀器的基礎。
由於多參數臨床監護和綜合診斷的需要,醫學信號的採集處理儀器呈現出集成化的趨勢,人們從研製單一功能的醫學信號儀器轉向研製多功能集成化儀器,然而這種集成化並非單功能儀的堆積組合,而是從不同單功能儀器中找出共同點和不同點,形成軟、硬體模塊,將醫學信號處理儀器計算機化,構成醫學信號處理儀器開發環境,即虛擬儀器。
虛擬醫學信號處理儀器是一個頗具具前景的領域,許多醫療儀器公司都看好這一市場前景,投入大量的人力、物力和財力來從事這方面的研究與開發,前面提到的MP100醫學數據採集系統和LabLinc V模塊化虛擬儀器就是其中的傑出代表。
虛擬醫學信號處理儀是開發生產各種醫學信號儀的工具。對於開發者而言,就可以象搭積木似的很快生成專用儀器,節省大量的開發時間和資金;對於用戶而言,可以少花錢,多買儀器。虛擬醫學信號處理儀器為集成化多功能儀器的開發奠定了基礎,而且可以把最新研究成果盡快的應用到儀器中來。另外,虛擬醫學信號處理儀器可以用於對未知信號和信號未知特性的研究,達到快出成果、多出成果的目的。實際上,虛擬醫學信號處理儀器也對當前遠程醫療、醫學電子圖書等熱門研究領域將起到推波助瀾的作用。
四、虛擬儀器相關技術
1、數值計算
在虛擬儀器中,需要提供靈活的數據處理方法,這些方法可根據實際需要由用戶通過編程來實現,為了簡化編程的復雜程度和節省大量的開發時間,在虛擬儀器中應當盡可能多的提供各種數值計算程序,這些數值計算主要有以下幾大方面:
※ 矩陣運算(加、減、乘、逆、轉置)
※ 特徵值與特徵向量計算
※ 矩陣分解
※ 一元、二元插值
※ 數值積分和微分
※ 線性代數方程求解
※ 非線性方程求解
※ 擬合與逼近
※ 特殊函數
※ 回歸與統計
2、數字信號處理
在復雜的儀器中,數字信號處理佔有重要的地位,因而在虛擬儀器中集成各種數字信號處理方法十分必要,數字信號處理方法可分為幾大類:
※ 信號預處理
※ 濾波器設計與濾波
※ 經典譜估計
※ 現代譜估計
※ 相關與卷積
※ 離散變換
※ 數字特徵計算
※ 常用信號發生
※ 信號建模
※ 數據壓縮
3、計算機圖形、圖象學
圖形和圖象是復雜儀器中大量數據的直觀表示,例如靜態和動態腦電地形圖,物體表面溫度分布圖,電磁場分布圖等,它可把原本十分抽象的數據轉換成人們易於理解的直觀表示;另外,數據及其分析結果人們也習慣於用曲線、直方圖、三維圖形、等高線圖等來表示。所以在虛擬儀器中,建立這些數據的圖形、圖象表示模塊是十分必要的。
4、科學計算可視化
前面提到,復雜大量數據的圖形、圖象表示在虛擬儀器中十分重要,然而由數據到圖形的映射並不是簡單的事情,這就是近年來發展起來的科學計算可視化的研究課題。
科學計算可視化的根本目的是把由實驗或數值計算獲得的大量數據轉換成人的視覺可以感受到的計算機圖象。利用圖象把大量抽象的數據有機的組織到一起,從而形象、生動地展示數據所表示的內容以及它們之間的相互關系,幫助人們直接把握復雜的全局,更好地發現和認識規律,擺脫復雜大量抽象數據的困惑。虛擬儀器中科學計算可視化的引入,將給人們展示出儀器的無限魅力,使儀器具備處理和分析大量復雜數據的能力。
5、面向對象的可視化編程
虛擬儀器是一個集成編程環境,用它人們可以很快地生成自己所需要的復雜儀器。所以虛擬儀器既要可編程又要操作簡單,因而人們把面向對象的可視化圖形編程技術引入到虛擬儀器中來。在虛擬儀器中集成了許多功能強大的部件,這些部件用直觀的計算機圖形表示,每個部件都有相應的可控屬性、操作和函數,人們只需把這些部件在計算機屏幕上布置好,設置好相應的屬性,以及它與其他部件的連接關系,即可生成構成相應功能的儀器。
五、小結
虛擬儀器是當前國內外剛剛起步的研究領域,許多高技術公司和研究所都看好這一市場應用前景,紛紛投入大量的人力、物力和財力,加緊開發與研究。虛擬儀器是多媒體計算機的一個重要應用領域,是多學科交叉、滲透的產物,其中濃縮了許多高、精、尖的科學技術。虛擬儀器不是儀器卻高於儀器,它大大縮短了新型儀器的開發周期,節省了儀器開發的費用,它不僅是開發儀器的工具,而且也是進行科學研究的有力手段。虛擬儀器是儀器計算機化的產物,是集成化儀器的基礎,是儀器行業的一場革命,它的研製與開發具有深遠的意義。
⑶ delphi與彩票編程的問題 有追加分!!!!!!!!
朋友,想實現這些功能,任何一種通用語言都可以辦到。甚至使用具有宏編程功能的一些辦公軟體也可以。
我建議你使用Delphi或VB。其開發工具可以使任何初學者都快速上手。並且在顯示上可以優雅地實現。
另外,單就此軟體而言,恐怕將不可避免地使用資料庫。作為個人使用,可採用最簡單的Access桌面資料庫。
我想你的設計意圖大概是,針對歷史數據進行分析和匯總,並給出最接近中獎的一組數字。所以,除掌握開發語言外,你還必須對用於操作資料庫的SQL語言有一定了解。
總結:學習Delphi,Access,SQL。此三種工具在書店有大量相關書籍可供購入。最好找以「Delphi資料庫編程」為核心的書。其中將會提供翔實的常式。1.編程語言和操作系統:Visual c++ (vc) visual baseic vb visual foxpro delphi c++ builder powerbuider;vc.net vb.net;Asp.net java;Windows32 win95,win98,win2000,windows me,windows2000,windowsxp,windowNT/winnt; linux,PDA/windowsCE/smartphone手機/arm/ppc2000/ppc2002; pocket pc2002, ce.net;掌上電腦,嵌入式設備,移動設備;
2.控制項及平台:二維繪圖控制項、2d/3D圖形控制項、三維圖形控制項、矢量圖形控制項、矢量繪圖控制項、圖形中間件、圖形插件、圖形瀏覽控制項,CAD插件、CAD控制項、矢量控制項、GIS控制項、GIS圖形控制項,GIS插件,圖形軟體開發源碼,測繪控制項,視頻CAD,圖形演算法庫、幾何演算法庫、winCE圖形控制項 PDA圖形控制項,源碼、免費下載、軟體試用、編程資源、矢量圖形軟體開發,演算法源碼,c++源碼,SmartPhone,CAD軟體開發,GIS軟體開發,Linux圖形平台,CAD自主平台,CAD開發平台,GIS開發平台,圖形軟體開發引擎,IE圖形控制項,幾何演算法控制項;
3.文件格式解析、文件格式轉換、圖形文件瀏覽、BMP、GIF、ICO、TGA、PCX、WBMP、WMF、EMF,JPEG、PNG、MNG、TIFF、JBIG、PNM,PPM,PGM、RAS,DXF ,DWF(4.0-6.0)、DWG(2.5-2005) 、IGS, MIF,PLT,PRN,HPGL/HPGL2、DGN(8.0), SHP, IGSAT, PS/IGES, PS/STEP, PS/VDA-FS, PS/PRO ENGINEER, PS/ACIS, PS/BOBY SHOP,QCD,SHX字體、TTF字體、SHP字體,LIN,GBR,pat,AutoCAD字體線型,mdf,dwg瀏覽,SVG格式;dwg2005,dwgr14,autocad2005,r14,r15,r18,2006,,GERBER RS-274X
4.資源下載:SHX字體下載,TTF字體,SHP字體,圖庫下載,建築圖庫,電氣圖庫,園林圖庫下載,dwf2dxf.exe,dwg2dxf.exe,hpgl2cad.exe,askern.dll,asocx.ocx,depend.exe,winrar.exe,winzip.exe,zip,rar,mfc42.dll
5.演算法總匯:求交演算法,相切,裁減,直線、圓、弧、橢圓、樣條曲線、函數曲線、曲面、三維消隱、面積演算法、長度計算、體積計算;點雲,不規則體、三角形、找最小區域、查找最大區域、路徑查找、相量、向量、矢量、單位向量、矩陣、矩陣變換,交點、切點、圓心等、解析幾何、線性代數,貝賽爾曲線演算法;坐標變換;
6. 圖形技術匯總:Unigraphics,pro/engineer,i-deas,pkpm,3ds,3dmax,mastercam9.0,dwfsdk toolkit,PRO/E,SOLiDWORKS,AUTOCAD,Intellicad,VisualCASE,SolidEdge,UG,caxa,MDA,catia,powercad,opengl,heidi,acis,ug,microstation,opendwg,opendgn,Freetype,OpenSceneGraph,brlcad,mapinfo,arcinfo,hoops,zlib,solidedge,mdt,gdi++,directX,directdraw,directshow,計算機圖形學,OdDbDatabasePtr,DWGdirect使用;
7. PDM/MRPII/ERP/OA等行業:圖形文件瀏覽、圖檔管理、審圖、批註圖紙、許可權管理、web圖檔管理、xml/rml批註文件 兼容Volo View Express和AutoCAD格式;數字簽名等;redline,rml紅線批註文件,產品數據管理,電子圖紙管理