天天看點

DVB-C系統中QAM調制與解調仿真

本文簡單記錄一下自己學習《通信原理》的時候調試的一個仿真DVB-C(Cable,數字有線電視)系統中QAM調制和解調的程式。自己一直是研究“信源”方面的東西,是以對“信道”這方面的知識進行實踐的機會一直不是很多,做這個小程式的過程中也熟悉了不少相關的知識。在這個程式中,每執行一步操作,都會畫出時域信号圖和頻域信号圖,同時會在控制台列印出有關變量的取值,對于了解QAM調制與解調有一定的幫助。

一.DVB-C中QAM的調制與解調

簡單介紹DVB-C系統中的QAM的調制與解調。DVB系列标準是數字電視領域最重要的标準,它是一個完整的數字廣播解決方案,涉及數字電視廣播的方方面面。DVB 規範了數字電視的系統結構和信号處理方式,各廠商可以開發各自的 DVB裝置,隻要該裝置能夠正确接收和處理信号并滿足規範中所規定的性能名額就可以了。我國的衛星數字電視采用了DVB-S标準,地面廣播數字電視采用了自主的DTMB标準,有線數字電視傳輸标準采用了DVB-C 标準。本文主要分析有線數字電視傳輸中的DVB-C标準。

1.DVB-C發送端和接收端

下面簡單介紹DVB-C系統的發送端和接收端。DVB-C 标準描述了有線數字電視的幀結構,信道編碼和調制。主要用于傳送電視中的視訊和音頻信号。DVB-C 描述的有線數字電視前端與接收端的原理框圖如圖所示。

DVB-C系統中QAM調制與解調仿真

有線前端與接收端的原理框圖

下面簡單說明有線前端每個部分的功能:

(1)基帶接口:該單元将資料結構與信号源格式比對,幀結構應與包含同步位元組的 MPEG-2 TS 流一緻。

(2)SYNC1反轉和随機化。該單元将依據 MPEG-2 幀結構轉換 SYNC1位元組;同時為了頻譜成形,對資料流進行随機化。

(3)RS編碼器。将每一個TS包送入RS編碼器進行RS(204,188)信道編碼。

(4)卷積交織器。完成深度 I=12 的卷積交織信道編碼。

(5)位元組變換到 m 比特符号。将位元組變換為 QAM 符号。

(6)差分編碼。為了獲得旋轉不變星座圖,将每符号兩個最高有效位進行差分編碼。

(7)基帶成形。将差分編碼的符号映射到I、Q分量。此外對 I 和 Q 信号進行平方根升餘弦滾降濾波。

(8)QAM 調制和實體接口。完成 QAM 調制。之後,它将 QAM 已調制信号連接配接到有線射頻信道。

接收端的功能不再詳細叙述。接收端隻要按照前端的處理順序進行逆處理就可以得到基帶信号。

2.QAM 信号的調制和解調

正交振幅調制(QAM)數字傳輸系統因為其高的頻帶使用率而被确定為DVB-C 标準。下面簡單介紹QAM的調制和解調的步驟。QAM調制的步驟可以由下圖表示。

DVB-C系統中QAM調制與解調仿真

QAM調制原理圖

如圖所示,輸入的碼中繼資料首先經過“串并轉換”形成兩路資料信号,轉換之後,每個碼元的持續時間變成原先的2倍;然後經過“2-L電平變換”轉換成為多進制的QAM符号;然後将這2路QAM多進制信号分别和2路正交載波相乘;最後再将這2路調制後的信号相加,就形成了調制後的QAM信号。

QAM信号解調的步驟與調制的步驟正好相反,如下圖所示。

DVB-C系統中QAM調制與解調仿真

QAM解調原理圖

如圖所示,QAM信号首先分别使用2路正交的相幹載波進行解調;然後經過“多電平判決”電路獲得2路多進制的QAM符号;接着經過“L-2電平變換”轉換成2路碼中繼資料;最後經過“串并轉換”将2路碼中繼資料合并後形成完整的碼中繼資料。

二.仿真

