近年來電腦虛擬儀器的發展很快。在飛速發展的計算機技術支持下,“軟件即儀器”的理念得到了充分的發揮。計算機加軟件配合合適的AD/DA界面和傳感器/控制器,就可以完成形形色色的傳統儀器的所有功能,應用領域遍及現代科技的各個方面,大有星火燎原之勢。而且由于其成本較低,升級容易換代快,維護簡單,特別是數據的采集、分析、管理做到了智能化,大大提高了工作效率,在科研、計量、工控、自控等應用上特別受青睞,發展勢頭已將傳統儀器遠遠拋在了后面,并將持續下去。但是一般的虛擬儀器對于普通電子愛好者來說仍然是太昂貴了,而且由于通用的虛擬儀器要考慮高速信號,往往采用高速低分辨率的AD/DA芯片,一般分辨率只能達到8至12位,這對于電子愛好者常用的音頻領域恰恰不夠精確。在現代多媒體電腦上,聲卡已經成為一個必不可少的重要組成部分,它給我們提供了豐富多彩的視聽娛樂和有聲交流功能,使“多媒體”的名稱名副其實。但是你是否知道,利用聲卡高精度的AD/DA變換界面,加上合適的軟件,就可以構成功能十分強大的音頻(超音頻)虛擬儀器呢?并且,如果使用足夠好的聲卡,配合比較簡單的擴展設備和傳聲器/放大器,再選用本文介紹的軟件,將是目前音頻虛擬儀器的最強、最佳選擇。限于篇幅和時間,本文主要介紹一些原則性的測試方法,期望起到拋磚引玉的作用,給有興趣的愛好者引個路。具體的應用還需要大家不斷學習、探索,詳細的軟件應用方法將在2004年《無線電》雜志以及本站連續刊登介紹。1.聲卡的選擇聲卡擔負著模擬信號進出大門的重任,其性能如何,對虛擬儀器的精度有著最直接的影響,因此選擇合適的聲卡是非常有必要的。從分辨率看,一般電腦多媒體聲卡為16位,取樣頻率為44.1/48KHz,而現在的主流中高檔聲卡大多具備了96KHz/24bit的取樣精度,好的專業聲卡甚至能達到輸入/輸出兼備的192KHz/24bit取樣精度。從音頻處理的技術指標看,許多質量良好的廉價聲卡已經超越了一般模擬儀器,而高檔的專業聲卡更是具有極其優異的指標。這也不奇怪,因為專業聲卡本身就是為專業的錄音、監聽、音頻處理而設計的,是音頻傳播的門檻,理應具有良好的素質。例如,頂級的專業聲卡頻率響應可以從幾Hz平坦地延伸到數十KHz至接近100 KHz,波動在正負0.1dB以下,噪聲水平在-110dB以下,動態范圍大于110dB,總諧波失真和互調失真遠小于萬分之一,通道分離度能達到100dB……這樣的聲卡已經超越了絕大多數模擬設備的指標,足以應付最苛刻的應用要求,也足以勝任高精度電腦音頻虛擬儀器的要求,乃至于數十KHz的超聲波研究。當然了,頂級的專業聲卡價格昂貴,一般相當于一套主流電腦的價格,大多數業余愛好者不能或不愿承受,但比起模擬測試儀器來說還是便宜很多,而且軟件升級沒有限制。不過近來電腦音頻設備市場看好,許多專業聲卡廠家推出了“準專業”聲卡進軍多媒體市場,素質良好,支持多聲道,價格也便宜很多,用途廣泛,很適合業余愛好者選用。如果再“摳門”一點,精選百元級優質聲卡也是可以應付一般的聲學測量的,因為我們知道聲學測量的瓶頸一般在于傳聲器而不是電路。當然這時最好對聲卡模擬電路進行“打摩”如更換運放和輸出電容等,以得到更好的效果。介紹一些具體的聲卡品牌。頂級聲卡首選Lynx Two/Lynx 22,據筆者所知是目前世界上指標最優秀的聲卡,價格一千美元左右。類似的其它專業聲卡有RME,比Lynx還貴(主要因為支持的聲道數多)。另外如果單為測試用,一些專業的測試用AD/DA界面設備也可用(例如Sound Technology公司的產品),不過可能更昂貴,而且功能少,指標也未必更強,但好處是可以找到USB接口型的,可配合筆記本電腦使用。這類聲卡可以進行精確的電路測試,如作為其它聲卡、碟機、功放等設備的輸入輸出參考標準進行測量,聲學測試更是不在話下。
上傳時間: 2013-10-13
上傳用戶:zhengjian
注:1.這篇文章斷斷續續寫了很久,畫圖技術也不精,難免錯漏,大家湊合看.有問題可以留言. 2.論壇排版把我的代碼縮進全弄沒了,大家將代碼粘貼到arduino編譯器,然后按ctrl+T重新格式化代碼格式即可看的舒服. 一、什么是PWM PWM 即Pulse Wavelength Modulation 脈寬調制波,通過調整輸出信號占空比,從而達到改 變輸出平均電壓的目的。相信Arduino 的PWM 大家都不陌生,在Arduino Duemilanove 2009 中,有6 個8 位精度PWM 引腳,分別是3, 5, 6, 9, 10, 11 腳。我們可以使用analogWrite()控 制PWM 腳輸出頻率大概在500Hz 的左右的PWM 調制波。分辨率8 位即2 的8 次方等于 256 級精度。但是有時候我們會覺得6 個PWM 引腳不夠用。比如我們做一個10 路燈調光, 就需要有10 個PWM 腳。Arduino Duemilanove 2009 有13 個數字輸出腳,如果它們都可以 PWM 的話,就能滿足條件了。于是本文介紹用軟件模擬PWM。 二、Arduino 軟件模擬PWM Arduino PWM 調壓原理:PWM 有好幾種方法。而Arduino 因為電源和實現難度限制,一般 使用周期恒定,占空比變化的單極性PWM。 通過調整一個周期里面輸出腳高/低電平的時間比(即是占空比)去獲得給一個用電器不同 的平均功率。 如圖所示,假設PWM 波形周期1ms(即1kHz),分辨率1000 級。那么需要一個信號時間 精度1ms/1000=1us 的信號源,即1MHz。所以說,PWM 的實現難點在于需要使用很高頻的 信號源,才能獲得快速與高精度。下面先由一個簡單的PWM 程序開始: const int PWMPin = 13; int bright = 0; void setup() { pinMode(PWMPin, OUTPUT); } void loop() { if((bright++) == 255) bright = 0; for(int i = 0; i < 255; i++) { if(i < bright) { digitalWrite(PWMPin, HIGH); delayMicroseconds(30); } else { digitalWrite(PWMPin, LOW); delayMicroseconds(30); } } } 這是一個軟件PWM 控制Arduino D13 引腳的例子。只需要一塊Arduino 即可測試此代碼。 程序解析:由for 循環可以看出,完成一個PWM 周期,共循環255 次。 假設bright=100 時候,在第0~100 次循環中,i 等于1 到99 均小于bright,于是輸出PWMPin 高電平; 然后第100 到255 次循環里面,i 等于100~255 大于bright,于是輸出PWMPin 低電平。無 論輸出高低電平都保持30us。 那么說,如果bright=100 的話,就有100 次循環是高電平,155 次循環是低電平。 如果忽略指令執行時間的話,這次的PWM 波形占空比為100/255,如果調整bright 的值, 就能改變接在D13 的LED 的亮度。 這里設置了每次for 循環之后,將bright 加一,并且當bright 加到255 時歸0。所以,我們 看到的最終效果就是LED 慢慢變亮,到頂之后然后突然暗回去重新變亮。 這是最基本的PWM 方法,也應該是大家想的比較多的想法。 然后介紹一個簡單一點的。思維風格完全不同。不過對于驅動一個LED 來說,效果與上面 的程序一樣。 const int PWMPin = 13; int bright = 0; void setup() { pinMode(PWMPin, OUTPUT); } void loop() { digitalWrite(PWMPin, HIGH); delayMicroseconds(bright*30); digitalWrite(PWMPin, LOW); delayMicroseconds((255 - bright)*30); if((bright++) == 255) bright = 0; } 可以看出,這段代碼少了一個For 循環。它先輸出一個高電平,然后維持(bright*30)us。然 后輸出一個低電平,維持時間((255-bright)*30)us。這樣兩次高低就能完成一個PWM 周期。 分辨率也是255。 三、多引腳PWM Arduino 本身已有PWM 引腳并且運行起來不占CPU 時間,所以軟件模擬一個引腳的PWM 完全沒有實用意義。我們軟件模擬的價值在于:他能將任意的數字IO 口變成PWM 引腳。 當一片Arduino 要同時控制多個PWM,并且沒有其他重任務的時候,就要用軟件PWM 了。 多引腳PWM 有一種下面的方式: int brights[14] = {0}; //定義14個引腳的初始亮度,可以隨意設置 int StartPWMPin = 0, EndPWMPin = 13; //設置D0~D13為PWM 引腳 int PWMResolution = 255; //設置PWM 占空比分辨率 void setup() { //定義所有IO 端輸出 for(int i = StartPWMPin; i <= EndPWMPin; i++) { pinMode(i, OUTPUT); //隨便定義個初始亮度,便于觀察 brights[ i ] = random(0, 255); } } void loop() { //這for 循環是為14盞燈做漸亮的。每次Arduino loop()循環, //brights 自增一次。直到brights=255時候,將brights 置零重新計數。 for(int i = StartPWMPin; i <= EndPWMPin; i++) { if((brights[i]++) == PWMResolution) brights[i] = 0; } for(int i = 0; i <= PWMResolution; i++) //i 是計數一個PWM 周期 { for(int j = StartPWMPin; j <= EndPWMPin; j++) //每個PWM 周期均遍歷所有引腳 { if(i < brights[j])\ 所以我們要更改PWM 周期的話,我們將精度(代碼里面的變量:PWMResolution)降低就行,比如一般調整LED 亮度的話,我們用64 級精度就行。這樣速度就是2x32x64=4ms。就不會閃了。
上傳時間: 2013-10-23
上傳用戶:mqien
優秀的木馬程序,自己看吧
上傳時間: 2015-01-05
上傳用戶:leixinzhuo
一個很好的移植 大家共享
上傳時間: 2014-01-05
上傳用戶:youmo81
原創VB+SQL影音租賃系統 醮簡單 具體看里邊的文本文檔
上傳時間: 2014-01-18
上傳用戶:yy541071797
學員管理系統!值得一看!
標簽: 管理系統
上傳時間: 2015-01-07
上傳用戶:wfl_yy
J2ME的動畫制作程序, 在很短的時間內, 連續在同一個位置畫上好幾張圖, 最適合的時間是在一秒中內畫20到30張圖, 這樣的效果是讓用戶看起來會有不間斷的感覺.
上傳時間: 2015-01-07
上傳用戶:風之驕子
對文件產生md5摘要.文件是否被修改一看就知。
上傳時間: 2013-12-18
上傳用戶:咔樂塢
可以看動畫的多線程applet
上傳時間: 2014-01-07
上傳用戶:璇珠官人
自己看吧
標簽:
上傳時間: 2013-12-08
上傳用戶:shus521