1.4 模擬/dp| 近代通信
走進(jìn)現(xiàn)代通信
香農(nóng)-韋弗模式
構(gòu)建了一個(gè)直線單向的框架,描述了一般化的通信系統(tǒng)的信息傳播過程。此模式包含了信源、發(fā)射器、信道、噪聲、接收器、信宿6個(gè)部分。
信源與信宿:信源即信息的源頭;信宿即信息的歸宿,是接收信息的實(shí)體。這兩個(gè)概念是相對(duì)的,在不同的場(chǎng)景下可以發(fā)生轉(zhuǎn)換,例如,收音機(jī)接收電臺(tái)信號(hào)時(shí)是信宿;發(fā)出節(jié)目聲音時(shí)是信源,此時(shí)聽收音機(jī)的人則成了信宿。
發(fā)射器與接收器:編碼和解碼。
信道和噪聲:
通信方式:雙工、半雙工、單工。
當(dāng)代通信
3G
分為WCDMA、cdma2000、TD-SCDMA
WCDMA和cdma2000屬于頻分雙工方式(FDD),而TD-SCDMA屬于時(shí)分雙工方式(TDD)。WCDMA和cdma2000是上下行獨(dú)享相應(yīng)的帶寬,上下行之間需要一定的頻率間隔做“隔離帶”以避免干擾;TD-SCDMA則上下行采用同一頻譜,上下行之間需要時(shí)間間隔做”紅綠燈“以避免干擾。
4G
LTE
LTE系統(tǒng)引入了正交頻分復(fù)用(OFDM,orthogonal frequency division multiplexing)和多輸入多輸出(MIMO),顯著提高了頻譜效率和數(shù)據(jù)傳輸速率。
根據(jù)雙工方式的不同,LTE系統(tǒng)分為FDD-LTE和TDD-LTE。二者技術(shù)的主要區(qū)別在于空口的物理層上(例如,幀結(jié)構(gòu)、時(shí)分設(shè)計(jì)、同步等)。FDD空口上下采用成對(duì)的、不同的頻段接收、發(fā)送數(shù)據(jù),而TDD系統(tǒng)上下行使用相同的頻段在不同的時(shí)隙上傳輸,TDD比FDD有著更高的頻率利用率。
LTE-A:
LTE-A采用了載波聚合(CA,Carrier Aggregation)、上/下行多天線增強(qiáng)、多點(diǎn)協(xié)作傳輸、中繼、異構(gòu)網(wǎng)干擾協(xié)調(diào)增強(qiáng)等關(guān)鍵技術(shù),能大大提高無線通信系統(tǒng)的峰值數(shù)據(jù)速率、峰值頻譜效率、小區(qū)平均頻譜效率以及小區(qū)邊界用戶性能。所謂多載波聚合,就是將多個(gè)頻段的網(wǎng)絡(luò)信號(hào)聚合起來,相當(dāng)于公路從“單車道”變?yōu)榱恕岸嘬嚨馈啊?/span>

5G
根據(jù)3GPP的定義,5G的三大應(yīng)用場(chǎng)景為eMBB、mMTC、URLLC。eMBB即為增強(qiáng)移動(dòng)寬帶,超高速,為大流量移動(dòng)寬帶業(yè)務(wù)提供支持;mMTC指海量機(jī)器類通信,物聯(lián)網(wǎng);URLLC,低時(shí)延。
一般天線的尺寸為電磁波信號(hào)的1/4波長(zhǎng)為佳。
調(diào)制
從基帶數(shù)字信號(hào)變?yōu)樯漕l信號(hào),需要經(jīng)歷兩個(gè)步驟:
基帶數(shù)字信號(hào)轉(zhuǎn)換為基帶模擬信號(hào)——數(shù)字到模擬;
模擬基帶信號(hào)轉(zhuǎn)換為射頻信號(hào)——低頻到高頻。
(1)模擬信號(hào)調(diào)制(低頻到高頻) 模擬調(diào)制分為幅度調(diào)至和角度調(diào)制
調(diào)幅:用調(diào)制信號(hào)去控制高頻載波的振幅,使其按調(diào)制信號(hào)的規(guī)律變化,用載波的幅度去承載信息,但載波的頻率保持不變。
(接下來的沒看懂) p73
天線發(fā)射
電磁輻射原理
當(dāng)導(dǎo)體上通以高頻電流時(shí),其周圍空間會(huì)同時(shí)產(chǎn)生電場(chǎng)與磁場(chǎng)。按電磁場(chǎng)在空間的分布特性,可分為近區(qū)(電抗近場(chǎng))、中間區(qū)(輻射近場(chǎng))、遠(yuǎn)區(qū)(輻射遠(yuǎn)場(chǎng))。