下面介紹仿真實驗。本文做了3個仿真實驗。第1個實驗仿真了16QAM的調制與解調;第2個實驗在第一個實驗的基礎上,仿真了16QAM信号傳輸過程中信噪比與誤碼率之間的關系;第3個實驗仿真了2FSK,2PSK,4PSK,16PSK,16QAM的信噪比(S/N)與誤碼率之間的關系對比圖。

1. QAM的調制與解調

本實驗利用Matlab軟體,完成如下圖所示的一個基本的基于16QAM的數字通信系統。整個系統可以分成信源、信道和信宿三個部分。信号源産生二進制(0和1)的随機信号,經過調制後形成2路QAM符号(取值-3,-1,1和3)。2路QAM符号分别經過平方根升餘弦濾波器,形成等待調制到高頻的信号。随後通過給這兩路信号添加高斯白噪聲的方法,模拟信道的傳輸環境。然後通過比對濾波器(平方根升餘弦濾波器)。最後經過采樣,判決,和解調得到二進制信号。本系統可以從Matlab控制台輸出整個過程中關鍵信号的取值,并且可以在最後統計誤碼資訊。

DVB-C系統中QAM調制與解調仿真

QAM的調制和解調過程原理圖

下文将會按照上圖所示的信号傳遞的順序詳細介紹每個步驟。

(a)二進制信号的生成

使用randsrc()函數生成随機二進制序列。本程式預設序列長度為240,其中“1”出現的機率為0.5。代碼如下所示。

%====定義待仿真序列的長度 N
global N
N=240;
%====定義産生‘1’的機率為 p
global p
p=0.5;
%==============================
%首先産生随機二進制序列
source=randsrc(1,N,[1,0;p,1-p]);
%畫出序列波形
h=figure(1);
stairs(source);
ylim([-1,2]);
set(h,'name','随機二進制序列');
           

該步驟運作完成後生成的二進制序列如圖所示。

DVB-C系統中QAM調制與解調仿真

随機二進制序列

(b)    調制

調制步驟将二進制的碼元序列轉換成為2路QAM符号。該部分的功能在單獨定義的modulate_sig()函數中完成。該函數完成了以下幾個步驟:

(1)     串并轉換。該部分将輸入的碼元序列中序号為奇數的碼元選擇出來形成一組資料,然後再将剩下的序号為偶數的碼元選擇出來形成另一組資料。為了描述友善,下文中稱第一組資料稱為“I路”,第二組資料稱為“Q路”。下文中僅描述I路信号的處理,Q路信号的處理和I路是一模一樣的。

(2)     格雷碼映射。将I路資料中每兩個碼元作為一個單元,按照格雷碼的映射規則進行映射。格雷碼的映射規則如下表所示。

格雷碼映射規則

映射前(二進制碼) 映射後(QAM符号)
0 0 -3
0 1 -1
1 1 1
1 0 3

注:上述映射規則可以有個簡單的記法:第一個比特位代表符号,“1”代表“+”,第二個比特位代表取值,“1”代表“3”。

經過上述兩個步驟處理之後,内容為“0101”的二進制碼元序列調制成了内容包含-3,-1,1,3的2路QAM符号。該步驟運作完成後生成的2路QAM符号如下圖所示。

DVB-C系統中QAM調制與解調仿真

QAM符号序列

将上圖中的QAM符号中的I路取值作為x坐标,Q路取值作為y坐标,可以畫圖得到16QAM符号的“星座圖”,如下圖所示。

DVB-C系統中QAM調制與解調仿真

QAM符号星座圖

将該QAM符号進行DTFT變換後的頻域波形如下圖所示。x軸的機關是π。

DVB-C系統中QAM調制與解調仿真

QAM符号DTFT頻域圖

該部分的代碼如下所示。

