天天看點

碼分多路複用

引子: 

CDMA是個很重要的通信概念,很多的大學教科書上都會提到它,甚至我們今天可能都在使用它。然而提到cdma,很少有資料提到它的思想是多麼的有創意,教科書上關于cdma的章節都過于複雜,過于數學化,雖然也有一些簡便的描述方式,但是卻幾乎沒有資料揭示cdma是多麼的簡單,實際上它比其他很多的概念都要更簡單。

     如果僅僅希望了解諸如cdma的概念而不得不去學習一大堆數學是很悲哀的事情! 如果最終你費了九牛二虎之力把數學推理過程搞明白了,你對數學本身的了解将超過你對cdma的了解,本來數學僅僅是為了幫忙了解cdma,可是最終卻反客為主了。我認為了解一個概念最好不要從數學開始,數學化的東西隻是一個總結,一種表述方式罷了,正如音樂的實質不在五線譜原理和簡譜助記法而在旋律本身一樣,我敢肯定任何科學理論的提出都不是從數學開始的,但是卻總是歸于數學,正如任何偉大的音樂作品隻從音樂本身開始,偉大的美術作品的作者不需要事先研究配色原理一樣。記住,數學隻是工具! 

一.開始吧,從吉普賽紙牌開始 

小的時候,我們都玩過吉普賽紙牌,用來算自己某天會不會有“桃花運”,這種紙牌算出來的桃花運像魔咒一樣,使腼腆的你對你喜歡的小女孩說“我喜歡你”(我就這麼玩過,結果很尴尬...),不知道為什麼這種遊戲現在沒有人玩了。表面上每張牌上寫滿了亂七八糟的文字,如下圖:

碼分多路複用

然而當你用一張挖有小洞的紙牌罩在寫滿字的紙牌上的時候,你會發現上面寫着一句話,如下所示:

碼分多路複用

這種遊戲也許和我們現在玩的《憤怒的小鳥》之類的相比有點傻,然而它确實是一個古老的遊戲,本文的目的不是為了揭示遊戲原理,而是它有助于我們了解cdma。

     我們把寫滿檔案的紙牌看做是“僅有一個有效信号,其它對于接收者來講全是噪音”的疊加信号,而挖有小洞的紙牌就是配置設定給每一個人的“碼”,每一個“碼”都不同,是以當用這些碼罩到疊加信号上時,能顯示出的隻是我們感興趣的資訊,比如“你有桃花運”。就這麼簡單,所有的信号盡管發過來好了,我不怕幹擾,因為我用我的“碼”可以解出發給我的資訊。

     顯然,如果一張牌上能寫100個字,每句有意義的話有5個字,那麼我們就可以設計出20張挖有小洞的紙牌作為“碼”,每張紙牌上有5個洞,能通透5個字。如果沒有“碼”,100個字看起來就是亂碼,是以這種方式還起到了一定的資訊加密的作用。20個碼分給20個人,就可以通信了,在和對方交換資訊前,先用對方的碼把資訊填到相應的位置,對方收到後就自己的碼往紙牌上一罩,結果就出來。

     所謂的碼分多址最終就歸于一副吉普賽紙牌上。很簡單吧 

二.好吧,再看看别的例子 

除了吉普賽紙牌,其實我們每天都在接觸碼分多址:

1.大學剛開學的時候,軍訓時,在火車上,飛機上,大家聊天時,你能一耳朵聽出誰是你的老鄉,因為有時候别人使用的方言你根本聽不懂,也就是說你沒有了解那種語言的“碼”,我們的大腦中天生擁有一種過濾母語或者方言的“碼”!

2.長途旅行中,你很困,旁邊的兩個家夥叽叽喳喳說個不停,如果他們使用你聽不懂的語言,你照樣能睡着,但是如果他們說的是國語,那你就完蛋了,那就忍耐吧 

三.該我們自己設計了 