天線基本原理
沒看懂 算了
無線信道與信道衰落
無噪聲的完美信道——奈奎斯特帶寬
符號(hào)速率(碼元速率)為1/T(每個(gè)碼元的傳輸時(shí)長(zhǎng)為T)時(shí),進(jìn)行無碼間串?dāng)_傳輸所需最小帶寬為1/2T,揭示了帶寬的關(guān)系。
奈奎斯特速率和奈奎斯特帶寬是同一理論的一體兩面,奈奎斯特速率指的是在無噪聲理想低通信道情況下不發(fā)生碼間干擾的最大的符號(hào)速率,其表達(dá)式為:
C=2Hlog2N C為信息傳輸速率(單位 bit/s),H為理想低通信道的帶寬(單位 Hz),N為一個(gè)碼元對(duì)應(yīng)的離散值個(gè)數(shù)(編碼級(jí)數(shù)或多相調(diào)制的級(jí)數(shù))。
奈奎斯特貸款和速度證明了很重要的一點(diǎn),那就是沒有噪聲的情況下,數(shù)據(jù)率的限制僅僅來自信號(hào)的帶寬。奈奎斯特帶寬和速率可以描述為:在無噪聲的理想情況下,如果帶寬為B,那么可被傳輸?shù)淖畲笮盘?hào)速率就是2B;反過來說 信號(hào)傳輸速率為2B,那么頻寬B的帶寬就完全能夠達(dá)到此信號(hào)的傳輸速率。
模擬
5 最長(zhǎng)回文子串
https://leetcode-cn.com/problems/longest-palindromic-substring/
樸素解法
枚舉字符串
回文串長(zhǎng)度是奇數(shù),則依次判斷s[i-k]==s[i+k],k=1,2,3...
回文串長(zhǎng)度是偶數(shù),則依次判斷s[i-k]==[i+k-1],k=1,1,3...
? ?public String longestPalindrome(String s){
? ? ? ?String ans = ""; ? ? ? ?for(int i=0;i<s.length();i++){ ? ? ? ? ? ?//回文串為奇數(shù)
? ? ? ? ? ?int l = i-1,r=i+1;
? ? ? ? ? ?String sub = getString(s,l,r); ? ? ? ? ? ?if(sub.length()>ans.length()) ans = sub; ? ? ? ? ? ?
? ? ? ? ? ?//回文串為偶數(shù)
? ? ? ? ? ?l = i-1;
? ? ? ? ? ?r = i+1-1;
? ? ? ? ? ?sub = getString(s,l,r); ? ? ? ? ? ?if(sub.length()>ans.length()) ans = sub;
? ? ? ? ? ?
? ? ? ?} ? ? ? ?return ans;
? ?} ? ?
? ?String getString(String s,int l ,int r){ ? ? ? ?while(l>=0&&r<s.length()&&s.charAt(l)==s.charAt(r)){
? ? ? ? ? ?l--;
? ? ? ? ? ?r++;
? ? ? ?} ? ? ? ?return s.substring(l+1,r); // l+1 是因?yàn)?/span> l--了,對(duì)應(yīng)的范圍應(yīng)該要+1,而r因?yàn)?/span>api的原因,是取不到的,所以不用處理。
? ? ? ?//即 substring為 左閉右開的。
? ? ? ?
? ?}
動(dòng)態(tài)規(guī)劃
https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zui-chang-hui-wen-zi-chuan-by-leetcode-solution/
?public String longestPalindrome(String s) { ?int len = s.length(); ?if(len<2) { ?return s;
?} ?
?int maxLen =1; ?int begin = 0; ?boolean[][] dp = new boolean[len][len]; ?//dp[i][j] 表示 s[i:j] 是否是回文串
?for(int i=0;i<len;i++) {
?dp[i][i] = true; // 單個(gè)的 都為 true
?} ?char[] charArray = s.toCharArray(); ?//遞推開始
?//先枚舉子串長(zhǎng)度
?for(int L=2;L<=len;L++) { // 長(zhǎng)度
?//枚舉左邊界,左邊界的上限可以設(shè)置寬松一些
?for(int i=0;i<len;i++) { ?//由L和i可以確定右邊界,即 j-i+1=L 得
?int j = L+i-1; ?//如果右邊界越界,就可以退出當(dāng)前循環(huán)
?if(j>=len) break; ?
?if(charArray[i]!=charArray[j]) {
?dp[i][j] = false ;
?}else { ?if(j-i<3) {//1和2 1:表示 偶數(shù)狀態(tài)下,兩個(gè)字符相等,是回文,2 奇數(shù)下,回文。 邊界條件的判斷
?dp[i][j] = true;
?}else {
?dp[i][j] = dp[i+1][j-1]; ?//狀態(tài)轉(zhuǎn)移,往外擴(kuò)
?}
?} ?
?//只要 dp[i][L] ==ture 成立,就表示子串s[i,L]是回文,此時(shí)記錄回文長(zhǎng)度和起始位置。
?if(dp[i][j]&&j-i+1>maxLen) {
?maxLen = j-i+1;
?begin = i;
?}
?}
?} ?return s.substring(begin, begin + maxLen);
?}
模擬
43字符串相乘
https://leetcode-cn.com/problems/multiply-strings/
兩個(gè)數(shù)相乘,其最大長(zhǎng)度不會(huì)超過n+m,因此創(chuàng)建一個(gè)長(zhǎng)度為n+m的數(shù)組來接收結(jié)果。
?public String multiply(String n1, String n2) { ? ? ? ?int n = n1.length(), m = n2.length(); ? ? ? ?int[] res = new int[n + m]; ? ? ? ?for (int i = n - 1; i >= 0; i--) { ? ? ? ? ? ?for (int j = m - 1; j >= 0; j--) { ? ? ? ? ? ? ? ?int a = n1.charAt(i) - '0'; ? ? ? ? ? ? ? ?int b = n2.charAt(j) - '0'; ? ? ? ? ? ? ? ?int r = a * b; // 先得到乘法
? ? ? ? ? ? ? ?r += res[i + j + 1]; // ?i和j都是遞減的,+1是對(duì)應(yīng)的二位數(shù)的低位。
? ? ? ? ? ? ? ?// 例如 123 和456 若是3和6 那么算出來的i+j是4,實(shí)際只有個(gè)位,要向下再看一位 即下標(biāo)為5 而下標(biāo)5就是最低位了。
? ? ? ? ? ? ? ?res[i + j + 1] = r % 10;
? ? ? ? ? ? ? ?res[i + j] += r / 10;
? ? ? ? ? ?}
? ? ? ?}
? ? ? ?StringBuilder sb = new StringBuilder(); ? ? ? ?for (int i = 0; i < n + m; i++) { ? ? ? ? ? ?if (sb.length() == 0 && res[i] == 0) continue;
? ? ? ? ? ?sb.append(res[i]);
? ? ? ?} ? ? ? ?return sb.length() == 0 ? "0" : sb.toString();
? ?}
73 矩陣置零
O(1) 的空間解法。
使用兩個(gè)變量(r0&c0),記錄[首行&首列]是否該被置零
[非首行首列位置] 1、將置零信息存儲(chǔ)到原矩陣 2、根據(jù)置零信息,置零[非首行首列]的位置
使用r0&c0 置零[首行&首列]
? ?
?public void setZeroes(int[][] mat) { ? ? ? ?int m = mat.length, n = mat[0].length; ? ? ? ?
? ? ? ?//1 掃描[首行]和[首列] 記錄 ?[首行]和[首列]是否被置零
? ? ? ?boolean r0=false,c0=false ; ? ? ? ?for(int i=0;i<m;i++) { ? ? ? ? if(mat[i][0]==0) {
? ? ? ? r0 = true; ? ? ? ? break;
? ? ? ? }
? ? ? ?} ? ? ? ?for(int j=0;j<n;j++) { ? ? ? ? if(mat[0][j]==0) {
? ? ? ? c0 = true; ? ? ? ? break;
? ? ? ? }
? ? ? ?} ? ? ? ?
? ? ? ?//掃描[非首行首列]的位置,如果發(fā)現(xiàn)零,將需要置零的信息存儲(chǔ)到該行的[最左方]和[最上方]的格子內(nèi)
? ? ? ?for(int i=1;i<m;i++) { ? ? ? ? for(int j=1;j<n;j++) { ? ? ? ? if(mat[i][j]==0) mat[i][0] = mat[0][j]=0;
? ? ? ? }
? ? ? ?} ? ? ? ?
? ? ? ?// 根據(jù)剛剛記錄在[最左方]和[最上方]格子內(nèi)的置零信息,進(jìn)行[非首行首列] 置零
? ? ? ?for(int j=1;j<n;j++) { ? ? ? ? if(mat[0][j]==0) { ? ? ? ? for(int i=1;i<m;i++) mat[i][j] = 0;
? ? ? ? }
? ? ? ?} ? ? ? ?
? ? ? ?for(int i=1;i<m;i++) { ? ? ? ? if(mat[i][0]==0) Arrays.fill(mat[i], 0);
? ? ? ?} ? ? ? ?
? ? ? ?if(r0) for (int i=0;i<m;i++) mat[i][0]=0; ? ? ? ?if(c0) Arrays.fill(mat[0], 0);
?}