%對産生的二進制序列進行QAM調制
function [y1,y2]=modulate_sig(x)
%=====首先進行串并轉換,将原二進制序列轉換成兩路信号
N=length(x);
a=1:2:N;
fprintf('串并轉換\n第一路:第1,3,5,7...元素\n第二路:第2,4,6,8...元素\n');
y1=x(a);
y2=x(a+1);
%=====分别對兩路信号進行QPSK調制
%======對兩路信号分别進行2-4電平變換
a=1:2:N/2;
temp1=y1(a);
temp2=y1(a+1);
y11=temp1*2+temp2;
temp1=y2(a);
temp2=y2(a+1);
y22=temp1*2+temp2;
%=======對兩路信号分别進行相位調制
a=1:N/4;
y1=(y11*2-1-4)*1.*cos(2*pi*a);
y2=(y22*2-1-4)*1.*cos(2*pi*a);
%格雷碼映射
fprintf('格雷碼映射\n');
fprintf('---------\n');
fprintf('二進制碼 | 格雷碼\n');
fprintf(' 00     | -3\n');
fprintf(' 01     | -1\n');
fprintf(' 11     |  1\n');
fprintf(' 10     |  3\n');
fprintf('---------\n');
fprintf('注:前一位是符号,0代表+,後一位是取值,0代表3;\n');
y1(find(y11==0))=-3;
y1(find(y11==1))=-1;
y1(find(y11==3))=1;
y1(find(y11==2))=3;
y2(find(y22==0))=-3;
y2(find(y22==1))=-1;
y2(find(y22==3))=1;
y2(find(y22==2))=3;
           

(c)     插值

插值步驟在QAM符号之間插入一些0點。這一步和後面的低通濾波聯合起來的作用是模拟信号高頻調制之後的頻譜。該步驟的實作位于自定義的函數insert_value ()中。具體的方式是分别在信号的I路和Q路中,相鄰的兩個碼字之間添加7個0。經過該步驟處理後,2路QAM符号如下圖所示。

DVB-C系統中QAM調制與解調仿真

內插補點後兩路信号的波形圖

上圖所示信号進行DTFT變換後的頻域波形如下圖所示。從圖中可以看出,時域信号的內插補點會造成頻域信号的收縮。

DVB-C系統中QAM調制與解調仿真

插值QAM符号DTFT頻域圖

該部分的代碼如下所示。

%x是待插值的序列,ratio是插值的比例。
function y=insert_value(x,ratio)
%兩路信号進行插值
y=zeros(1,ratio*length(x));
a=1:ratio:length(y);
y(a)=x; 
           

(d)    低通

低通步驟主要用于調整QAM符号的波形,也可以稱為“波形成形”。該部分的實作位于自定義的函數rise_cos()中。上述幾個步驟中的方波是在本地數字信号處理時常見的波形,但在實際傳輸時這種方波并不合适,因為使用方波的話會導緻相鄰傳輸信号之間的串擾。根據奈奎斯特第一準則,在實際通信系統中一般均使接收波形為升餘弦滾降信号。這一過程由發送端的基帶成形濾波器和接收端的比對濾波器兩個環節共同實作,是以這兩個環節都需要進行平方根升餘弦滾降濾波。下面簡單介紹平方根餘弦濾波器。

平方根升餘弦濾波器具有以下定義的理論函數:

DVB-C系統中QAM調制與解調仿真
DVB-C系統中QAM調制與解調仿真

其中:

DVB-C系統中QAM調制與解調仿真

是奈奎斯特平率,

DVB-C系統中QAM調制與解調仿真

是滾降系數。

平方根升餘弦濾波器的沖擊響應如下圖所示。

DVB-C系統中QAM調制與解調仿真

平方根升餘弦濾波器的沖激響應曲線

經過該步驟處理後,2路QAM符号如下圖所示。

DVB-C系統中QAM調制與解調仿真

通過低通濾波器後兩路信号波形圖

上圖所示信号進行DTFT變換後的頻域波形如下圖所示。從圖中可以看出,經過低通濾波器之後,頻域中高頻部分被濾除,保留了低頻的信号。

DVB-C系統中QAM調制與解調仿真

通過低通濾波器後兩路信号波形圖

該部分的代碼如下所示。

%x1、x2是兩路輸入信号,fd是信号資訊位的頻率,fs是信号的采樣頻率
function [y1,y2]=rise_cos(x1,x2,fd,fs)
%生成平方根升餘弦濾波器
[yf, tf]=rcosine(fd,fs, 'fir/sqrt');
%對兩路信号進行濾波
[yo1, to1]=rcosflt(x1, fd,fs,'filter/Fs',yf);
[yo2, to2]=rcosflt(x2, fd,fs,'filter/Fs',yf);
y1=yo1;
y2=yo2; 
           