大自然已經設計了我們的大腦這種高度複雜的“碼分多址裝置”,我們當然使用這個裝置也能造出一個克隆體,如果我們就是上帝,那麼我們希望造出和我們一樣的東西,是以碼分多址技術是必然要出現的,如果你不承認它是一種創意,起碼它也是我們自身的印照! 

     通過吉普賽紙牌,我們發現,碼分多址的要點在于諸多的“碼”本身是不能互相幹擾的“掩碼”,它有兩個特點:

一是碼之間兩兩不能互相幹擾(因為不能在紙牌的一個位置寫下兩個不同的字); 

二就是它們是掩碼,所謂的掩碼就是将不需要的資訊“掩去”。 

這就是要點,我們隻要能設計出類似的編碼規則就可以了,這難道很難嗎?

     了解了上述的“碼”的兩個基本特征之後,接下來再考慮數學實作也不遲,我當然還是試圖不使用數學,期望在全文中不提什麼“沃爾什函數”,“正交”,“卷積”之類的概念,可是我覺得還是有必要闡述一下,因為第一,正交的概念真是太美了,一下子就把上述兩個特征都實作了;第二,不使用那些複雜的推導過程也能了解上述的數學概念,沒有學過微積分和矩陣原理也沒有問題。 

四.為什麼需要數學 

任何領域幾乎都需要數學,數學确實是一個好東西,它不僅僅是一種工具,它還是一種大腦訓練操。因為它足夠抽象 ,能夠很友善的模組化,使各領域的設計師将精力集中在該領域本身,純邏輯和純理論抽象的部分交給數學來解決,由于現代數學是建立在一整套很嚴密的邏輯的基礎上的,是以它的結論一般不容置疑(當然不要考慮哥德爾考慮的問題,那是數學家和邏輯學家的工作),而且在數學推理過程中,可以排除特定領域的概念幹擾,比如在基于牛頓第二定律計算運動物體速度時,可以排除接觸面粗糙程式,阻尼等實體概念。數學完全符合高内聚低耦合的特征, 是以雖然數學看起來很令人讨厭,然而當你熟悉了它之後,它真的很有趣!能使我一心一意工作的誘惑有兩個,一個是加薪,另一個就是數學,真的是這樣(雖然平時不怎麼使用數學,然而數學帶來的不是知識本身,不是會背幾個公式知道幾個名詞,值得享受的是思考的過程和從中總結出的“道”)。

     然而切記,隻有兩種情況下使用數學,一種是你在體驗數學本身,二是你使用它描述或者解決問題,并且此時你已經徹底了解了問題的本質。(有些頂級草根黑客認為代碼需要想到及寫出,然後慢慢修改調試,正如畫油畫一樣,而大部分公司的經理卻厭惡這種論調,他們總希望你在編碼之前先送出一堆文檔,然後等到最後再用最短的時間編碼,這也許就是藝術和技術的差別吧?)

五.先從最簡單的情況看起 

如果問一個國中生,力是如何合成的,如何分解的,他會馬上說出矢量,正交,坐标系,cos,sin等概念,既然國中生都明白力是怎麼合成的,那麼咱們作為一群大學都畢了業好幾年的家夥,怎能不知呢?你如果否定,那既然你知道力是如何合成和分解的,怎麼就不能了解碼分多址呢?

     考慮最簡單的隻有兩個碼的碼分多址中,疊加的信号就是一個兩個個力的合力矢量,而特定使用者解出的屬于自己的資訊就是該合力在一個坐标軸上的分力,他們使用的“碼”就是坐标軸上的機關矢量,且坐标軸是正交的(互相垂直的笛卡爾坐标系)。如下圖: 

碼分多路複用

很簡單吧,實際上也真是這麼簡單。回憶吉普賽紙牌,是不是很一緻呢,我們可以設紙牌上可以寫20個字,一個作為碼的紙牌上可以挖10個洞,隻要兩張挖洞紙牌上的洞的位置不重合,那麼可以認為這兩張挖洞紙牌就是正交的。第二個特征是掩碼,實際上可以通過正交推理出來,因為正交概念本身就是井水不犯河水的關系,順着笛卡爾坐标系的x軸向原點望去,你隻能看到y軸,而看不到x軸,反過來沿着y軸向原點看,你也隻能看到x軸,是不是掩碼的意思呢?一個正交的概念解決了兩個問題。如下圖:

碼分多路複用

以合力解釋這個疊加資訊的編碼是很容易了解的,合力僅僅是實際力的合成,是實際力-垂直力和水準力的承載體,以力的效果來說明它們互相不幹擾就是:水準力不會造成實體在垂直方向有位移,垂直力也不會造成物體在水準方向有位移,應用在資訊上,使用者A使用碼X編碼的資訊i1和使用者B使用碼Y編碼的資訊i2最終疊加成了I,也就是合力,然而某一使用者如果使用碼X将資訊I分解,它得到的将是i1,對i2絲毫沒有影響,為什麼呢?因為碼X和碼Y是正交的,正如上述的X軸和Y軸正交一樣。

六.稍微擴充一點正交,沒想到,就這樣結束了 

歸納能力是人類特有的能力,有趣的是,人們歸納曾經發生的過事的目的恰恰是為了預測未來的事。 笛卡爾坐标系是歐幾裡得空間的正交系,它可以解決和解釋大量的問題,然而直到17世紀,數學仍然沒有作為一個獨立的學科發揮巨大的作用,原因正是到那時為止,數學太形象化了,直到微積分和希爾伯特空間被提出來,數學才從具體的學科中被抽出來,專門向更抽象和邏輯性更強的方向發展。 這種發展最終反過來影響着具體的學科,受其影響最大的學科就是實體學和資訊學了。

     如果大家了解了上述的枝枝蔓蔓,此時就可以一頭紮進數學了,但是注意,千萬不要戀戰,點到為止,再次重申,數學隻是工具,除非你想專門研究它!

     既然二維的笛卡爾正交系可以抽出兩個正交量進而形成兩個所謂的“碼”,那麼如果有一個正交系有N個正交量,那麼不就是說有N個“碼”了嗎 ?是的,确實正确!并且這樣的正交系是存在的,數學作為工具在此發揮了作用。

     要講述正交的概念,很多教科書本着先導出概念的原則先講述了向量,然後講述了内積之類的概念,最終告訴你内積為0的兩個向量是正交的,當你得到這個答案的時候,你可能已經被内積以及之前的概念搞糊塗了,或者已經厭煩了,已經忘記了當初為何需要知道什麼是正交,以及需要正交的哪些性質,是以這種教育方式對于喜歡科學探索的家夥來講無疑是毒藥!什麼是正交呢?簡單點說兩個正交量肯定是相交的,也就是有聯系的,但是這種聯系很“正”, 也就是除了在交點發生關系之外,其它哪裡都不發生關系,隻要滿足這兩點都是正交的量,對于二維空間,直角坐标系的x軸和y軸在原點相交,它們又彼此垂直,彼此在對方沒有任何分量,是以它們正交。對于超過3個的多個量,隻要滿足“相關聯”,“關系很正”這兩個性質都屬于正交量,是以了解了這一步,我們看看數學語言是如何描述它的,對于連續量,使用積分來描述,對于離散量來講,就更簡單了,如果我們設空間有M個分量,那麼一個向量将表示為:

碼分多路複用

這就是多元空間的正交向量,就這麼簡單。如果我們把這樣的向量作為“碼”分給每一個使用者,那麼使用者用這個向量碼和自己的标量資訊做一個算術乘法,作為結果Rn,Rn顯然也是一個多元向量,然後所有的使用者的這些Rn加在一起:R1+R2+...Rm,最終形成一個M維空間的向量,這就相當于一個合力,資訊到達接收端後,使用者隻需要将“合力”分解到自己的“碼”上就可以了,注意,為了使運算簡單,最好使用機關向量作為碼。

六.構造多元正交向量 

