Pages

2011年5月23日 星期一

[通訊] BPSK錯誤率筆記


BPSK通訊系統的錯誤率分析:

根據下圖:

clip_image002

現在若我們要計算錯誤率,那麼,很簡單,只要計算:傳送端送訊號為0結果接收端收成1。

因為這個錯誤率跟傳送端送1而接收端收成0的機率一樣。

所以根據上圖,可以看出,要計算傳送端送0然後收錯收成1的機率,勢必要先積分一個pdf。這個pdf就是高斯雜訊,將高斯雜訊從0往+1的方向一直積到無限大:(往 ”傳送訊號理當落在的位置”的反方向積分過去)

clip_image004

在這裡要注意,所謂傳送0在BPSK是指送clip_image006,送1是指送clip_image008。所以,如果要用coherent receiver來接收,其整個接收端架構的意義為先對基底向量做內積,求得基底方向的分量,再用一個判斷正負的設備來判斷此分量是大於0還是小於0。

2011年5月22日 星期日

[通訊] M-ary QAM

MQAM
每個點的基底向量分量為sqrt(E0)的整數倍,因此可看出基底向量被離散的振幅所調變,因此為quadrature amplitude modulation。

MQAM2

我們可以從圖發覺,這些點有分成振幅比較大的,跟振福比較小的。

像中間紅色的部分,對Gaussian的pdf取積分,可以得到這部分的正確率是:clip_image002[8]

而信號落在橘色的邊緣,正確率在積分的時候就必須一個高斯從-sqrt(E0)積到sqrt(E0),另一個從-sqrt(E0)積到無限大。這樣造成正確率為:
clip_image002[12]

同理也可以積分算出藍色區域的正確率:
clip_image002[14]

另外,我常常忘記一個很簡單的公式,在此記錄一下:
clip_image002[16]

2011年5月21日 星期六

[Java] I/O:FileReader簡單用法

使用Java的IO都要import java.io.*;
FileReader可以包成BufferedReader,方便readLine()函式讀入一行。
例如:

   String fileName = “in.txt”;   //要被讀取的檔名。
   BufferedReader input = new BufferedReader(new FileReader(fileName));
   String tmp;
   while((tmp = input.readLine()) != null)
        System.out.println(tmp);
   //…
   input.close();

[軟體] Vim環境設定for Windows

由於喜歡使用vim來當程式撰寫的編輯器,Vim真的很適合長時間撰寫code。因此我終於,還是在windows下灌了Vim了。

在安裝好Vim後,新增一個Path,這個Path為:安裝目錄\Vim\vim73;
如此就可以在cmd下執行vim。例如假設安裝Vim在C:\Program Files\Vim,則Path設定就為:C:\Program Files\Vim\vim73;

接著就是一些偏好設定:
更改vimrc這個檔案就可以設定vim環境。在Windows下,更改環境設定的檔案是在:安裝位置\Vim
例如安裝位置是在C:\Program Files\Vim,則可以在C:\Program Files\Vim\目錄下找到 "_vimrc” 這個檔案,裡面就可以輸入偏好設定。
vim有趣的是它擁有自己的script,可以用這些script來設定環境參數。以下列出一些我常用的設定:


1.   set nu      “顯示行號
2.   set hls     “set highlight search.
3.   set ic       “搜尋關鍵字忽略大小寫
4.   set ai       “自動縮排
5.   syntax on   “syntax顏色標記啟動
6.   set bs=2 “Backspace可以在插入模式下刪字刪行
7.   statusline設定:目前看不太懂這方面的script。等之後研究好再補上來。

一直覺得Vim的Script真的挺複雜的。

2011年5月20日 星期五

[數學] Structural Induction

以下是我學習Structural Induction過程的一些想法:
Structural Induction是一種證明遞迴定義的方法。而許多遞迴定義根據我目前的學習,都是一個非常原始的初始條件,加上一個類似國中高中學過的若k成立則k+1也成立於這個遞迴定義中。

例如正整數定義就是:(1) 0是正整數。
                                        (2) 如果x屬於正整數,則x+1是正整數。
所以"structural"這個字我在這裡理解為:已架構觀點來做歸納法。這種"架構",就是上述所謂的"初始條件"加 "k成立則k+1成立" 之類的架構。
而且這種架構特別對"連續"的東西很容易去定義。譬如說整數,字串,樹等等。例如說電腦問使用者:"什麼是2的倍數?"
使用者可以回答:(1) 2是2的倍數。  (2)如果有一個數是2的倍數,那麼這個數乘以2也是2的倍數。
這樣電腦就知道:"喔!原來2,4,6,8…都是2的倍數。"
所以目前我覺得這種Structure應該沒有什麼困難的地方,只是一種表示法而已。
所以用Structural Induction來證明遞迴定義時,以我目前學習的結果,我會把遞迴定義看成:(1) A符合條件S  (2) 若B符合S,則跟B有關係的某個東西C也會符合S。
然後把這兩點證明出來,就等於使用Structural Induction完成證明。
以上是我的一些小想法。
                         by Uncle