(e)     加載頻

加載頻在該仿真中屬于一個“附加”步驟。該部分主要用于呈現調制到載波之後的波形圖,它的實作位于自定義的函數modulate_to_high()中。本程式将通過成形濾波器後的信号調制到10倍于原頻率的載波上。由于在仿真的過程中,隻能用離散的點來模拟連續信号,因而為了能夠顯示出一個正弦曲線,至少需要在一個正弦周期内采樣到4個以上的點,這裡,我們在一個周期内采10個點。假設最初的0、1信号的頻率是1Hz,那麼I路和Q路符号傳輸的頻率是1/4Hz,而10倍頻是建立在I路或Q路符号頻率的基礎上,也就是說,載頻的頻率是2.5Hz。調制後的信号就是I路和Q路線性疊加,符合以下公式。

DVB-C系統中QAM調制與解調仿真

其中,fc為載波頻率。

該步驟運作後,兩路QAM符号合成一路信号,如下圖所示。

DVB-C系統中QAM調制與解調仿真

基帶信号調制到高頻之後的波形圖

該部分的代碼如下所示。

%x1,x2代表兩路輸入信号,f是輸入信号的頻率,hf是載波的頻率
function [t,y]=modulate_to_high(x1,x2,f,hf)
%産生兩個中間變量,用來存儲插值後的輸入信号
yo1=zeros(1,length(x1)*hf/f*10);
yo2=zeros(1,length(x2)*hf/f*10);
n=1:length(yo1);
%對輸入信号分别進行插值,相鄰的兩個點之間加入9個點,且這9個點的值同第0個點的值相同
yo1(n)=x1(floor((n-1)/(hf/f*10))+1);
yo2(n)=x1(floor((n-1)/(hf/f*10))+1);
%生成輸出輸出信号的時間向量
t=(1:length(yo1))/hf*f/10;
%生成載波調制信号
y=yo1.*cos(2*pi*hf*t)-yo2.*sin(2*pi*hf*t); 
           

(f)      加噪聲

加噪聲用于模拟實際的信道中的噪聲。本程式設定信道具有高斯白噪聲的幹擾。該步驟的實作位于自定義的函數generate_noise()中。加入白噪聲的2路信号如下圖所示。

DVB-C系統中QAM調制與解調仿真

加入高斯白噪聲之後的波形圖

上圖所示信号進行DTFT變換後的頻域波形如下圖所示。從圖中可以看出,由于白噪聲在整個頻域上是均勻分布的,是以整個頻域範圍内都增加了一些噪聲。

DVB-C系統中QAM調制與解調仿真

加入高斯白噪聲之後DTFT頻域圖

該部分的代碼如下所示。

%對輸入的兩路信号加高斯白噪聲,傳回處理後的兩路信号
function [y1,y2]=generate_noise(x1,x2,snr)
%符号信噪比
snr1=snr+10*log10(4);
%所有信号的平均功率
ss=var(x1+i*x2,1);
%加入高斯白噪聲
y=awgn([x1+j*x2],snr1+10*log10(ss/10),'measured');
y1=real(y);
y2=imag(y); 
           

(g)     比對濾波

比對濾波用于從信道中接收QAM信号。這一步驟和前面的“低通”步驟是成對出現的。前面步驟的濾波器用于頻譜成型,而這一步驟的濾波器主要用于濾除噪聲。接收端的比對濾波與發送端的成形濾波共同實作了數字通信系統的最佳接收。它與成形濾波器共同構成了一個奈奎斯特濾波器。該步驟的實作與“低通”步驟一樣,位于generate_noise()函數中。

經過比對濾波期之後的信号如下圖所示。

DVB-C系統中QAM調制與解調仿真

經過比對濾波器之後的波形圖

上圖所示信号進行DTFT變換後的頻域波形如下圖所示。從圖中可以看出,信号高頻部分的白噪聲在經過低通濾波器之後,已經被消除掉了。

DVB-C系統中QAM調制與解調仿真

