一月 17, 2014
» FFT in Python

想知道一段訊號的頻譜,實務上我們會運用數位訊號處理,對這段訊號抽樣,得到一段時間序列;並計算時間序列的離散傅立葉轉換(Discrete Fourier transform, DFT)。然後據以估算出離散時間傅立葉轉換(Discrete-time Fourier transform, DTFT),最後再視需要,將頻域橫軸由離散時間的數位頻率(Ωk = ωkTs = 2π fk/Fs)換算回連續時間的訊號頻率(fk)。 張智星老師的 on-line book《音訊處理與辨識》〈離散傅立葉轉換〉這個章節,有許多運用快速傅立葉轉換(Fast Fourier transform, FFT)的教學, FFT 其實就是 DFT 的快速算法。張老師是以 Matlab 作為程式範例;經實際嘗試,我發現可以很容易轉成 Python code ,以下就看看執行結果截圖: 其程式如下:

十二月 16, 2013
» The Art of Design

為甚麼好的設計會來自於差的設計呢? Scott 在 Why Good Design Comes from Bad Design 提到攻讀 CMU Computer Science 博士時選了門介面設計課,第一堂課上他發現一位年輕人素描著隨身聽的各種變異版本,而且圖紙上已經堆積了三、四十種不同考量的版本了。 Scott 於是湊過去問這個小伙子「幹嘛費勁畫那麼多草稿?」,小伙子發楞了好一會才笑著回說: I don't know what a good idea looks like until I've seen the bad ones. 經過時日洗煉, Scott 後來也體會到當初認為多餘的作法,其背後的精神,他提到: Each new idea I sketched out was more informed than the last. Each bad idea

八月 9, 2009
» Python 與 CSV