2011年5月19日 星期四

[數學] mathematical induction and strong induction

記錄一點關於數學歸納法跟strong induction的學習心得。
1.   Mathematical induction高中就有學習過,即:
P(n)是一個propositional function,n屬於正整數集合,則若符合兩個條件:(1)basis of induction成立,也就是說P(1)為ture。(2)當k>=1時,P(k)->P(k+1)。
則根據數學歸納法,對於每個n屬於正整數,P(n)恆成立。
2.   Strong mathematical induction:
這是一種先假設P(n)在n = n0時成立,如果在n>=n0且n<=k的所有n都讓P(n)為true的前提下 –> P(k+1)為true,則根據Strong mathematical induction,對於所有的n>=n0,P(n)為true。
mathematical induction 和 strong induction在邏輯上是equivalent。
為什麼是equivalent呢?我的想法是:mathematical induction是P(1)為真,然後P(1)->P(2),P(2)->P(3),P(3)->P(4),P(4)->P(5)…P(k)->P(k+1)。
而Strong mathematical induction則是:P(n0)為真,然後P(n0+1)->P(n0+2),[P(n0+1)…P(n0+2)]->P(n0+3),[P(n0+1)…P(n0+3)]->P(n0+4)… [P(n0+1)…P(k)]  -> P(k+1)。
所以Strong mathematical induction只是用很多項為真時堆導出下一項,而mathematical induction則是每一項推導出隔壁項,一直到把全部序列都證明到為真。但在Strong induction裡面,每一項的成立其實也可視為隔壁項推導過來的(我是將k視為可以變動)。這是我的想法,希望沒有想錯。
                            by Uncle.

2011年5月18日 星期三

[軟體] FreeCommander

今天在學弟跟學習一套新的免費軟體:FreeCommander。
這是一套類似檔案總管的軟體,然而跟Windows內的檔案總管不同的是,這個軟體有雙視窗、同步更新、許多鍵盤及滑鼠快捷鍵設定、快速以cmd開啟當前目錄、檔案壓縮解壓縮等等許多好用功能。

軟體下載位置:http://www.freecommander.com/index.htm

關於這個軟體的一些好用功能可在官方網站的Guide找到:
http://www.freecommander.com/fc_guide_en.htm

2011年5月17日 星期二

[Windows] MinGW太棒了

習慣使用Linux Shell的我,無意中發現MinGW這個免費的工具,這個工具在Windows下建立起許多編譯器及相關Shell執行環境,也包含了gcc、g++、vim等等常用的東西!

首先到此下載MinGW:http://www.mingw.org/

到左邊的Download納編下載最新的安裝程式,然後安裝過程記得要選從網路上更新package,安裝完成才能順利執行MinGW的Shell。

裝完之後,從開始功能表找到MinGW的Shell主程式,打開後就是類似Linux的終端機了。vim、g++、gcc皆具備好了,實在很棒!!

其實我之所以安裝這個工具是因為codeBlock不知道為什麼不能編譯程式,一查之下好像是沒有GCC,到網站得知有這麼一個MinGW,所以就嘗試安裝。

第一次使用MinGW,記錄此篇文章,希望接下來能用它當成寫程式的主要工具!

2011年5月14日 星期六

[日記] 克服辛苦,是理工研究的一部分

最近常常不想動,因此寫這篇日記。

在C++程式的撰寫裡,通常我見到的程式碼,都是在第一行寫:
      #include<iostream>
      #include<math.h>
      ……
等等,這些是已經寫好的header file,只要include進來,即可使用裡面的函式。

理工的研究,也是先前許多研究者累積一定的成果,之後的研究者使用前人的經驗,這些經驗如同C++的header file,include進來,則可以從這些經驗中產生新的成果。

科學進步,源自於不斷累積。克服辛苦,是理工研究的一部分。

This is my CPU是我做的一首電音,目前我只將這首音樂的結尾做好,並且放上來分享:

This is my CPU 第二次混音

2011年5月11日 星期三

[Java] 聊天程式撰寫需用到的觀念

最近正在用Java撰寫一個可聊天傳檔的程式,撰寫過程記錄以下筆記:

1.  Character類別的isISOControl( )函式,用途是判斷字元是否是ISO Control Character,這個函式參數只有一個,就是一個字元。丟一個字元給此函式,如果字元是ISO Control Character,就回傳true。Control Character是不能顯示的,所以在撰寫聊天程式時,需要注意字元傳遞不能傳遞到控制字元。
2.   使用StringTokenizer,注意一種用法:
假設要設計一種下命令的格式: [command] [命令參數]
則這樣Token的切法必須要以 " \t” (空白或\t)為delimiter切出[command],再用nextToken(“\n")先將delimiter強制改為"\n”,然後把[command]後面的東西全部抓下來。StringTokenizer簡單用法:
    StringTokenizer stn = new StringTokenizer(s, “ \t”);
    if(stn.countToken() >=1) cmd = stn.nextToken();
    argument = stn.nextToken(“\n”);
3.   String類別中,trim的用法:
      s.trim()    // s是一個字串,trim()把s頭尾的空白全部砍掉。
4.   SeverSocket的使用方法:
      Socket其實是一種表格。程式的通訊資料要記錄在此表格內才可以通訊。封包的傳遞過程,需要以Socket表格作為依據來通訊。連線時,兩端連線的電腦可被視為socket。
      ServerSocket類別可以建立一個Sever端的Socket給Server端使用,其中我先研究了ServerSocket的幾個函式:
      (i) accept() :這個函式可以傾聽一個連線要求。舉例如下:
               //現在是站在server這一邊的觀點來看。
               //宣告一個Socket,叫做clientSkt。
              Socket clientSkt;
              // …
              ServerSocket serverSkt;
              //….
              clientSkt = serverSkt.accept();
              //如此遠方有一個人連進我這裡的server,就accept住,
              //然後丟給clientSkt來處理。可是可能有很多人連進來,
              //所以要替每個連線新增一個Thread。
5.   synchronized lock:
      這部份似乎是設計遠端連線程式時的一個困難部分。在不同的Thread運行時可能會要access同樣的資料,這些資料稱為critical sections。因此將critical section用synchronized鎖住,是java撰寫多執行緒程式常用到的方法。
      synchronized又分為兩種,第一種是synchronized method:
      synchronized void UncleFunc( )
      {
          //…
      }
      一個Thread開始執行某個被synchronized住的方法時,要注意一件事:這個Thread目前是在鎖定特定的物件,不是鎖定特定的類別。其他的物件並沒有被這個Thread鎖定。而且鎖定的東西只限於這個UncleFunc(),其他沒有被synchronized的方法就沒有被Thread鎖定。要等Thread執行完UncleFunc( )的內容後,別的Thread才可以使用這個UncleFunc()。
      第二種synchronized稱為synchronized block:
      synchronized(uncleObject)
      {
           //content…
      }
      這種用法,要注意:如果被synchronized的物件是同一個物件,則如此可以保證block內的程式被同一個Thread執行。如果被synchronized的物件是同一類別的不同物件,則block內的程式有可能會同時被多個Thread執行。
      對於synchronized我目前比較少研究,之後會再特別研究Thread執行時synchronized的運用時機。
6.   String類別的substring( )用法:
      可以只放一個參數:"IamUncle”.substring(3)回傳的是"Uncle",3是index,index為3的那個字也會回傳。
       如果丟兩個參數:"IamUncle".substring(3,7)回傳是"Uncl",從index為3開始到index為6的位置全部回傳,注意index為7的字元不會回傳。
7.   Socket類別的getInetAddress()回傳是遠端機器的IP,而這個回傳的IP是InetAddress類別。而InetAddress類別有一個getHostAddress()方法,可以將InetAddress類別所代表的IP轉為String類別。所以可以用下列方法得到IP字串:
      String ipAdd = mySocket.getInetAddress().getHostAddress();
8.   建立起一個Socket之後,這個Socket會有其InputStream和OutputStream,其中InputStream可以包成BufferedReader有助於用readLine()來讀取一整行,OutputStream可以包成PrintWriter有助於直接用print()跟println()等函式。           

2011年5月4日 星期三

[Matlab] 積分

迅速記錄積分的作法:
以下為將y(t)對 t 軸積分。
itg(1) = 0;
for i=1:length(t)-1
   itg(i+1) = itg(i)+y(i)*ts;
end
%t = [0:ts:t0]
%for為什麼要到length(t)-1呢?畫圖理解如下:

itg2
上圖中,itg陣列索引值走到哪,長方形面積就積到哪。所以總共有(length(t) - 1)個長方形,for迴圈只要從1走到3。
而itg的索引值為0時,沒有積任何長方形,itg索引值為1時積了一個長方形,以此類推。