經過比對濾波器之後DTFT頻域圖

(h)    采樣

采樣步驟用于還原前面插值步驟處理之前的QAM符号序列。經過前面的插值步驟之後,序列的點數是原本序列的8倍,是以需要去除這些備援的點。該步驟的具體實作位于自定義的pick_sig()函數中,代碼如下所示。

function [y1,y2]=pick_sig(x1,x2,ratio)
y1=x1(ratio*3*2+1:ratio:(length(x1)-ratio*3*2));
y2=x2(ratio*3*2+1:ratio:(length(x1)-ratio*3*2));
           

(i)       判決解調

解調步驟用于還原QAM符号序列為二進制碼原序列。該步驟的實作位于自定義的demodulate_sig()函數中。經過上述幾步驟後,已經可以得到2路QAM16的符号序列,該序列的星座圖如下圖所示。

DVB-C系統中QAM調制與解調仿真

接收的QAM符号星座圖

從圖中可以看出,原先整齊的星座圖經過信道幹擾的影響之後之後已經變得有些散亂。這2路QAM符号序列如下圖所示。

DVB-C系統中QAM調制與解調仿真

接收的QAM符号序列

上圖所示信号進行DTFT變換後的頻域波形如下圖所示。從圖中可以看出,時域的抽樣造成了頻域的擴張。

DVB-C系統中QAM調制與解調仿真

接收的QAM符号序列

對于這樣的QAM符号序列,需要做以下幾步處理:

(a)     判決。這裡可以通過根據最大後驗機率(MAP)準則,得到最小檢測距離。具體到本仿真中,可以根據下表所示的的規則進行判決。

判決電平對應表

判決前的信号的幅度 對應的判決後的幅度
A<-2 -3
-2<=A<=0 -1
0<=A<2 1
A>=2 3

(b)     格雷碼映射。按照前文所述的格雷碼映射規則,将QAM符号重新轉換為二進制碼原序列。

(c)     并串轉換。将2路二進制碼原序列重新合并為1路二進制碼原序列。合并的規則和前文所述是一樣的,即I路信号作為還原後信号中序号為奇數的碼元,Q路則作為還原後信号中序号為偶數的碼元。

經過上述步驟後,就可以得到解碼後的二進制碼元序列了,如下圖所示。

DVB-C系統中QAM調制與解調仿真

恢複的二進制序列

該步驟的代碼如下所示。

function y=demodulate_sig(x1,x2)
%對x1路信号進行判決
xx1(find(x1>=2))=3;
xx1(find((x1<2)&(x1>=0)))=1;
xx1(find((x1>=-2)&(x1<0)))=-1;
xx1(find(x1<-2))=-3;
%對x2路信号進行判決
xx2(find(x2>=2))=3;
xx2(find((x2<2)&(x2>=0)))=1;
xx2(find((x2>=-2)&(x2<0)))=-1;
xx2(find(x2<-2))=-3;
%将x1路信号按格雷碼規則還原成0、1信号
temp1=zeros(1,length(xx1)*2);
temp1(find(xx1==-1)*2)=1;
temp1(find(xx1==1)*2-1)=1;
temp1(find(xx1==1)*2)=1;
temp1(find(xx1==3)*2-1)=1;
%将x2路信号按格雷碼規則還原成0、1信号
temp2=zeros(1,length(xx2)*2);
temp2(find(xx2==-1)*2)=1;
temp2(find(xx2==1)*2-1)=1;
temp2(find(xx2==1)*2)=1;
temp2(find(xx2==3)*2-1)=1;
%将兩路0、1信号合成一路
y=zeros(1,length(temp1)*2);
y(1:2:length(y))=temp1;
y(2:2:length(y))=temp2;
           

(j)      誤碼率統計

誤碼率統計步驟用于統計上述整個環節中産生誤碼的情況。該步驟相對比較簡單,使用biterr()函數對比發送端輸入的二進制碼元序列和接收端得到的二進制碼元,就可以得到整個系統的誤碼率情況。

(k)     程式主幹代碼

程式主幹代碼如下所示,位于plot_qam16.m檔案中。

