初識(shí)MIMO-OFDM(三):完整的MIMO-OFDM仿真
零.緣起
MIMO-OFDM的仿真是一個(gè)大的不能再大的話題了,寫得好的仿真平臺(tái)是可以賺大錢的,我后續(xù)也會(huì)更新一個(gè)著名仿真平臺(tái)的學(xué)習(xí)博客,不過我們這里先來學(xué)習(xí)一下陳老濕在通信家園看到的這個(gè)仿真https://zhuanlan.zhihu.com/p/392827532。這個(gè)博客主要是希望梳理每一個(gè)函數(shù),然后給出2*2Alamouti+OFDM完整的仿真流程。
代碼地址:https://github.com/liu-zongxi/MIMO_OFDM_simulation
發(fā)射機(jī)
一. 發(fā)射機(jī)步驟一:生成所需要發(fā)送的數(shù)據(jù)
%-----------------------生成比特-----------------%
%-----------------------author:lzx-------------------------%
%-----------------------date:2022年5月5日14點(diǎn)33分-----------------%
function Frame_bit = FrameBitGenerator(N_data, N_user, N_mod, N_symbol)
% 輸入
% N_data:一個(gè)符號(hào)中要發(fā)送的符號(hào)數(shù)
% N_user:用戶數(shù)
% N_mod:調(diào)制數(shù)
% N_symbol:一幀中有多少個(gè)符號(hào)
% 輸出
% Frame_bit:一個(gè)(1,N_user)的結(jié)構(gòu)體,包含data和num兩個(gè)field,分別表示每個(gè)用戶的數(shù)據(jù)和數(shù)據(jù)長(zhǎng)度
N_bit_per_symbol = N_mod * N_data;
% 可以選擇用戶比特分布為:
% 1) 所有用戶比特相同。
N_bit_per_user_per_symbol = repmat(N_bit_per_symbol/N_user,1,N_user);
% 2) 用戶按照比例 (1:N_user)/((1 + N_user)*N_user/2) 發(fā)送比特?cái)?shù)據(jù)
% 目的是為了仿真不同用戶的信息比特長(zhǎng)度不同的情況,也可以修改得到其他的用戶數(shù)據(jù)比例
% N_bit_per_user_per_symbol = round([1:N_user]/((1 + N_user)*N_user/2) * N_bit_per_symbol);
N_bit_per_user = N_bit_per_user_per_symbol * N_symbol;
for iuser = 1:N_user
% frame_bit_temp{iuser} = rand(N_bit_per_user(iuser), 1) > 0.5;
Frame_bit(iuser).data = rand(N_bit_per_user(iuser), 1) > 0.5;
Frame_bit(iuser).num = N_bit_per_user(iuser);
end
end
該函數(shù)主要是生成所需要發(fā)送的數(shù)據(jù),這里是為了擴(kuò)展性用了結(jié)構(gòu)體,實(shí)際上該仿真根本無法處理不同長(zhǎng)度的數(shù)據(jù)。
一個(gè)OFDM符號(hào)所承載的比特?cái)?shù)是他用于data傳輸?shù)淖虞d波數(shù)*調(diào)制數(shù)
由于四個(gè)用戶等分?jǐn)?shù)據(jù),因此每個(gè)用戶收到數(shù)據(jù)個(gè)數(shù)都要被除以N_user
最后我們得到的數(shù)據(jù)形式是
(N_data*N_mod/N_user*N_symbol, N_user)
二.發(fā)射機(jī)步驟二:子載波分配
%-----------------------子載波分配-----------------%
%-----------------------author:lzx-------------------------%
%-----------------------date:2022年5月5日16點(diǎn)35分-----------------%
function [index_data_per_user, Frame_zero_padding]=SubcarrierAllocation(Frame_bit_coded, index_data, N_data, N_user,N_symbol, N_mod, type_alloc)
Frame_zero_padding = cell(1,N_user);
index_data_per_user = cell(1,N_user);
% 計(jì)算填零的個(gè)數(shù)
N_subcarrier_per_user = N_data / N_user; % 平均分配,每個(gè)用戶所被分配的子載波個(gè)數(shù)
for iuser = 1:N_user
N_zero_padding = N_mod * N_subcarrier_per_user * N_symbol - Frame_bit_coded(iuser).num;
% 子載波分配方式,這里只給出相鄰分配
if type_alloc == "neighbour"
index_data_per_user{iuser} = index_data((iuser-1)*N_subcarrier_per_user + 1: iuser*N_subcarrier_per_user)';
end
Frame_zero_padding{iuser} = [Frame_bit_coded(iuser).data; zeros(N_zero_padding, 1)];
end
該函數(shù)還是裝神弄鬼了,他輸出的是針對(duì)步驟一所得到的(N_data*N_mod/N_user*N_symbol, N_user)的數(shù)據(jù),每一列的每一個(gè)symbol使用編號(hào)多少的子載波進(jìn)行發(fā)送?
原仿真里給出了多種分配方式,但我這里單純是實(shí)現(xiàn)一下,就是按照順序分配的
最終輸出的index_data_per_user是一個(gè)(N_data/N_user,N_user)的矩陣
Frame_zero_padding是一個(gè)零填充幀,如果現(xiàn)實(shí)情況中不是像我們步驟一中恰好生成那么多比特呢?這時(shí)要用0把他填滿
三.發(fā)射機(jī)步驟三:調(diào)制
%-----------------------調(diào)制函數(shù)---------------------%
%-----------------------author:lzx--------------------------%
%-----------------------date:2022年5月5日23點(diǎn)22分-----------------%
function Frame_mod = Modulator(Frame_zero_padding, index_data_per_user, N_data, N_user, N_symbol, N_mod, N_subcarrier)
Frame_mod = zeros(N_subcarrier, N_symbol);
N_subcarrier_per_user = N_data / N_user;
for iuser = 1:N_user
for isymbol = 1:N_symbol
L_symbol = N_subcarrier_per_user* N_mod;
index_symbol = (isymbol-1)*L_symbol+1 : isymbol*L_symbol;
Symbol = Frame_zero_padding{iuser}(index_symbol);
Symbol_premod = reshape(Symbol, N_mod, N_subcarrier_per_user);
Symbol_mod = SymbolModulator(Symbol_premod);
Frame_mod(index_data_per_user{iuser}, isymbol) = Symbol_mod.';
end
end
%-----------------------MIMO-OFDM主函數(shù)---------------------%
%-----------------------author:lzx--------------------------%
%-----------------------date:2022年5月5日10點(diǎn)29分-----------------%
function Symbol_mod = SymbolModulator(Symbol_premod)
N_mod = size(Symbol_premod,1);
switch N_mod
% BPSK調(diào)制
case 1
matrix_mapping = [-1 1];
Symbol_mod = matrix_mapping(Symbol_premod + 1);
% QPSK調(diào)制
case 2
% 比特的映射關(guān)系,00:-3/4*pi,01:3/4*pi,10: -1/4*pi,11: 1/4*pi
matrix_mapping = exp(1j*[-3/4*pi 3/4*pi -1/4*pi 1/4*pi]);
index_mod = [2 1]*Symbol_premod;
% 把輸入比特映射為符號(hào)
Symbol_mod = matrix_mapping(index_mod + 1);
% 8PSK調(diào)制
case 3
matrix_mapping = exp(1j*[0 1/4*pi 3/4*pi 1/2*pi -1/4*pi -1/2*pi pi -3/4*pi ]);
index_mod = [4 2 1]*Symbol_premod ;
% 把輸入比特映射為符號(hào)
Symbol_mod = matrix_mapping(index_mod + 1);
% 16QAM調(diào)制
case 4
% 映射關(guān)系參見說明文檔
m=1;
for k=-3:2:3
for l=-3:2:3
% 對(duì)符號(hào)能量進(jìn)行歸一化
matrix_mapping(m) = (k+1j*l)/sqrt(10);
m=m+1;
end
end
matrix_mapping = matrix_mapping([0 1 3 2 4 5 7 6 12 13 15 14 8 9 11 10]+1);
index_mod = [8 4 2 1]*Symbol_premod ;
Symbol_mod = matrix_mapping(index_mod + 1);
% 64QAM調(diào)制
case 6
% 映射關(guān)系參見說明文檔
m=1;
for k=-7:2:7
for l=-7:2:7
% 對(duì)符號(hào)能量進(jìn)行歸一化
matrix_mapping(m) = (k+1j*l)/sqrt(42);
m=m+1;
end
end
matrix_mapping = matrix_mapping(...
[[ 0 1 3 2 7 6 4 5]...
8+[ 0 1 3 2 7 6 4 5]...
24+[ 0 1 3 2 7 6 4 5]...
16+[ 0 1 3 2 7 6 4 5]...
56+[ 0 1 3 2 7 6 4 5]...
48+[ 0 1 3 2 7 6 4 5]...
32+[ 0 1 3 2 7 6 4 5]...
40+[ 0 1 3 2 7 6 4 5]]+1);
index_mod = [32 16 8 4 2 1]*Symbol_premod ;
Symbol_mod = matrix_mapping(index_mod + 1);
end
該函數(shù)是一個(gè)調(diào)制函數(shù)
分為兩部分,首先在Frame選出一個(gè)user一個(gè)symbol所需要發(fā)送的比特,改變形狀后進(jìn)行調(diào)制,調(diào)制后放入步驟二所獲得的對(duì)應(yīng)的子載波中。
進(jìn)行調(diào)制輸入比特為(N_mod, N_subcarrier_per_user),輸出一個(gè)(1,N_subcarrier_per_user),然后反轉(zhuǎn)后放入到對(duì)應(yīng)子載波中
調(diào)制采用的是非常巧妙的方式,首先獲得格雷碼的映射,然后一一對(duì)應(yīng),可惜仔細(xì)學(xué)習(xí)一下該函數(shù)。
四.步驟四:Alamouti編碼
%-----------------------STBC時(shí)空塊碼-----------------%
%-----------------------author:lzx-------------------------%
%-----------------------date:2022年5月5日15點(diǎn)52分-----------------%
function Frame_STBC = STBCCoding(Frame_mod, N_subcarrier, N_symbol, N_Tx)
Frame_STBC = zeros(N_subcarrier, N_symbol, N_Tx);
if (mod(N_symbol,N_Tx))
error('空時(shí)編碼器輸入符號(hào)不匹配,子程序st_coding出錯(cuò)');
else
for ispace = 1:N_symbol/N_Tx
if N_Tx == 2
X1=Frame_mod(:,(ispace-1)*N_Tx+1);%取第一列,即第一個(gè)OFDM符號(hào)
X2=Frame_mod(:,(ispace-1)*N_Tx+2);%取第二列,即第二個(gè)OFDM符號(hào)
Symbol_STBC = [X1 X2;-conj(X2) conj(X1)];%alamouti編碼
elseif N_Tx == 4
X1=Frame_mod(:,(ispace-1)*N_Tx+1);%取第一列,即第一個(gè)OFDM符號(hào)
X2=Frame_mod(:,(ispace-1)*N_Tx+2);%取第二列,即第二個(gè)OFDM符號(hào)
X3=Frame_mod(:,(ispace-1)*N_Tx+3);%取第一列,即第一個(gè)OFDM符號(hào)
X4=Frame_mod(:,(ispace-1)*N_Tx+4);%取第二列,即第二個(gè)OFDM符號(hào)
Symbol_STBC = [ X1 X2 X3 X4;...
-X2 X1 -X4 X3;...
-X3 X4 X1 -X2;...
-X4 -X3 X2 X1;...
conj(X1) conj(X2) conj(X3) conj(X4);...
-conj(X2) conj(X1) -conj(X4) conj(X3);...
-conj(X3) conj(X4) conj(X1) -conj(X2);...
-conj(X4) -conj(X3) conj(X2) conj(X1)];
end
for iant = 1:N_Tx
Symbol_STBC_per_ant = reshape(Symbol_STBC(:,iant), N_subcarrier, N_Tx);
Frame_STBC(:, (ispace-1)*N_Tx+1:ispace*N_Tx, iant) = Symbol_STBC_per_ant;
end
end
end
這是一個(gè)標(biāo)準(zhǔn)的STBC編碼,每次取出相鄰的兩個(gè)symbol的符號(hào)(同時(shí)包含導(dǎo)頻和數(shù)據(jù),就是一個(gè)完整的symbol)(因?yàn)檫@才滿足Alamouti編碼0時(shí)刻和T時(shí)刻的要求)。然后進(jìn)行STBC的編碼把原本(N_subcarrier,2)變?yōu)椋?*N_subcarrier,2)。之后對(duì)于編碼后的每一列,是由一根天線發(fā)送的,把每一列reshape成(N_subcarrier, 2)(這個(gè)2是因?yàn)?*2編碼),放入總矩陣中,當(dāng)每一列都擺放后,得到一個(gè)(N_subcarrier,2,2)的矩陣,這其中第二個(gè)2是由于這個(gè)2是因?yàn)?*2編碼,第三個(gè)2是由于兩根天線,其實(shí)是一樣的。
當(dāng)所有的symbol都被取出后,最后得到一個(gè)(N_subcarrier,N_symbol,2)的矩陣,這就是編碼結(jié)果了。
從結(jié)果上來看,它將原本(N_subcarrier,N_symbol)個(gè)信號(hào)生成為了(N_subcarrier,N_symbol,2)個(gè)信號(hào),給兩個(gè)天線分別發(fā)送,這就是發(fā)射分集。
五.步驟五:OFDM調(diào)制
%-----------------------調(diào)制函數(shù)---------------------%
%-----------------------author:lzx--------------------------%
%-----------------------date:2022年5月6日21點(diǎn)11分-----------------%
function Frame_transmit = OFDMModulator(Frame_pilot, N_sym, N_subcarrier, N_symbol, N_Tx, N_GI)
Frame_transmit = zeros(1,N_sym*N_symbol,N_Tx);
for iant = 1:N_Tx
% ifft乘sqrt(N_subc)以保證變換前后能量不變
% 我們假設(shè)頻域的樣點(diǎn)是在[-fs/2 fs/2]中的, fs是采樣頻率
% 使用fftshift函數(shù)目的是使得變換前的頻域樣點(diǎn)轉(zhuǎn)換到[0 fs]中,以滿足IFFT變換的要求
Frame_TD = sqrt(N_subcarrier) * ifft( fftshift( Frame_pilot(:,:,iant), 1 ) );
Frame_CP = Frame_TD(N_subcarrier - N_GI + 1:N_subcarrier ,:);
Frame_withCP = [Frame_CP; Frame_TD];
% 轉(zhuǎn)換為串行信號(hào)
Frame_transmit(:,:,iant) = reshape( Frame_withCP, 1, N_sym*N_symbol);
end
該函數(shù)是對(duì)信號(hào)進(jìn)行OFDM調(diào)制,調(diào)制按照天線來進(jìn)行,將(N_subcarrier,N_symbol)大小的數(shù)據(jù)在列這一維上做fftshift然后進(jìn)行ifft,這樣還會(huì)得到(N_subcarrier,N_symbol)的數(shù)據(jù),然后加CP,CP的大小是(N_GI, N_symbol),疊在數(shù)據(jù)的頭上,最后,發(fā)送時(shí)轉(zhuǎn)換為串行信號(hào),發(fā)送一個(gè)(1,(N_GI+N_subcarrier)*N_symbol)的信號(hào),多跟天仙的結(jié)果是(1,(N_GI+N_subcarrier)*N_symbol,2).
這里為什么要做并串轉(zhuǎn)換呢?實(shí)際上就是按順序發(fā)送symbol,因?yàn)樘炀€一次只能發(fā)送一個(gè)symbol呀~
信道
一.信道步驟一:加噪
這已經(jīng)是老生常談了
Power_transmit = var(Frame_transmit);%發(fā)送信號(hào)功率
N_noise = size(Frame_transmit,2);
noise = NoiseGenerator(EbN0, Power_transmit, N_noise);
Frame_noise = Frame_transmit+noise;
%-----------------------生成高斯噪聲---------------------%
%-----------------------author:lzx--------------------------%
%-----------------------date:2022年5月6日22點(diǎn)43分-----------------%
function noise = NoiseGenerator(EbN0, Power_transmit, N_noise)
sigma = sqrt(Power_transmit/(2*EbN0));%標(biāo)準(zhǔn)差sigma
noise_real = randn(1,N_noise,2);
noise_real(:,:,1)=noise_real(:,:,1).*sigma(1);
noise_real(:,:,2)=noise_real(:,:,2).*sigma(2);
noise_imag = randn(1,N_noise,2);
noise_imag(:,:,1)=noise_imag(:,:,1).*sigma(1);
noise_imag(:,:,2)=noise_imag(:,:,2).*sigma(2);
noise=complex(noise_real,noise_imag);%復(fù)噪聲序列
其實(shí)這個(gè)代碼是比較愚蠢的,生成和發(fā)送信號(hào)等大的一個(gè)噪聲矩陣,不詳細(xì)說了
二.信道步驟二:信道
沒有仿真的坐而論道,希望各位大佬指教
這個(gè)仿真里。。。。。居然沒有信道模型,這其實(shí)是我最想知道的一個(gè)模型
目前對(duì)于信道的仿真,我們是割裂的。
在SISO-OFDM中,我們采用的是一個(gè)標(biāo)準(zhǔn)的TDL模型,他的大小是(1,Tau_max),然后進(jìn)行卷積
在MIMO中,我們使用的是一個(gè)平坦信道,他是一個(gè)(N_Rx,NTx)的信道,直接進(jìn)行相乘
那么在MIMO-OFDM中如何進(jìn)行結(jié)合?因?yàn)槊恳粋€(gè)子載波都應(yīng)該對(duì)應(yīng)著一個(gè)子信道,信道的數(shù)量應(yīng)該是(N_subcarrier, N_Tx*N_Rx);但這應(yīng)該如何仿真呢?
接收機(jī)
首先要明確,接收機(jī)有N_user個(gè)
一. 步驟一:OFDM解調(diào)
%-----------------------OFDM的接收---------------------%
%-----------------------author:lzx-------------------------%
%-----------------------date:2022年5月5日16點(diǎn)35分-----------------%
function Frame_recieve = OFDMDemodulator(Frame_noise, N_sym, N_subcarrier,N_symbol,N_Rx, N_GI)
Frame_recieve = zeros(N_subcarrier,N_symbol,N_Rx);
for iant = 1:N_Rx
Frame_symbol = reshape(Frame_noise(1,:,iant), N_sym, N_symbol);
Frame_noGI = Frame_symbol(N_GI+1:end, :);
% fft乘1/sqrt(N_subc)以保證變換前后能量不變
% 我們假設(shè)頻域的樣點(diǎn)是在[-fs/2 fs/2]中的, fs是采樣頻率
% fftshift目的是使得變換后的頻域樣點(diǎn)在[-fs/2 fs/2]中,而不是[0 fs]中
Frame_recieve(:,:,iant) = fftshift(1/sqrt(N_subcarrier) * fft( Frame_noGI ), 1);
end
% Frame_recieve = Frame_FD(:, 1:N_symbol ,:); % 數(shù)據(jù)OFDM符號(hào), 包括導(dǎo)頻符號(hào)
作為天線,自然應(yīng)該按天線處理
接收到的信號(hào)重新串并轉(zhuǎn)換為(N_sym, N_symbol),因?yàn)槲覀兛隙ㄊ且粋€(gè)symbol一個(gè)symbol接收到的,去掉CP然后反做fft即可
最后得到的輸出是(N_subcarrier,N_symbol),按天線接收后,得到的是(N_subcarrier,N_symbol,2)不過我這里存在疑問,接收端如何能分開發(fā)射端兩根天線?我對(duì)此感到不解
二. 接收機(jī)二:STBC解碼
%-----------------------STBC解碼---------------------%
%-----------------------author:lzx-------------------------%
%-----------------------date:2022年5月7日10點(diǎn)07分-----------------%
function Frame_decoded = STBCDecoding(Frame_recieve, H, N_subcarrier, N_Tx,N_Rx, N_symbol)
Frame_decoded = zeros(N_subcarrier, N_symbol);
% 把H_freq轉(zhuǎn)化為空時(shí)譯碼器的輸入格式,為一個(gè)N_subc*N_ant_pair的矩陣,每列表示:
% 1-->1 ,1-->2,...,1-->N_Rx_ant, ... ,N_Tx_ant-->1, N_Tx_ant-->2,..., N_Tx_ant-->N_Rx_ant
if (N_Tx == 2)&&(N_Rx == 2)
for ispace = 1:N_symbol/N_Tx
% 構(gòu)造輸入進(jìn)空時(shí)譯碼器的符號(hào),用t表示時(shí)間號(hào),a表示天線號(hào),其格式為:
% [Recv(t1,a1) Recv(t2,a1) Recv(t1,a2) Recv(t2,a2)].
R = [];
for iant = 1:N_Rx
R = [R Frame_recieve(:,(ispace-1)*N_Tx+1:ispace*N_Tx,iant) ];%對(duì)于2X2MIMO來說,R矩陣即為[Xe -conj(Xo) Xo conj(Xe)]
end
H11=H(:,1);%1發(fā)送天線--》1接收天線信道參數(shù)
H12=H(:,2);%1發(fā)送天線--》2接收天線信道參數(shù)
H21=H(:,3);%2發(fā)送天線--》1接收天線信道參數(shù)
H22=H(:,4);%2發(fā)送天線--》2接收天線信道參數(shù)
R11=R(:,1);%1發(fā)送天線發(fā)送的第一個(gè)符號(hào)
R12=R(:,2);%1發(fā)送天線發(fā)送的第二個(gè)符號(hào)
R21=R(:,3);%2發(fā)送天線發(fā)送的第一個(gè)符號(hào)
R22=R(:,4);%2發(fā)送天線發(fā)送的第二個(gè)符號(hào)
for i=1:1:N_subcarrier
X1(i,1)=(R11(i)*conj(H11(i))+conj(R12(i))*H21(i)+R21(i)*conj(H12(i))+conj(R22(i))*H22(i))/( H11(i)*conj(H11(i)) + H21(i)*conj(H21(i)) + H12(i)*conj(H12(i)) + H22(i)*conj(H22(i)));
X2(i,1)=(R11(i)*conj(H21(i))-conj(R12(i))*H11(i)+R21(i)*conj(H22(i))-conj(R22(i))*H12(i))/( H11(i)*conj(H11(i)) + H21(i)*conj(H21(i)) + H12(i)*conj(H12(i)) + H22(i)*conj(H22(i)));
end
Sybmol_decoded = 2*[X1 X2]; % 非常扯淡,因?yàn)樯厦娴姆帜甘清e(cuò)誤的
Frame_decoded(:,(ispace-1)*N_Tx+1:ispace*N_Tx) = Sybmol_decoded;
end
end
首先我要申明,我認(rèn)為該仿真是錯(cuò)的Sybmol_decoded = 2*[X1 X2]; % 非常扯淡,因?yàn)樯厦娴姆帜甘清e(cuò)誤的為什么莫名其妙的×2呢,因?yàn)樯厦? H11(i)*conj(H11(i)) + H21(i)*conj(H21(i)) + H12(i)*conj(H12(i)) + H22(i)*conj(H22(i)));是錯(cuò)誤的,應(yīng)該只選取其中兩個(gè)。代碼的實(shí)現(xiàn)更是丑陋,所以我也沒有重寫的欲望了。她也沒有解決我想知道的信道的問題,
對(duì)于每?jī)闪羞M(jìn)行一個(gè)操作,再加上兩根天線,生成會(huì)原本的(N_subcarrier*2,2)的矩陣,然后解算。的總之他會(huì)把原本(N_subcarrier,N_symbol,2)的信號(hào)接收后得到N_subcarrier,N_symbol).
三.接收機(jī)步驟三:解調(diào)
%-----------------------QAM解調(diào)-----------------%
%-----------------------author:lzx-------------------------%
%-----------------------date:2022年5月7日11點(diǎn)51分-----------------%
function Frame_demod = Demodulator(Frame_decoded, index_data_iuser, N_mod, N_symbol)
Frame_demod = [];
for isymbol = 1:N_symbol
Symbol_demod = SymbolDemodulator(Frame_decoded(index_data_iuser, isymbol).', N_mod);
Frame_demod = [Frame_demod; Symbol_demod(:)];
end
%-----------------------每個(gè)符號(hào)的QAM解調(diào)-----------------%
%-----------------------author:lzx-------------------------%
%-----------------------date:2022年5月7日11點(diǎn)51分-----------------%
function Symbol_demod = SymbolDemodulator(Symbol, N_mod)
switch N_mod
% BPSK解調(diào)
case 1
Symbol_demod = real(Symbol) > 0;
% QPSK解調(diào)
case 2
% 由QPSK的星座圖可以觀察到
bit0 = real(Symbol) ;
bit1 = imag(Symbol) ;
% 得到2行, 列數(shù)為符號(hào)數(shù)的輸出矩陣
Symbol_demod(1,:) = bit0 > 0;
Symbol_demod(2,:) = bit1 > 0;
% 8PSK解調(diào)
case 3
% 參見8PSK的星座圖
bit0 = -imag( Symbol * exp(1j*pi/8)) ;
% bit1和bit2解調(diào),都需要進(jìn)行星座旋轉(zhuǎn)
bit1 = -real(Symbol * exp(1j*pi/8)) ;
bit2 = [];
for isymbol = 1:length(Symbol)
tmp = Symbol(isymbol) * exp(-1j*pi/8);
if ((real(tmp) <0) && (imag(tmp) >0)) || ((real(tmp) >0) && (imag(tmp) <0))
bit2 = [bit2 0];
else
bit2 = [bit2 1];
end
end
Symbol_demod(1,:) = bit0 >0;
Symbol_demod(2,:) = bit1 >0;
Symbol_demod(3,:) = bit2 ; % 已經(jīng)硬判決
% 16QAM解調(diào)
case 4
bit0 = real(Symbol);
bit2 = imag(Symbol);
% 以bit1的生成來說明方法:
% 2/sqrt(10) 為臨界值, abs(real(sym))大于此, 則bit1為負(fù),硬判決得到0 ; 反之為正
bit1 = 2/sqrt(10)-(abs(real(Symbol)));
bit3 = 2/sqrt(10)-(abs(imag(Symbol)));
Symbol_demod(1,:) = bit0 > 0;
Symbol_demod(2,:) = bit1 > 0;
Symbol_demod(3,:) = bit2 > 0;
Symbol_demod(4,:) = bit3 > 0;
% 64QAM解調(diào)
case 6
bit0 = real(Symbol);
bit3 = imag(Symbol);
bit1 = 4/sqrt(42)-abs(real(Symbol));
bit4 = 4/sqrt(42)-abs(imag(Symbol));
for m=1:size(Symbol,2)
for k=1:size(Symbol,1)
if abs(4/sqrt(42)-abs(real(Symbol(k,m)))) <= 2/sqrt(42)
bit2(k,m) = 2/sqrt(42) - abs(4/sqrt(42)-abs(real(Symbol(k,m))));
elseif abs(real(Symbol(k,m))) <= 2/sqrt(42)
bit2(k,m) = -2/sqrt(42) + abs(real(Symbol(k,m)));
else
bit2(k,m) = 6/sqrt(42)-abs(real(Symbol(k,m)));
end
if abs(4/sqrt(42)-abs(imag(Symbol(k,m)))) <= 2/sqrt(42)
bit5(k,m) = 2/sqrt(42) - abs(4/sqrt(42)-abs(imag(Symbol(k,m))));
elseif abs(imag(Symbol(k,m))) <= 2/sqrt(42)
bit5(k,m) = -2/sqrt(42) + abs(imag(Symbol(k,m)));
else
bit5(k,m) = 6/sqrt(42)-abs(imag(Symbol(k,m)));
end
end
end
Symbol_demod(1,:) = bit0 > 0;
Symbol_demod(2,:) = bit1 > 0;
Symbol_demod(3,:) = bit2 > 0;
Symbol_demod(4,:) = bit3 > 0;
Symbol_demod(5,:) = bit4 > 0;
Symbol_demod(6,:) = bit5 > 0;
end
這里對(duì)于QAM,我沒有自己寫過就不班門弄斧了,但我大致知道他的思路
解調(diào)時(shí),也是對(duì)于每一個(gè)symbol的每一個(gè)用戶的那一部分子載波進(jìn)行解調(diào),挑選出屬于該接收機(jī) 子載波然后全部并聯(lián)起來,最后得到一個(gè)(N_data*Nysmbol, 1)便于計(jì)算誤碼率。文章來源:http://www.zghlxwxcb.cn/news/detail-402130.html
總結(jié)
總的來說,這個(gè)仿真我覺得不行!而且我認(rèn)為OFDM的發(fā)送解調(diào)和STBC的發(fā)送解調(diào)順序可能有問題。如果后續(xù)看到更好的仿真,我會(huì)繼續(xù)更新的!文章來源地址http://www.zghlxwxcb.cn/news/detail-402130.html
到了這里,關(guān)于初識(shí)MIMO-OFDM(三):完整的MIMO-OFDM仿真的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!