国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

初識(shí)MIMO-OFDM(三):完整的MIMO-OFDM仿真

這篇具有很好參考價(jià)值的文章主要介紹了初識(shí)MIMO-OFDM(三):完整的MIMO-OFDM仿真。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

初識(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呀~

初識(shí)MIMO-OFDM(三):完整的MIMO-OFDM仿真

初識(shí)MIMO-OFDM(三):完整的MIMO-OFDM仿真

信道

一.信道步驟一:加噪

這已經(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ì)算誤碼率。

總結(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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • OFDM系統(tǒng)仿真【matlab代碼】

    OFDM系統(tǒng)仿真【matlab代碼】

    matlab源碼鏈接: https://blog.csdn.net/qq_44394952/article/details/122508697. 為了便于計(jì)算把系統(tǒng)的仿真參數(shù)設(shè)置的較小。仿真參數(shù)為:子載波個(gè)數(shù)為 200,總符號(hào)數(shù)為100,IFFT/FFT 的長(zhǎng)度為 512,調(diào)制方式選用16QAM調(diào)制,為了最大限度的減少插入保護(hù)間隔帶來的信噪比損失,一般選擇符號(hào)周期長(zhǎng)

    2024年02月02日
    瀏覽(26)
  • OFDM雷達(dá)信號(hào)模糊函數(shù)MATLAB仿真分析

    OFDM雷達(dá)信號(hào)模糊函數(shù)MATLAB仿真分析

    OFDM大家都不陌生,特別是主要研究通信大法的小伙伴們。 正交頻分復(fù)用 (OFDM) 是一種可以在多個(gè)正交子載波上編碼通信數(shù)據(jù)的多載波調(diào)制方法,可以通過并行的低速子載波來實(shí)現(xiàn)高速數(shù)據(jù)傳輸。OFDM信號(hào)具有頻譜效率高、能抵抗載波間干擾(ICI)和符號(hào)間干擾(ISI)、誤碼率小、可

    2023年04月08日
    瀏覽(19)
  • 基于注水算法的MIMO信道容量matlab仿真

    基于注水算法的MIMO信道容量matlab仿真

    目錄 1.算法描述 2.仿真效果預(yù)覽 3.MATLAB核心程序 4.完整MATLAB ? ? ? MIMO無線通信技術(shù)源于天線分集與智能天線技術(shù),具有二者的優(yōu)越性,MIMO系統(tǒng)的發(fā)射端與接收端都采用多天線單元,MIMO系統(tǒng)具有抑制干擾、抗多徑衰落等特征。使用MIMO技術(shù)的好處在于能創(chuàng)建多個(gè)并行的正交子

    2024年02月16日
    瀏覽(30)
  • 開源代碼 | FMCW-MIMO雷達(dá)仿真MATLAB

    開源代碼 | FMCW-MIMO雷達(dá)仿真MATLAB

    本文編輯:調(diào)皮哥的小助理 本程序來源:https://github.com/ekurtgl/FMCW-MIMO-Radar-Simulation,作者是阿拉巴馬大學(xué)博士生艾庫特格爾,研究方向主要是雷達(dá)信號(hào)處理人類活動(dòng)識(shí)別以及雷達(dá)數(shù)據(jù)的機(jī)器學(xué)習(xí)應(yīng)用,這份比較新的開源雷達(dá)仿真代碼,值得大家學(xué)習(xí)。 下面主要分析代碼的主要

    2023年04月20日
    瀏覽(24)
  • 基于MATLAB的MIMO信道估計(jì)(附完整代碼與分析)

    基于MATLAB的MIMO信道估計(jì)(附完整代碼與分析)

    目錄 一. 介紹 二. MATLAB代碼 三. 運(yùn)行結(jié)果與分析 3.1 均方誤差(MSE)與訓(xùn)練功率(dB)的關(guān)系 3.2 不同信道估計(jì)方法性能對(duì)比 本篇將在MATLAB的仿真環(huán)境中對(duì)比MIMO幾種常見的信道估計(jì)方法的性能。 有關(guān)MIMO的介紹可看轉(zhuǎn)至此篇博客: MIMO系統(tǒng)模型構(gòu)建_嘮嗑!的博客-CSDN博客 在所有

    2024年02月06日
    瀏覽(241)
  • 基于MATLAB計(jì)算MIMO信道容量(附完整代碼與分析)

    基于MATLAB計(jì)算MIMO信道容量(附完整代碼與分析)

    目錄 一.介紹 二. 代碼 三. 運(yùn)行結(jié)果及分析 3.1??MIMO信道容量:固定發(fā)射天線數(shù)為4 3.2?MIMO信道容量:固定接收天線數(shù)為4 3.3?AWGN信道與瑞利信道容量 四. 總結(jié) 本文章將在MATLAB環(huán)境中分析MIMO信道容量,AWGN信道容量,瑞利信道容量和 Alamouti碼(空時(shí)塊碼)信道容量。 AWGN: Addit

    2023年04月26日
    瀏覽(29)
  • 基于OFDM的水下圖像傳輸通信系統(tǒng)matlab仿真

    基于OFDM的水下圖像傳輸通信系統(tǒng)matlab仿真

    目錄 1.算法運(yùn)行效果圖預(yù)覽 2.算法運(yùn)行軟件版本 3.部分核心程序 4.算法理論概述 5.算法完整程序工程 matlab2022a ? ? ? ?基于OFDM的水下圖像傳輸通信系統(tǒng)是一種用于在水下環(huán)境中傳輸圖像數(shù)據(jù)的通信系統(tǒng)。它采用了OFDM(Orthogonal Frequency Division Multiplexing)技術(shù),這種技術(shù)在水下

    2024年02月10日
    瀏覽(23)
  • OFDM通信系統(tǒng)的LS信道估計(jì)均衡算法matlab仿真

    OFDM通信系統(tǒng)的LS信道估計(jì)均衡算法matlab仿真

    目錄 一、理論基礎(chǔ) 二、核心程序 三、仿真結(jié)論 ? ? ? OFDM主要思想是:將信道分成若干正交子信道,將高速數(shù)據(jù)信號(hào)轉(zhuǎn)換成并行的低速子數(shù)據(jù)流,調(diào)制到在每個(gè)子信道上進(jìn)行傳輸。正交信號(hào)可以通過在接收端采用相關(guān)技術(shù)來分開,這樣可以減少子信道之間的相互干擾(ISI) 。

    2024年02月06日
    瀏覽(27)
  • 3D-MIMO信道模型的理論概述和matlab仿真

    目錄 一、理論基礎(chǔ) 二、核心程序 三、測(cè)試結(jié)果 ? ? ? ?信道模型的建模,其在不同場(chǎng)景中所對(duì)應(yīng)的參數(shù)和分別都是不同的,因此,通過修改信道模型在角度域和延遲域[40]的特定的參數(shù)和分布,就可以獲得不同的信道模型。 ? ? ? ?3D-MIMO(Three-Dimensional Multiple-Input Multiple-O

    2024年02月07日
    瀏覽(34)
  • MIMO大規(guī)模天線陣列原理與matlab仿真(含GUI)

    MIMO大規(guī)模天線陣列原理與matlab仿真(含GUI)

    傳統(tǒng)的無線通信系統(tǒng)是采用一個(gè)發(fā)送天線和一個(gè)接收天線的通信系統(tǒng),即單輸入單輸出(SISO)天線系統(tǒng)。但由于單天線系統(tǒng)的信道容量較低,不能滿足4G、5G數(shù)據(jù)傳輸需求,由香農(nóng)公式可知,提高信道容量有兩種方式,一是增大帶寬,二是提高信噪比(增大發(fā)射功率)。但由

    2024年01月20日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包