% QAM16的調制與解調示例程式
%
% 雷霄骅
% 中國傳媒大學/數字電視技術
% [email protected]
%
% 本程式示範了QAM的調制與解調過程。
% 程式輸出了上述過程中的圖形,并且在控制台中輸出了相關的資訊。
%
%
clear;
%關閉視窗
close all;
%白色背景
set(0,'defaultfigurecolor','w');
%====定義待仿真序列的長度 N
global N
N=240;
%====定義産生‘1’的機率為 p
global p
p=0.5;
%==============================
%首先産生随機二進制序列
source=randsrc(1,N,[1,0;p,1-p]);
%畫出序列波形
h=figure(1);
stairs(source);
ylim([-1,2]);
set(h,'name','随機二進制序列');
%==============================
%對産生的二進制序列進行QAM調制
[source1,source2]=modulate_sig(source);
%==============================
%畫出序列波形
h=figure(2);
plot_2way_stair(source1,source2);
set(h,'name','QAM符号序列');
%輸出坐标
fprintf('\nQAM符号的坐标:\n');
for i=1:length(source1);
    if mod(i,10)==0
        fprintf('\n');
    end
    fprintf('(%.3f,%.3f);',source1(i),source2(i));
end;
fprintf('\n');
%===============================
%畫出星座圖
h=figure(3);
plot_astrology(source1,source2);
set(h,'name','QAM符号星座圖');
%===============================
%畫出頻域圖
h=figure(4);
plot_2way_f_dtft(source1,source2);
set(h,'name','QAM符号DTFT頻域圖');
%plot_2way_f_dft(source1,source2,50);
%set(h,'name','QAM符号DFT頻域圖');
%===============================
%兩路信号進行插值
sig_insert1=insert_value(source1,8);
sig_insert2=insert_value(source2,8);
%===============================
%畫出兩路信号的波形圖
h=figure(5);
plot_2way(sig_insert1,sig_insert2,length(sig_insert1),0.5);
set(h,'name','插值後兩路信号的波形圖');
%===============================
%畫出頻域圖
h=figure(6);
plot_2way_f_dtft(sig_insert1,sig_insert2);
set(h,'name','插值QAM符号DTFT頻域圖');
%plot_2way_f_dft(sig_insert1,sig_insert2,50);
%set(h,'name','插值QAM符号DFT頻域圖');
%===============================
%通過低通濾波器
[sig_rcos1,sig_rcos2]=rise_cos(sig_insert1,sig_insert2,0.25,2);
%===============================
%畫出兩路信号的波形圖
h=figure(7);
plot_2way(sig_rcos1,sig_rcos2,length(sig_rcos1)/4,0.5);
set(h,'name','通過低通濾波器後兩路信号波形圖');
%===============================
%畫出頻域圖
h=figure(8);
plot_2way_f_dtft(sig_rcos1',sig_rcos2');
set(h,'name','通過低通濾波器後DTFT頻域圖');
%===============================
%====将基帶信号調制到高頻上
[t,sig_modulate]=modulate_to_high(sig_rcos1,sig_rcos2,0.25,2.5);
h=figure(9);
%plot(t(1:500),sig_modulate(1:500));
plot(t,sig_modulate);
set(h,'name','基帶信号調制到高頻之後的波形圖');
%===============================
 
%====加入高斯白噪聲
snr=10;
[x1,x2]=generate_noise(sig_rcos1,sig_rcos2,snr);
sig_noise1=x1';
sig_noise2=x2';
h=figure(10);
plot_2way(sig_noise1,sig_noise2,length(sig_noise1)/4,0.5);
set(h,'name','加入高斯白噪聲之後的波形圖');
%===============================
%畫出頻域圖
h=figure(11);
plot_2way_f_dtft(sig_noise1,sig_noise2);
set(h,'name','加入高斯白噪聲之後DTFT頻域圖');
 