原理就是這麼簡單,可是我們怎麼去構造這麼一組向量滿足式子(1)然後進而配置設定給使用者呢?如果你獨自思考問題到了這個地步,接下來你要幹什麼你自己就很明了了,如果你覺得你是個天才,你就去自己去想個辦法,如果你覺得你隻是想弄明白cdma的原理或者在搞一個新的編碼或者别的,那麼你肯定去閱讀相關的數學資料了。看到了嗎?我們第二次使用數學,前一次搞明白了希爾伯特空間向量,這次我們需要搞到一個簡單的,且能得到多個正交的向量的方法,是什麼呢?哎,最終還是要提到沃爾什函數,Ahha!

     還是我的老原則,那就是先看效果,然後反思,或者說試圖從一個巨人的腳後跟往上爬,最終爬到另一個巨人的肩膀!好了,先看一眼沃爾什向量長什麼樣子吧:

碼分多路複用

【和大多數教科書一樣,我将“1”換成了“+”,将“-1”換成了“-”,沃爾什矩陣中隻有“1”和“-1”】

不管怎樣,先不管它的原理,看看任意兩行或者任意兩列,顯然是正交的,完全符合需求,然後,和那個力的合成和分解一樣,就算就可以了,超級簡單,在了解原理前,我們先看看如何進行cdma的核心編碼,當我們發現其簡單性之後,再來考慮原理,最終我們會為這一切配合的如此完美而歎為觀止!

七.沃爾什編碼的簡單性使得CDMA大有前途 

沃爾什矩陣如何編碼資料呢?我們知道資料都是0和1組成的,這就更好辦了。首先為每一個使用者配置設定一個N階沃爾什矩陣中的一行或者一列(要麼全是行要麼全是列),将資料的0,1序列和向量相乘,這是純粹是标量和向量的乘法,乘以分量即可,...(當然事實上沒有這麼簡單,編碼問題什麼時候都是很複雜的,然而本文主要幫助大家了解cdma的本質,而不是研究如何編碼)。我以一個執行個體結束核心讨論:

1.使用者1的碼:a1=(-1 -1 -1 -1 1 1 1 1)--第2行

2.使用者2的碼:a2=(-1 1 -1 1 1 -1 1 -1)--第7行

3.使用者1的資料:d1=110

4.使用者2的資料:d2=010

下面開始編碼過程,假設發給使用者1和使用者2的資料疊加在一起,使用者1的資料最終成為:

(-1 -1 -1 -1 1 1 1 1)|(-1 -1 -1 -1 1 1 1 1)|(0 0 0 0 0 0 0 0) 【前面的|隔開的是使用者1的三位資料編碼後的結果,每一位使用者資料都是标量,和碼相乘,結果還是向量】;使用者2的資料最終為:

(0 0 0 0 0 0 0 0)|(-1 1 -1 1 1 -1 1 -1)|(0 0 0 0 0 0 0 0) ,二者疊加後為:

(-1 -1 -1 -1 1 1 1 1)|(-1 -1 -1 -1 1 1 1 1)|(0 0 0 0 0 0 0 0)

(0   0  0  0 0 0 0 0)|(-1 1 -1 1 1 -1 1 -1)|(0 0 0 0 0 0 0 0)

_______________________________________________________________

(-1 -1 -1 -1 1 1 1 1)|(-2  0 -2 0 2 0  2 0)|(0 0 0 0 0 0 0 0) 

最終結果是:

(-1 -1 -1 -1 1 1 1 1)|(-2  0 -2 0 2 0  2 0)|(0 0 0 0 0 0 0 0) 

