拿著估計信道。有壹條誤碼率曲線
全部清除;
全部關閉;
Fprintf( '\n OFDM模擬\ n \ n ');
% - %
%參數定義%
% - %
IFFT _賓_長度= 1024;
載波計數= 200;
每符號位數= 2;
符號每載波= 50;
%子載波數量200
%數字/符號2
%符號/載體50
%訓練符號數10
%循環前綴長度T/4(作者註明)全零CP
%調制模式QDPSK
多路徑信道2、3和4的數量百分比(默認)
%通道最大延遲7(單位數據符號)
%模擬條件發送和接收之間的嚴格同步
% SNR =輸入(' SNR = ');%輸入信噪比參數
信噪比= 3:14;%定義信噪比範圍
BER =零(1,長度(SNR));
基帶輸出長度=載波計數*符號每載波*比特每符號;%計算發送的二進制序列的長度
carriers =(1:carrier _ count)+(floor(IFFT _ bin _長度/4)-floor(carrier _ count/2));%坐標:(1到200)+156,157-356
共軛_載波= IFFT _ bin _長度-載波+2;%坐標:1024-(157:356)+2 = 1026-(157:356)=(869:670)
%構造* * * yoke時間-載波矩陣,從而應用所謂的RCC,降低計算復雜度算法,即ifft後的結果是實數。
%定義共軛時間載波矩陣
%妳也可以使用flipdim函數來構造對稱的* * *軛矩陣。
% - %
%信號發射%
% - %
%out = rand(1,基帶_ out _ length);
% baseband _ out 1 = round(out);
% baseband _ out 2 = floor(out * 2);
% baseband _ out 3 = ceil(out * 2)-1;
%baseband_out4 = randint(1,baseband _ out _ length);
%四種生成待發送二進制序列的方法,任選壹種生成待發送二進制序列。
%if(基帶輸出1 ==基帶輸出& amp基帶_out1 ==基帶_out3)
% fprintf('傳輸序列已生成\ n \ n ');
% baseband _ out = baseband _ out 1;
%否則
% fprintf('校驗碼!!!!!!!!!!!!!!!!!!!!!\ n \ n’);
%結束
%驗證生成發送的二進制序列的四種方法。
基帶_out=round( rand(1,基帶_ out _ length));
convert _ matrix = shape(baseband _ out,bits_per_symbol,length(baseband _ out)/bits _ per _ symbol);
對於k = 1長度(基帶輸出)/每符號比特數),
模_基帶(k)= 0;
對於i = 1:每符號比特數
模_基帶(k) =模_基帶(k) +轉換_矩陣(I,k)* 2^(bits_per_symbol-I);
結束
結束
%每2位轉換成0到3的整數。
%采用“左msb”模式。
% -
由lavabin進行的測試百分比
%壹個直接將二進制位轉換成十進制數的內置函數
% -
% convert _ matrix 1 = 0(length(baseband _ out)/bits _ per _ symbol,bits _ per _ symbol);
% convert _ matrix 1 = convert _ matrix ';
% Test _ convert _ matrix 1 = bi2de(convert _ matrix 1,bits_per_symbol,' left-msb ');
% Test _ convert _ matrix 2 = bi2de(convert _ matrix 1,bits_per_symbol,' right-msb ');
%功能描述:
% BI2DE將二進制向量轉換為十進制數。
% D = BI2DE(B)將二進制向量B轉換為十進制值D。當B為
% a矩陣,轉換按行執行,輸出D是a
%十進制值的列向量。二進制文件的默認方向
% input是右-MSB;B中的第壹個元素代表最低有效位。
% if(modulo _ baseband = = Test _ convert _ matrix 1 ')
% fprintf(' modulo _ baseband = Test _ convert _ matrix 1 \ n \ n ');
% else if(modulo _ baseband = = Test _ convert _ matrix 2’)
% fprintf(' modulo _ baseband = Test _ convert _ matrix 2 \ n \ n ');
%否則
% fprintf(' modulo _ baseband ~ = any Test _ convert _ matrix \ n \ n ');
%結束
%結束
%我們得到結果“modulo _ baseband = Test _ convert _ matrix 1”。
% -
carrier _ matrix = shape(modulo _ baseband,carrier_count,symbols _ per _ carrier)’;
%生成時間載波矩陣
% - %
% QDPSK調制%
% - %
carrier_matrix = [zeros(1,carrier _ count);載體_矩陣];%添加差分調制的初始相位,即0。
對於i =符號每載波+ 1)
carrier_matrix(i,= rem(carrier_matrix(i,+ carrier_matrix (i-1,,2^bits_per_symbol);%差分調制
結束
載波_矩陣= carrier_matrix*((2*pi)/(2^bits_per_symbol));%產生微分相位。
[X,Y]=pol2cart(carrier_matrix,ones(size(carrier_matrix,1),size(carrier_matrix,2));%從極坐標到復數坐標,第壹個參數是相位,第二個參數是振幅。
% Carrier_matrix包含所有的相位信息,並且所有的幅度都是相同的“1”。
復數_載體_矩陣=復數(X,Y);
%添加訓練序列` 2
training _ symbols =[1j j 1-1j j j 1j j 1j j 1j j 1j j 1j j 1j j 1j...
-j-j-1 1j j-1-j-1j-j-1j-1j-j-1j-1j-1j-1j-1j-1j-1j-j-1...
1j j 1-1-j-j-1j j 1j j 1j j 1j j 1j j 1-1j-j 1-j 1-j 1j 1j 1j 1j 1...
-1-j-j-1j j 1j j 1j-j-1j j 1-j-j-1j-j-1j-j-1j 1j j 1j 1j 1-j-1j-j-65438...
-1 1j j 1-j-j-1j j 1j j 1j-j-1j j j 1j j 1j j 1j 1j% 25次" 1 j j 1 ",25次"-1 -j -j -1 ",共200個符號為壹行
training_symbols = cat(1,training_symbols,訓練_ symbols);
training_symbols = cat(1,training_symbols,訓練_ symbols);%產生4行訓練符號
復數_載波_矩陣= cat(1,訓練_符號,復數_載波_矩陣);%訓練序列與數據合並
%塊類型導頻符號
IFFT _調制=零(每載波4 +符號+ 1,IFFT _ bin _ length);
%這裏,零的行向量位於訓練符號和數據符號之間!!!
% 4個訓練符號和1個零符號
%每個OFDM符號占用壹行“IFFT調制”
IFFT _調制(:,載波)=復數_載波_矩陣;
IFFT _調制(:,共軛_載波)= conj(復數_載波_矩陣);
% -
%測試由lavabin -找到零的索引
%index_of_zeros = zeros(每載波符號,IFFT _ bin _ length-2 *載波計數);
% IFFT _調制1 =零(4 +符號_每載波+ 1,IFFT _ bin _長度);
% IFFT _調制2 =零(每載波4 +符號+ 1,IFFT _ bin _長度);
% IFFT _調制1(6:符號_每載波+5,= IFFT _調制(6:符號_每載波+5,= = 0;
i = 1的百分比:每載波符號數
%index_of_zeros(i,= find(IFFT _調制1(i+5,= = 1);
%結束
% -
時間_波_矩陣= IFFT(IFFT _調制’);用於IFFT操作的%
時間波矩陣=時間波矩陣';%如果X是壹個矩陣,ifft返回矩陣每壹列的逆傅立葉變換。
對於i = 1: 4 +每載波符號數+ 1
windowed_time_wave_matrix( i,)= real(time_wave_matrix( i,));
結束
%得到IFFT結果的實部
%這壹步可以省略,因為IFFT結果都是實數。
可以看出,只取了IFFT之後的載體上的點,沒有復制CP和添加end。
OFDM _ modulation = reshape(windowed _ time _ wave _ matrix ',1,IFFT_bin_length*(4 +符號_每載波+1));
% P2S操作
% -
由lavabin進行的測試百分比
%矩陣轉換的另壹種方式
%ofdm_modulation_tmp =窗口化_時間_波形_矩陣。;
% OFDM _ modulation _ test = OFDM _ modulation _ tmp(';
%if (ofdm調制測試== ofdm調制)
% fprintf(' OFDM _ modulation _ test = = OFDM _ modulation \ n \ n ');
%否則
% fprintf(' OFDM _ modulation _ test ~ = OFDM _ modulation \ n \ n ');
%結束
%我們得到結果“OFDM _ modulation _ test = = OFDM _ modulation”。
% -
Tx _ data = ofdm _ modulation
% - %
%通道模擬%
% - %
d 1 = 4;a 1 = 0.2;D2 = 5;a2 = 0.3D3 = 6;a3 = 0.4D4 = 7;a4 = 0.5%通道模擬
copy1 =零(size(Tx _ data));
對於i = 1 + d1:長度(Tx_data)
copy 1(I)= a 1 * Tx _ data(I-d 1);
結束
copy2 =零(size(Tx _ data));
對於i = 1 + d2:長度(Tx_data)
copy 2(I)= a2 * Tx _ data(I-D2);
結束
copy3 =零(size(Tx _ data));
對於i = 1 + d3:長度(Tx_data)
copy 3(I)= a3 * Tx _ data(I-D3);
結束
copy4 =零(size(Tx _ data));
對於i = 1 + d4:長度(Tx_data)
copy 4(I)= a4 * Tx _ data(I-D4);
結束
Tx _ data = Tx _ data+copy 1+copy 2+copy 3+copy 4;% 4個多路徑
Tx _ signal _ power = var(Tx _ data);
對於IDX = 1:長度(信噪比)%蒙特卡洛模擬
linear_SNR = 10^(信噪比(idx)/10);
noise _σ= Tx _ signal _ power/linear _ SNR;
噪聲_比例_因子= sqrt(噪聲_西格瑪);
noise = randn(1,長度(Tx _ data))* noise _ scale _ factor;
Rx_Data = Tx_data +噪聲;
% - %
%信號接收%
% - %
Rx _ Data _ matrix = shape(Rx _ Data,IFFT_bin_length,4+symbols _ per _ carrier+1);
Rx _ spectrum = FFT(Rx _ Data _ matrix);
%假設Tx和Rx之間精確同步
Rx _ carriers = Rx _ spectrum(carriers,)';
Rx _ training _ symbols = Rx _ carriers((1:4),:);
Rx _ carrier = Rx _ carriers((5:55),:);
% - %
%信道估計%
% - %
Rx _ training _ symbols = Rx _ training _符號。/training _ symbols;
Rx _ training _ symbols _ deno = Rx _ training _ symbols。^2;
Rx _ training _ symbols _ deno = Rx _ training _ symbols _ deno(1,+Rx_training_symbols_deno(2,+Rx_training_symbols_deno(3,+Rx_training_symbols_deno(4,;
Rx _ training _ symbols _ nume = Rx _ training _ symbols(1,)+Rx_training_symbols(2,)+ Rx_training_symbols(3,)+Rx_training_symbols(4,);
Rx _ training _ symbols _ nume = conj(Rx _ training _ symbols _ nume);
%取4個向量的導頻符號進行平均優化。
%對“線向量”即單個OFDM符號進行操作。
%的原理:求1/H對FFT後的數據進行頻域補償。
% 1/H = conj(H)/H^2因為H^2 = H * conj(H)
Rx _ training _ symbols = Rx _ training _ symbols _ nume。/Rx _ training _ symbols _ deno;
Rx _ training _ symbols = Rx _ training _ symbols _ nume。/Rx _ training _ symbols _ deno;
Rx_training_symbols _ 2 = cat(1,Rx _ training _ symbols,Rx _ training _ symbols);
Rx _ training _ symbols _ 4 = cat(1,Rx_training_symbols_2,Rx _ training _ symbols _ 2);
Rx _ training _ symbols _ 8 = cat(1,Rx_training_symbols_4,Rx _ training _ symbols _ 4);
Rx _ training _ symbols _ 16 = cat(1,Rx_training_symbols_8,Rx _ training _ symbols _ 8);
Rx _ training _ symbols _ 32 = cat(1,Rx_training_symbols_16,Rx _ training _ symbols _ 16);
Rx _ training _ symbols _ 48 = cat(1,Rx_training_symbols_32,Rx _ training _ symbols _ 16);
Rx _ training _ symbols _ 50 = cat(1,Rx_training_symbols_48,Rx _ training _ symbols _ 2);
Rx _ training _ symbols = cat(1,Rx_training_symbols_50,Rx _ training _ symbols);
Rx _ carriers = Rx _ training _ symbols。* Rx _ carriers%用於頻域單抽頭均衡。
Rx_phase =角度(Rx _ carriers)*(180/pi);
phase _ negative = find(Rx _ phase & lt;0) ;
% -使用“rem”的測試-
% Rx _ phase 1 = Rx _ phase;
% Rx _ phase2 = Rx _ phase
% Rx _ phase 1(phase _ negative)= rem(Rx _ phase 1(phase _ negative)+360,360);
% Rx _ phase 2(phase _ negative)= Rx _ phase 2(phase _ negative)+360;
% if Rx _ phase 2(phase _ negative)= = Rx _ phase 1(phase _ negative)
%fprintf('\n在負相位轉換中不需要使用rem。\n ')
%否則
% fprintf('\n我們需要在負相變中使用rem。\n ')
%結束
% -
Rx _ phase(phase _ negative)= rem(Rx _ phase(phase _ negative)+360,360);%將負相位轉換為正相位
Rx _ decoded _ phase = diff(Rx _ phase);
%這就是為什麽要在它前面加初始階段。
% "此處零的行向量位於訓練符號和數據符號之間!!!"
phase _ negative = find(Rx _ decode _ phase & lt;0) ;
Rx _ decoded _ phase(phase _ negative)= rem(Rx _ decoded _ phase(phase _ negative)+360,360);%將負相位再次轉換為正相位。
% - %
% QDPSK解調%
% - %
base _ phase = 360 /2^bits_per_symbol;
δ_ phase = base _ phase/2;
Rx_decoded_symbols =零(size(Rx_decoded_phase,1),size(Rx_decoded_phase,2));
對於I = 1:(2^bits_per_symbol-1)
center _ phase = base _ phase * I;
plus_delta =中心_相位+delta _相位;%決策閾值1
minus_delta =中心相位-delta _相位;%決策閾值2
decoded = find((Rx _ decoded _ phase & lt;= plus _ delta)& amp;(Rx _ decoded _ phase & gtMINUS _ delta));
Rx_decoded_symbols(已解碼)= I;
結束
%只對三個領域進行了評判。
剩余區域的%是零相位空間。
%定義解調矩陣時,該區域已被定義為零。
Rx _ serial _ symbols = reshape(Rx _ decoded _ symbols ',1,size(Rx_decoded_symbols,1)* size(Rx _ decoded _ symbols,2));
對於i =每符號比特數:-1: 1
如果i ~= 1
Rx_binary_matrix(i,)= rem(Rx_serial_symbols,2);
Rx _串行_符號= floor(Rx _串行_符號/2);
其他
Rx_binary_matrix( i,)= Rx _ serial _ symbols
結束
結束
%整數對二進制
baseband _ in = shape(Rx _ binary _ matrix,1,size(Rx_binary_matrix,1)*size(Rx_binary_matrix,2));
% - %
%錯誤率計算%
% - %
% bit _ errors(idx)= find(baseband _ in ~ = baseband _ out);
% find的結果的每個元素都是滿足邏輯條件的輸入向量的標簽,它的向量長度也是發送和接收不同的比特數。
% bit _ error _ count(idx)= size(bit _ error,2);
%total_bits = size(基帶_輸出,2);
%位錯誤率=位錯誤計數/總位數;
%fprintf ( '%f \n ',bit _ error _ rate);
[number_err(idx),BER(idx)] = biterr(基帶_out,基帶_ in);
結束
半對數(SNR,BER,' r * ');
圖例(' OFDM BER-SNR ');
xlabel(' SNR(dB)');y label(' BER ');
標題(“OFDM”);
網格打開;
% - %
%結束%
% - %
%
% 1.這個程序執行壹個簡單的LMS信道估計,沒有增加與其他信道估計算法的比較,如MMSE;
%
%2.仿真條件是系統處於理想同步狀態。