許多資料,像通訊錄或試算表之類的,很適合列表呈現。而 comma-separated values, CSV是微軟牌視窗軟體存放表格資料常用的檔案格式。這種純文字的檔案格式是以逗號(comma)來為每筆(record)資料的欄位(field)作分隔。 舉個實際的例子,不久前我因論文需要,由 Davis 那取得了 1999 年美國千大企業的董事會成員資料。內容包括這些董事(directors)的公司、職稱、年齡等等。 由於我只關心每間公司的董事有哪些,所以就輕快地以 Python 語寫了一個 function ,要電腦讀入這個 CSV 檔後,順便吐出各公司的董事們: def LoadBoards_v0(fn='direct99.csv'): """Loads directors of companies from a CSV file and

七月 4, 2009
» Be Pythonic -- 字正腔圓說 Python

學任一種語言,要說得道地,關鍵是融入語言的風格特色中,體會語言社群的風土,知道他們的慣用法。 既然 Python 寫的 code 有 executable pseudo code 的美稱,想寫出 Pythonic 的 code ,當然要站在一定的高度,讓寫出來的 code 夠 pseudo... Pythonic 一詞被用來形容合於 Python 慣用法的 code 。Pythonic 的 code 除了讓人們更好理解外,機器執行時,也往往更具效率--語言設計者會絞盡腦汁最佳化語言慣用法的執行效率。這在 Python 這類高階、動態的語言,尤其明顯 :) 幾個 Pythonic 的準則: 讓程式結構盡量扁平(flat) 降低 Loops 的複雜度 少用 counter ,偶爾用一下 iterator 改採 Functional

» Analyze the Sunspots

上次以 Python 搭配 matplotlib 改寫張智星老師傅立葉轉換教學例子。後來逛到 Anders Andreasen 的專文,裡面有個分析太陽黑子活動週期的例子,相同的例子竟然也出現在 Mathworks 展示 Matlab FFT 用法的網頁上。既然大家那麼愛用太陽黑子,我也來攪和攪和,再次以 Python 搭配 matplotlib 改寫: <!--DOCUMENT_FRAGMENT--> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66

» Two Ways to Solve a Problem

這些年下來,我反覆觀察到一個現象:程式員各有一套慣用的方法來克服自己遭遇到的問題,這些解題習慣可區分成兩種,工程師多只專精其一,只有少數能任意在兩者間自在地切換。 在很多情況下,無論程式員採用哪種作法,都可輕易把問題解掉;但是另有一些問題,卻不是這樣隨性而為就解得掉的--這就值得我們好好玩味了…… 以 1..n 的正整數相加這個例子來說,我知道程式員應該利用現成的副程式,以爬說語來寫,應該要長成這樣: n = 100 y = sum(range(1, n+1)) 假裝我們沒有現成的,像 sum 這樣的副程式可用。那麼,一種可能的寫法如下: y = 0 for i in range(1, n+1): y += i 這是標準的合成(Synthesis)法。以這個例子來說,如果不考慮時間複雜度要 O(n) ,這個方法其實

六月 7, 2008
» Make a Secure Code Server

來這混吃也七個月有餘了,初到公司時正逢新 IC 開發,我受命寫了工具程式以驗證功能,完成了 Boot Loader 以執行外部程式,也開發了應用產品的 firmware 以提供下游客戶 total solution ~~ 接單量產、功能穩定後,準備接手的同事人竟然在新竹--先前架的 code server 一直都只在台北這邊的內網使用,安全無虞,現在既然要跨到外網了,當然得提防封包被監聽…… 原先架設的版本控制系統 SVN 及搭配的問題追蹤系統 Trac ,兩者都是透過 HTTP 協定和用戶端連線,現在為了隱密地傳輸資料,最直接的方案就是改走 HTTPS (HTTP over SSL)協定。 要讓我們的網頁伺服器 Apache 支援 HTTPS ,最省事的作法就是安裝 Apache 時就採用整合了 SSL 的安裝包。很不巧的是我之前用的安裝包是 no_ssl 的版本,所以得

九月 21, 2007
» SVN & Trac Installation 備忘

上週一(9/10)公司要我把 Subversion 環境架起來。除了很高興公司也打算採行版本控制環境來幫助程式開發外,我還打算一併把 Issue Tracking 系統掛上去。 說起 Issue Tracking System,要跟 Subversion 搭配良好,且一樣是 freeware 的,當然非 Trac 莫屬。細查之下,乖乖, Trac 竟然要裝那麼多相關套件,且各個套件還要挑正確版本,才可運作良好。 為了避免大家(或將來的自己)白走冤枉路,這裡把要安裝的東西及安裝步驟條列於後: Download 反正就把下列連結清單中的檔案都抓下來,待會再一口氣安裝。 TortoiseSVN-1.4.5.10425-win32-svn-1.4.5.msi see http://tortoisesvn.net/downloads for other version

七月 4, 2007
» Logo 也 3D

前陣子 survey 描述機器動作的程式語言時,看到幾個賣像不錯的 Robot 產品,竟不約而同地,都說 Logo 語。 經過一連串的 google 、到處點閱後發現:原來 Logo 早已跳出原先的認知,不再只是給小朋友玩的烏龜繪圖了! 一直以來,我對 Logo 語言並不陌生,因為手邊好些科普書都有提到,例如: 《電腦如何思考》p53 ,Hillis 以 Logo 為例子,說明程式語言的威力; 《沙地上的圖案》p136 ,〈作為藝術家的烏龜,The turtle as artist〉這節說明了 Papert 的 Logo 及其 Turtle Geometry ; 《MIT 媒體實驗室》p181 ,提到了控制 LEGO 積木的 Logo 語言; 《遊習世紀》

五月 26, 2007
» Dynamic Plot on Python

之前介紹 Python 在複雜網路模擬實驗的應用時,曾提到用 matplotlib 來繪製該實驗的圖表。其模仿 Matlab 的繪圖功能,用起來方便,所繪製的圖也在水準之上。有圖有真相,這就秀秀用 matplotlib 為該實驗繪製的兩張圖表: 學長看了後提議:某些實驗邊跑模擬的同時,也把產生的數據動態繪出,效果會更好。 憑著殘留印象,我把相關用法的說明再次翻出來研讀,寫了下列的 Python code 來測試:

五月 20, 2007
» Motor-controlling PWMs

一個脈寬調變(Pulse-width Modulation, PWM)訊號可控制一顆 DC motor 轉速,或決定一具 servomotor 的方向、位置或轉速。在複雜的機器人身上,常用上好幾顆馬達,因而能以一顆微控制器(microcontroller, uC)產生多組 PWM 訊號是非常實用的。 前陣子在 RobotFun.net 論壇看到一群機器人愛好者討論自製串列伺服控制器(serial servo controller, SSC)的討論。後來又在 CSZone 的 Robotics 版跟 happosai 及 MasterChang 討論了「以 uC 產生多組 PWM 訊號」的方法。這次就對這個議題作個整理: Busy Waiting 我們先來看個最直接的作法: <!--Code List 1--> 1: // List 1. PWM loop

五月 16, 2007
» Software Anti-interference

大多數工程製品,零件會變髒、磨損,精密度不如目錄所示。數位電腦是當中的異數,它沒有前述問題,至少它的位元或位元組功能,完全符合廣告宣稱的--當數位混入類比,一切似乎又要跌回原形…… 以機器人來說,它有感測器(sensor)得知類比世界的訊息,訊息處理後,又要餵控制訊號給類比世界的致動器(actuator)。撇開外界原本就混雜各式干擾不說,所使用的致動器,往往就是馬達,其本身是高負載,開關高負載會嚴重干擾控制電路(如果共用電源的話),馬達運轉時,尤其是電刷部份,也會持續產生雜訊。這些雜訊除了會影響感測電路及控制訊號外,有時 uC 本身也會因為這些干擾而錯亂。 為了維持機器正常運作,除了硬體設計時把雜訊納入考量外,軟體也不可坐以待斃。以下整理一些簡單、低階的軟體抗雜訊手段: 對輸入訊號濾波 資料冗餘與查驗(data redundance and verification)

五月 11, 2007
» Programming as a Specialist Doing

William 在〈軟體的庖丁解牛能力〉中引述了 Peopleware 第 29 章的話: 工作流程愈是獲得改善,工作內容就愈艱難……一、沒有被替除掉的工作,就是更加知識密集、需要更多技術與經驗……二、經過改善的工作流程,讓你能夠面對更艱難挑戰,而你也會面對這些挑戰…… 當工作流程獲得實際改善,我們也同時需要更多更有能力、更有經驗的員工。 William 後來特地在〈工作流程愈是獲得改善,工作內容就愈艱難〉附上了這段話的原文,有興趣可以自行參閱。 這裡我就不談工作流程了,只談談作為一門專業,程式設計有哪些值得我們關注的小細節: Coding Style 這裡不捲入哪種 Coding Style 較好的爭論。只強調一點,選擇特定的 Coding Style ,是為了要把程式的邏輯結構強調出來,使其看起來條理分明。並不是為了排版的好看與否。 這方面議題,就我所知,寫得最好的

三月 9, 2007
» Boost to Python

前陣子費了番功夫評估可用於複雜網路模擬實驗的工具。這些實驗,除了圖論用得特別兇外;一些隨機抽樣的東西也會用上;此外,實驗數據,也要有工具幫忙繪製圖表。 我先後評估了 Java, C/C++, Pyhon 等開發環境,看看它們有哪些 Library 可用?這些 Library 的成熟度如何?架構優不優雅?說明文件完不完整?使用方不方便? 一開始,我評估了下列的 Graph Theory Library: Boost Graph Library, BGL (C++) Graph Template Library, GTL (C++) LEDA graphs (C++) The Standford GraphBase (C) JGraphT (Java) Java Universal Network/Graph Framework, JUNG (Java

» Graph-based Modeling on Python

Agent-based modeling 的電腦實驗,最核心的架構不外乎一個大迴圈(super loop)包裹著一群規則。大迴圈每跑一輪,系統就更新一次狀態,就如同時鐘的滴答(tick)聲般。通常系統每次滴答都會收集一次統計資料。這類實驗,有許多現成的 famework 可用,如最經典的 Swarm 及其後進 Repast ,還有我模仿 Repast ,自己搞的一個 ,它們都提供了 start, pause, stop 等流程控制的介面。 模擬複雜網路,也可以套用 Agent-based modeling 架構。不過諸如網路的群聚度(clustering coefficient, C)及網路特徵的路經長度(characteristic path length, L)等統計數據計算需耗費的時間,隨著網路的規模成長很快,所以不適合運作太頻繁。

三月 7, 2007
» Console I/O Without OS

在〈Debugging Embedded Systems〉中曾建議:把 uC 的 UART 跟 PC 的 serial port 第一時間 link 起來,然後就可以在適當的地方 print out 一些訊息,幫助我們確認程式的執行狀況。 這個廣為採用的作法,在沒有 preemptive multitasking OS 支援下,很容易因 print out 的訊息太多,使系統 delay 過久。這在許多場合是無法接受的。一個常見的例子是同時處理另一個網路連線下,許多 protocol 都嚴格限制裝置回應時間。 解法也很簡單,只需把要 print out 的東西丟到 queue 中,然後再拆成一個個 char ,找時間分批餵給 PC 就好了。這叫「化整為零」:P Renesas H8 系列 HEW 開發環境底層就有兩個分別被 stdin/stdout function 群共用,

biggo.com.tw

A Django site.