這個疊加的資料同時到達使用者1和使用者2,使用者1解碼的過程實際上是一個“力的分解”過程,如果是二維的情況,如果我們知道有一個“合力”是(a b),那麼要求在x軸上的投影向量,我們該怎麼辦?其實我們不必求投影向量,隻求投影的長度即可,畢竟被編碼的資料是标量啊!這就更簡單了,随便問一個國中生估計能得到最簡單的答案。答案就是:L乘以夾角的餘弦值!

     然而對于多元向量而言,L是不易的,因為多元向量不好用【勾股定理】 (我更喜歡用畢達哥拉斯定理這個詞)。那麼怎麼辦呢?向量的事最好由向量自己解決,記住,有很多我們中學時學習到的定理或者公式都是不适合高維空間的,畢竟那是古人經驗(計算車輪子的長度,計算橫梁)或者純思辨哲學(蘇格拉底,柏拉圖,亞裡士多德的時代)的成果,那時數學還沒有抽象到希爾伯特時代的程度,是以我們還是用現代的方法吧!現代的方法為:

碼分多路複用

是以忘掉中學時的知識吧。如果我不進一步說明上述的公式是怎樣導出的,我還是落入了俗套,是以,我給出簡單的推導,哪怕是一點指點迷津的思路也行:

碼分多路複用

起初資料為k,然後和資料r一起被編碼并且疊加在一起,最終又恢複了k,一切使用的都是矩陣的加法和乘法運算,最幸運的是,這些運算都是很簡單的。

     CDMA的本質了解了嗎?實際上,這種方式如此簡單的解決了碼分多址編碼問題,使用了這種方式之後,可以巧妙繞開那些相對複雜的變換或者逼近,比如傅裡葉變換和離散餘弦變換,因為再也不需要那種方式了,使用CDMA的方式可以使得頻譜越寬越有效,而且再也不用靠增加功率來傳輸信号啦,擴頻通信由來于此! 

     那麼沃爾什矩陣究竟是怎麼來的呢?可能是沃爾什本人靠他天才的大腦想出來的,也可能...最重要的是,如果了解了哈達瑪矩陣的話,了解沃爾什矩陣就簡單多了,因為哈達瑪矩陣是沃爾什矩陣的一種表述方式,它的最重要的特征就是其遞推性,從低階的矩陣可以推導出高階的,而且生成原則很簡單,僅憑如此它就比其它的編碼方式更具優勢,更别說它的碼分多址特性了。 

八.凱撒加密和擴充的凱撒加密

在古代,如果手持一張羊皮紙,上面寫着亂七八糟的文字,然後如果有一個人拿着一張打着窟窿眼的羊皮貼到寫字的羊皮上之後,就能複原資訊,窟窿眼在不同的位置,資訊呈現就會有所不同,這是一種資料加密的方式,同時也是一種資料複用的方式,這叫什麼呢?其實這就是碼分多址 啊!是以碼分多址天生就和加密不可分,這種編碼方式天生具有安全性,究其深層原因,實質在于“碼”本身參與了編碼,而碼是特定區間内使用者唯一的,這個碼可以了解成密鑰,也可以了解成收發方作為一個整體共享的私鑰!

徹底了解了碼分多址的本質之後,發現它的簡單性以及優美原來來源于它靠向量本身編碼,我們提到向量覺得起碼得要二維才行,實際上我們更希望從1開始,想想看,一維數軸上的數字難道不是向量嗎?如果我們使用一維的向量來進行編碼,實際上就會發現這原來就是擴充的凱撒加密運算。

     什麼是凱撒加密呢?簡單的說,凱撒加密需要一個10進制的數字k作為密鑰,然後初始資訊的每一個字母編碼為其在字母表中位置加上k的位置處的字母。 

     擴充的凱撒加密就是使用一個序列a1,a2,a3,...aM作為密鑰,然後将待加密的字母序列中每一個字母bN編碼為字母表中其所在位置加上aN的位置處的字母, 是不是和本文開始處的吉普賽紙牌很相似呢?沒有挖洞的吉普賽紙牌我們看不懂寫滿文字的吉普賽紙牌中的資訊含義,是以吉普賽紙牌天生就有保密性的特性,且它和凱撒加密法又是如此相似,并且,更簡單的一個例子,如果一個吉普賽人在中國大罵,我們十有八九聽不懂他們的話,依然會微笑!

繼續閱讀