%====經過比對濾波器
[sig_match1,sig_match2]=rise_cos(sig_noise1,sig_noise2,0.25,2);
h=figure(12);
plot_2way(sig_match1,sig_match2,length(sig_match1)/4,0.5);
set(h,'name','經過比對濾波器之後的波形圖');
%===============================
%畫出頻域圖
h=figure(13);
plot_2way_f_dtft(sig_match1',sig_match2');
set(h,'name','經過比對濾波器之後DTFT頻域圖');
%采樣
[x1,x2]=pick_sig(sig_match1,sig_match2,8);
sig_pick1=x1;
sig_pick2=x2;
%畫出星座圖
h=figure(14);
plot_astrology(sig_pick1,sig_pick2);
set(h,'name','接收的QAM符号星座圖');
%畫出序列波形
h=figure(15);
plot_2way_stair(sig_pick1,sig_pick2);
set(h,'name','接收的QAM符号序列');
%輸出坐标
fprintf('\nQAM符号的坐标(接收):\n');
for i=1:length(source1);
    if mod(i,10)==0
        fprintf('\n');
    end
    fprintf('(%.3f,%.3f);',sig_pick1(i),sig_pick2(i));
end;
fprintf('\n');
%===============================
%畫出頻域圖
h=figure(16);
plot_2way_f_dtft(sig_pick1',sig_pick2');
set(h,'name','接收的QAM符号序列DTFT頻域圖');
%解調
signal=demodulate_sig(sig_pick1,sig_pick2);
h=figure(17);
stairs(signal);
ylim([-1,2]);
set(h,'name','恢複的二進制序列');
%誤碼率
[number,Pe] = biterr(source,signal);
fprintf('誤碼數以及誤碼率:\n');
fprintf('%d,%f;\n',number,Pe);
hold on
           

2. QAM傳輸過程中信噪比與誤碼率之間的關系

本實驗在前一個實驗的基礎上,仿真了16QAM傳輸過程中信噪比與誤碼率之間的關系。本仿真的大部分代碼與前一個實驗是一樣的,主要的不同點在于它計算了QAM理論的誤碼率,并且與實際的誤碼率進行了對比,整個程式的流程簡單描述如下:

(a)     設定信噪比

(b)     計算16QAM該信噪比下的誤碼率

(c)     仿真16QAM該信噪比下的誤碼率

(d)     重新設定信噪比,重複(2)(3)步驟

該仿真實驗選擇了1-11dB的信噪比對16QAM進行了仿真,仿真的結果如下圖所示。

DVB-C系統中QAM調制與解調仿真

16QAM信噪比與誤碼率之間的關系的仿真結果

從仿真結果圖來看,仿真的誤碼率十分貼近理論的誤碼率。程式的代碼位于plot_qam16_ber.m檔案中,代碼的内容和前一個實驗是類似的,關鍵代碼大緻如下。

% QAM16的信噪比(S/N)與誤碼率關系圖
%
% 雷霄骅
% 中國傳媒大學/數字電視技術
% [email protected]
%
% 本程式可以得到QAM調制中信噪比(S/N)與誤碼率之間的關系圖
%
%
clear;
close all;
%白色背景
set(0,'defaultfigurecolor','w');
%用來仿真QAM的誤bit率
snr=1:1:11;
%先來計算理論誤bit率
error_theory=(1-(1-(2*(1-1/sqrt(16))*1/2*erfc(1/sqrt(2)*sqrt(3*4*10.^(snr/10)/(16-1))))).^2)/4;
%用理論的誤bit率來決定需要仿真的點數
N=floor(1./error_theory)*100+100;
%最少5000點
N(find(N<5000))=5000;
 
for i=1:length(N);
         %一次仿真,代碼略
end
figure(4);
%畫出圖形
semilogy(snr,error_bit,'bs-','LineWidth',2);
hold on
semilogy(snr,error_theory,'ms-','LineWidth',2)
legend('仿真','理論');
xlabel('S/N, dB');
ylabel('Bit Error Rate (BER)');
title('信噪比和誤碼率之間的關系');
           

3. 2FSK,2PSK,4PSK,16PSK,16QAM的信噪比與誤碼率之間的關系對比

上個實驗仿真了16QAM傳輸過程中信噪比與誤碼率之間的關系。為了能和其他調制方式做一個對比,本實驗仿真了2FSK,2PSK,4PSK,16PSK,16QAM傳輸過程中信噪比與誤碼率之間的關系。與前兩個實驗不同之處在于,本實驗沒有使用自行編寫的程式完成這幾種調制方式的仿真,而是使用Matlab的接口函數完成了仿真,實驗的結果如下圖所示。

