通信中在使用QPSK調制時,為了避免收發端相干頻率相位不一致,導致相位模糊,會在發送端對發送的bit數據進行差分編碼,將絕對相位轉為相對相位;同時在接收端對接收的符號進行解差分,將相對相位轉換為絕對相位。
這是QPSK的星座映射圖,QPSK+差分編碼得到DQPSK。
1.下面討論為什么要使用DQPSK
假如發送比特{b0,b1,b2,......,bk,.....,bn}(bk為2比特數據,每個QPSK星座點映射2bit)經過QPSK映射得到n個符號{a0,a1,a2,......,ak........,an}(an為復數bk={bk_i,bk_q},復數才有相位)。映射得到的每個符號都有一個相位,比如11--->(1,1),相位為∏/4。這是映射得到的絕對相位,在將映射的符號發送出去還要進行載波調制,即sk=ak*e(j2piw+θ),接收端接收到信號要去掉載波,得到映射符號,去掉的方式一般采用相干解調,即rk=sk*e-(j2piw+φ),當θ=φ時rk=ak,即還原了發送端的符號,然而實際情況中,接收端進行相干解調的信號相位不會與發送端的一樣,這樣就導致不能還原發送的符號。然而我們會發現每個接收符號都會加入j(θ-φ)的相位,如果將前后兩個接收符號的相位相減就能消除這個未知的相位,這個特點讓我們找到了解決這個問題的出路——差分編碼。
2.差分編碼
差分編碼的公式如下:
c0 = a0;
ck = ck-1*ak ,k>0;(這些都是復數,映射后的符號)
即第一映射符號就是第一個差分符號,第k個差分編碼符號等於k-1個差分編碼符號乘第k個映射符號。即ck的相位是 在ck-1的基礎上加入了ak 的相位,所以ck與ck-1的相位差是ak的相位。
3.解差分。
解差分的公式如下:
a0 = s0;
ak =*sk *(sk-1)*,k>0;(這些都是復數,映射后的符號,a*表示取共軛)
上面已經分析過,由於收發端載波相位不一致,即θ≠φ時,rk=sk*e-(j2piw+φ)=ak*ej(θ-φ)=|a|ejβ*ej(θ-φ),(假設ak=|a|ejβ)接收的數據相位錯誤,(數據信息存在於相位中,即接收數據錯誤),會在接收的數據上疊加一固定的相位。經過差分編碼后的數據ck 是在前一個差分編碼的ck-1上疊加了ak 的相位,同求ck與ck-1的相位差就可以得到ak 的相位,即ak=ck*(ck-1)*。如果θ≠φ,rk*(rk-1)*=ejβ*ej(θ-φ)*e-jξ*e-j(θ-φ)=ej(β-ξ),(假設幅度都為1,rk的相位為β,rk-1的相位為ξ)。這樣得到了ck與ck-1的相位差,也就是ak 的相位,把ak 的相位還原了,解決了相位模糊的問題。
4.差分編碼擴展
采用(2,3)中的差分編碼和解差分方式無法還原a0的相位,為了解決這個問題,工程實現中不是在bit數據映射成符號后再進行差分編碼,而是在bit數據映射前進行差分編碼,這樣可以減少差分編碼的復雜度,同時增加1bit冗余的bit解決第一個符號無法還原的問題(其實第一個符號也不能還原,只是第一個符號插入無效的數據,接收端不care):
編碼前: 0100101
編碼后:00111001
首先添加一個冗余數據(0和1都可以,無所謂,上面添加的是0),添加的0與未編碼的第一個bit相比較,兩個數據相同,得到第一個bit數據0(第一個綠色的0,通過編碼前的第一個數據0,(紅色)與冗余數據0(紅色)得到。)后續的將編碼得到的數據與后續未編碼的數據相比較,相同則得到編碼數據0,不相同則得到未編碼的數據1。
5.有的差分編碼和解差分中會加入一個固定的旋轉。
差分編碼的公式如下:
c0 = a0;
ck = ck-1*ak (1/2+1j/2),k>0;(這些都是復數,映射后的符號)
解差分的公式如下:
a0 = s0;
ak =*sk *(sk-1)* *(1/2-1j/2),k>0;(這些都是復數,映射后的符號,a*表示取共軛)
工作中對7比特的隨機復數進行差分編碼,發現死活解差分都不對,后來發現是由於數據中有復數(0,0),且差分編碼時,數據相乘后進行的截位也會導致復數(0,0)的大量出現。在差分編碼中要求編碼后的數據得有相位,然而(0,0)中沒有相位,也就違背了相位差的基礎,當然沒法解差分。解決辦法就是避免差分編碼前和差分編碼后的數據有(0,0),不使用隨機復數進行差分編碼,使用QPSK映射后的數據進行差分編碼(BPSK的數據也可以)
這些是工作中遇到差分編碼和解差分的實際問題才領悟到大學里學的東西,當時上學的時候壓根就不理解為什么要使用差分編碼,為什么要使用bit的差分編碼是那樣的。現在的理解也有可能不正確,望各個大俠指教!