DVB-C系統中QAM調制與解調仿真

2FSK,2PSK,4PSK,16PSK,16QAM的信噪比與誤碼率之間的關系對比的仿真結果

從圖中可以看出,在相同信噪比的前提下,不同調制技術之間的誤碼率關系如下所示:

2PSK < 4PSK < 2FSK < 16QAM < 16PSK

程式的源代碼如下。

% 2FSK,2PSK,4PSK,16PSK,16QAM的
% 信噪比(S/N)與誤碼率之間的關系對比圖
%
% 雷霄骅
% 中國傳媒大學/數字電視技術
% [email protected]
%
% 本程式可以計算得到2FSK,2PSK,4PSK,16PSK,16QAM信噪比
% 與誤碼率之間的關系圖
%
%
clear;
close all;
%白色背景
set(0,'defaultfigurecolor','w');
M2=2;
M4=4;
M16=16;
k2=log2(M2);
k4=log2(M4);
k16=log2(M16);
 
 
Fs = 16;
nsamp = 17;
freq_sep = 8;
x = randint(10000,1);
%mod
y_2fsk = fskmod(x,M2,freq_sep,nsamp,Fs);
y_2psk = pskmod(x,M2);
x4 = bi2de(reshape(x,k4,length(x)/k4).','left-msb');
y_4psk = pskmod(x4,4);
x16 = bi2de(reshape(x,k16,length(x)/k16).','left-msb');
y_16psk = pskmod(x16,16);
y_16qam = qammod(x16,16);
 
N=10;
for j=1:N
    SNR=j; 
    %[],'dB'
    y_2fsk_noise = awgn(y_2fsk,SNR-10*log10(Fs),'measured');
    y_2psk_noise = awgn(y_2psk,SNR,'measured');
    y_4psk_noise = awgn(y_4psk,SNR,'measured');
    y_16psk_noise = awgn(y_16psk,SNR,'measured');
    y_16qam_noise = awgn(y_16qam,SNR,'measured');
    %demod
    z_2fsk = fskdemod(y_2fsk_noise,M2,freq_sep,nsamp,Fs);
    z_2psk = pskdemod(y_2psk_noise,M2);
    z_4psk = pskdemod(y_4psk_noise,M4);
    z_16psk = pskdemod(y_16psk_noise,M16);
    z_16qam = qamdemod(y_16qam_noise,M16);
    %x = [1 1 1 1 1];
    %y = [0 0 0 0 1];
    %[number,ratio]=biterr(x,y)得到 number=4,ratio=0.8
    [num_2fsk(j),ber_2fsk(j)] = biterr(x,z_2fsk);
    [num_2psk(j),ber_2psk(j)] = biterr(x,z_2psk);
    [num_4psk(j),ber_4psk(j)] = biterr(x4,z_4psk);
    [num_16psk(j),ber_16psk(j)] = biterr(x16,z_16psk);
    [num_16qam(j),ber_16qam(j)] = biterr(x16,z_16qam);
end
 
%theoryBer = (1/k)*3/2*erfc(sqrt(k*0.1*(10.^(EbNo/10))));
%semilogy(EbNo,theoryBer,'ms-');
%hold on;
semilogy(1:N,ber_2fsk,'-*b');
hold on;
semilogy(1:N,ber_2psk,'--dg');
hold on;
semilogy(1:N,ber_4psk,'-.dr');
hold on;
semilogy(1:N,ber_16psk,'--xk');
hold on;
semilogy(1:N,ber_16qam,'-.sk');
title('不同信噪比下2FSK,2PSK,4PSK,16PSK,16QAM誤碼性能仿真');
legend('2FSK','2PSK','4PSK','16PSK','16QAM',3);
xlabel('S/N,dB');
ylabel('Bit Error Rate (BER)')
hold off
           

三.下載下傳

QAM調制與解調仿真(Matlab程式)

CSDN下載下傳位址:http://download.csdn.net/detail/leixiaohua1020/8453115

繼續閱讀