完整的OFDM系統的仿真實現_第1頁
完整的OFDM系統的仿真實現_第2頁
完整的OFDM系統的仿真實現_第3頁
完整的OFDM系統的仿真實現_第4頁
完整的OFDM系統的仿真實現_第5頁
已閱讀5頁,還剩12頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、word%窗函數子程序,子程序名稱:recoswindow.mfunctionrcosw=rcoswindow(beta,Ts)%輸入參數:beta為升余弦窗關鍵系數,Ts為IFFT長度家循環前綴長度t=0:(1+beta)*Ts;rcosw=zeros(1,(1+beta)*Ts);%計算升余弦窗,共有三局部for i=1:beta*Ts; rcosw(i)=0.5+0.5*cos(pi+t(i)*pi/(beta*Ts);%計算升余弦窗的第一局部endrcosw(beta*Ts+1:Ts)=1;%計算升余弦窗低二局部for j=Ts:(1+beta)*Ts+1; rcosw(j-1)=0.

2、5+0.5*cos(t(j)-Ts)*pi/(beta*Ts); %計算升余弦窗第三局部endrcosw=rcosw'%轉換為列矢量%將16QAM信號的解調子程序,子程序的名稱:demoduqam16.mend.word%16QAM調制子程序,子程序名稱為qam16.m%將二進制數目流轉換為16QAM信號function complex_qam_data=qam16(bitdata)%輸入參數:bitdata為二進制數碼流%輸出參數:complex_qam_data為16QAM副信號X1=reshape(bitdata,4,length(bitdata)/4)'%將二進制數碼流

3、以4bitte分段d=1;%轉換4bit二進制碼為十進制碼116,生態農場mapping映射表中的索引for i=1:length(bitdata)/4; for j=1:4 X1(i,j)=X1(i,j)*(2(4-j); end source(i,1)=1+sum(X1(i,:);end%16QAM映射表,改表中存放的16對,沒對兩個實數,表示星座位置mapping=-3*d 3*d;-d 3*d;d 3*d;3*d 3*d;-3*d d;-d d;d d;3*d d;-3*d -d;-d -d;d -d;3*d -d;-3*d -3*d;-d -3*d;d -3*d;3*d -3*d;f

4、or i=1:length(bitdata)/4 qam_data(i,:)=mapping(source(i),:);%數據映射endcomplex_qam_data=complex(qam_data(:,1),qam_data(:,2);%組合為負數形式,形成16QAM信號end.word%將16QAM信號的解調子程序,子程序的名稱:demoduqam16.m%該子程序測試function demodu_bit_symble=demoduqam16(Rx_serial_complex_symbols)%輸入參數為:Rx_serial_complex_symbols為接收端接收到的復16QA

5、M信號%輸出參數:demodu_bit_symble為二進制數碼流complex_symbols=reshape(Rx_serial_complex_symbols,length(Rx_serial_complex_symbols),1);d=1;mapping=-3*d 3*d;-d 3*d;d 3*d;3*d 3*d;-3*d d;-d d;d d;3*d d;-3*d -d;-d -d;d -d;3*d -d;-3*d -3*d;-d -3*d;d -3*d;3*d -3*d;complex_mapping=complex(mapping(:,1),mapping(:,2);%將數據映射

6、表中轉換為16QAM信號,即3組合為復數;for i=1:length(Rx_serial_complex_symbols); for j=1:16; metrics(j)=abs(complex_symbols(i,1)-complex_mapping(j,1); end min_metric decode_symble(i)=min(metrics); %將接收數據與標準16QAM信號比,找到差最小的,將其對應恢復成標準的16QAM信號enddecode_bit_symble=de2bi(decode_symble-1)','left-msb');%將16QAM轉為

7、二進制demodu_bit_symble=reshape(decode_bit_symble',1,length(Rx_serial_complex_symbols)*4);%轉換為一行end.wordbaseband_out_length=16000;rand('twister',0);baseband_out=round(rand(1,baseband_out_length);%產生16000bit待傳輸的二進制比特流。這里存放的是發送的二進制信號與后面解調后的二進制信號比擬,可以計算誤碼率。%16QAM調制病繪制星座圖。complex_carrier_matrix

8、=qam16(baseband_out);figure(1);plot(complex_carrier_matrix,'*r');%繪制16QAM星座圖title('16QAM調制后星座圖');grid on ;.word%16QAM調制子程序,子程序名稱為qam16.m%將二進制數目流轉換為16QAM信號%QAM16測試%輸入參數:bitdata為二進制數碼流%輸出參數:complex_qam_data為16QAM復信號close all;clear all;baseband_out_length=16000;rand('twister',0)

9、;bitdata=round(rand(1,baseband_out_length);complex_carrier_matrix=qam16(bitdata);% X1=reshape(bitdata,4,length(bitdata)/4)'%將二進制數碼流以4bite分段% d=1;% %轉換4bit二進制碼為十進制碼116,生成mapping映射表中的索引% for i=1:length(bitdata)/4;% for j=1:4% X1(i,j)=X1(i,j)*(2(4-j);% end% source(i,1)=1+sum(X1(i,:);% end% %16QAM映射

10、表,該表中存放的16對,沒對兩個實數,表示星座位置% mapping=-3*d 3*d;-d 3*d;d 3*d;3*d 3*d;-3*d d;-d d;d d;3*d d;-3*d -d;-d -d;d -d;3*d -d;-3*d -3*d;-d -3*d;d -3*d;3*d -3*d;% for i=1:length(bitdata)/4% qam_data(i,:)=mapping(source(i),:);%數據映射% end% complex_qam_data=complex(qam_data(:,1),qam_data(:,2);% %組合為負數形式,形成16QAM信號% fi

11、gure(1);% plot(complex_qam_data,'*r');%繪制16QAM星座圖% title('16QAM調制后星座圖');% grid on ;figure(1);plot(complex_carrier_matrix,'*r');%繪制16QAM星座圖title('16QAM調制后星座圖');grid on ;.word% 程序功能% 1通過對OFDM信號各個子載波賦共軛對稱的數據產生一個實OFDM符號。% 2給OFDM符號加循環前綴與循環后綴% 3給OFDM符號加窗。在程序中參加的是升余弦窗,可以通過改變

12、升余弦窗的滾降系數,觀察參加不同升余弦窗對OFDM信號頻譜的的影響% 4信道采用嘉興高斯白噪聲信道。可以通過改變信噪比來改變信道環境,從而在接受端通過誤碼率或是星座圖觀察信道對OFDM信號傳輸的影響% 5去除循環前綴與循環后綴,對OFDM信號進行解調% 程序代碼:clear all;close all;carrier_count=200;%這個程序中OFDM子載波個數為512,其中400即 carrier_count *2為數據符號,其余賦0值symbols_per_carrier=20;%每個子載波上的符號數,在這里即是OFDM符號的個數bits_per_symbol=4;%OFDM符號的每

13、個子載波上傳輸的比特數,4bit通常采用的16QAM調制IFFT_bin_length=512;%FFT的長度,也即一個OFDM符號的子載波個數;PrefixRatio=1/4;%循環前綴的比值,循環前綴與OFDM符號長度的壁紙,通常在1/61/4之間GI=PrefixRatio * (IFFT_bin_length);%保護間隔的長度,這里為128beta=1/32;%升余弦窗的滾降系數GIP=beta*(IFFT_bin_length+GI);%循環后綴的長度,這里為20;SNR=16;%本程序考慮加性高斯白噪聲信道,這里信噪比為30db%=OFDM信號產生=baseband_out_le

14、ngth=carrier_count*symbols_per_carrier * bits_per_symbol;%計算傳輸數據總的比特數,為200*20*4%bits=16000bits。16000bits構成20個OFDM符號,每個OFDM符號200個子載波,每個子載波傳輸4bit信息carriers=(1:carrier_count)+(floor(IFFT_bin_length/4)-floor(carrier_count/2);%計算OFDM符號的在載波的序號,carriers 中存放的序號是29228;conjugate_carriers=IFFT_bin_length-carri

15、ers +2;% conjugate_carriers=IFFT_bin_length-carriers -2;%=這個序號有問題%計算OFDM符號子載波的序號,conjugate_carriers中存放的序號是282481;rand('twister',0);baseband_out=round(rand(1,baseband_out_length);%產生16000bit待傳輸的二進制比特流。這里存放的是發送的二進制信號與后面解調后的二進制信號比擬,可以計算誤碼率。%16QAM調制病繪制星座圖。complex_carrier_matrix=qam16(baseband_ou

16、t);%調用子程序qam16進行16QAM調制。將base_band中的二進制比特流,每4bit轉換為一個16QAM信號,即將二進制比特流每4bit轉換為-3-3j,-3+3j,3-3j,3+3j,%-1-3j,-1+3j,1-3j,1+3j,-3-j,-3+j,3-j,3+j,-1-j,-1+j,1-j,1+j中的一個。轉換后complex_carrier_matrix為1*4000矩陣。complex_carrier_matrix=reshape(complex_carrier_matrix',carrier_count,symbols_per_carrier);%轉換comple

17、x_carrier_matrix中的數據為carrier_coun6t*symbols_per_carrier矩陣,這里為20*200矩陣。figure(1);plot(complex_carrier_matrix,'*r');%繪制16QAM星座圖title('16QAM調制后星座圖');grid on ;%IFFT,即進行OFDM調制IFFT_modulation=zeros(symbols_per_carrier,IFFT_bin_length);%將symbols_per_carrier*IFFT_bin_length矩陣賦0值,這里講20*512矩陣賦

18、0值。這里512是IFFT的長度,也是OFDM符號的子載波個數%這里明顯有問題,以下矯正% IFFT_modulation(:,carriers)=complex_carrier_matrix;IFFT_modulation(:,carriers)=complex_carrier_matrix'%將20*200的complex_carrier_matrix的數據賦給IFFT_modulation的第29228列,即給512個子載波中的第29229個子載波賦值% IFFT_modulation(:,conjugate_carriers)=conj(complex_carrier_matr

19、ix);IFFT_modulation(:,conjugate_carriers)=conj(complex_carrier_matrix');%將20*200的complex_carrier_matrix的數據付給512個子載波中的第282481個子載波,這段程序構造了512個在載波的OFDM符號,并且各個%子載波上的數據是共軛對稱的。這樣做的目的是經過IFFT后形成的OFDM符號均為實數。另外,在512個子載波中,僅有400個子載波為數據,其余為%0值,相當于補零。補零的目的是通常IFFT的長度應該為2的證書次冪。signal_after_IFFT=ifft(IFFT_modula

20、tion,IFFT_bin_length,2);%IFFT實現OFDM調制time_wave_matrix=signal_after_IFFT;figure(2);plot(0:IFFT_bin_length-1,time_wave_matrix(2,:);%畫一個OFDM信號的時域表現axis(0,512,-0.4,0.4);grid on;ylabel('Amplitude');xlabel('Time');title('OFDM Time Signal,One Symbol Period');%添加循環前綴與循環后綴XX=zeros(sym

21、bols_per_carrier,IFFT_bin_length +GI+GIP);%IFFT_bin_length+GI+GIP為OFDM,循環前綴,循環后綴長度之和;for k=1:symbols_per_carrier; for i=1:IFFT_bin_length; XX(k,i+GI)=signal_after_IFFT(k,i); end for i=1:GI XX(k,i)=signal_after_IFFT(k,i+IFFT_bin_length-GI); %添加循環前綴 end for j=1:GIP XX(k,IFFT_bin_length+GI+j)=signal_af

22、ter_IFFT(k,j); %添加循環后綴 endendtime_wave_matrix_cp=XX;%帶循環前綴和循環后綴的OFDM符號figure(3)plot(0:length(time_wave_matrix_cp)-1,time_wave_matrix_cp(2,:);%畫帶循環前綴與循環后綴的OFDM信號的時域波形、axis(0,600,-0.3,0.3);grid on ;ylabel('Ampelitude');xlabel('Time');title('OFDM Time Signal with CP,One Symbol Perio

23、d');%OFDM符號加窗windowed_time_wave_matrix_cp=zeros(1,IFFT_bin_length+GI+GIP);for i=1:symbols_per_carrier windowed_time_wave_matrix_cp(i,:)=real(time_wave_matrix_cp(i,:).*rcoswindow(beta,IFFT_bin_length+GI)' %調用rcoswindow產生升余弦窗,對待循環前綴與循環后綴的OFDM符號加窗endfigure(4);plot(0:IFFT_bin_length-1+GI+GIP,win

24、dowed_time_wave_matrix_cp(2,:);%畫加窗后的OFDM符號axis(0,700,-0.2,0.2);grid on ;ylabel('Amplitude');xlabel('Time');title('OFDM Time Signal Apply a Window,One Symbol Period');%生成發送信號,并串轉換windowed_Tx_data=zeros(1,symbols_per_carrier*(IFFT_bin_length+GI)+GIP);%注意并串轉換后數據的長度為symbols_per_

25、carrier*(IFFT_bin_length%+GI)+GIP,這里考慮了循環前綴與循環后綴的重疊相加windowed_Tx_data(1:IFFT_bin_length+GI+GIP)=windowed_time_wave_matrix_cp(1,:);%符第一個加窗帶循環前綴后綴的OFDM符號值windowed_Tx_data,即發送串行數據for i=1:symbols_per_carrier-1; windowed_Tx_data(IFFT_bin_length+GI)*i+1:(IFFT_bin_length+GI)*(i+1)+GIP)=windowed_time_wave_m

26、atrix_cp(i+1,:); %并串轉換,循環前綴與循環后綴重疊相加endTx_data_withoutwindow =reshape(time_wave_matrix_cp',(symbols_per_carrier)*(IFFT_bin_length+GI+GIP),1)'%不加窗數據并串轉換Tx_data=reshape(windowed_time_wave_matrix_cp',(symbols_per_carrier)*(IFFT_bin_length+GI+GIP),1)'%加窗數據,單按照循環前綴與循環后綴不重疊相加進行并串轉換。此時數據長度為

27、(symbols_per_carrier)*(IFFT_bin_length+GI+GIP)temp_time1=(symbols_per_carrier)*(IFFT_bin_length+GI+GIP);%加窗,循環前綴與循環后綴不重疊數據長度,紀委發送的總數據比特數figure(5);subplot(2,1,1);plot(0:temp_time1-1,Tx_data);%畫循環前綴與循環后綴不顧從諜相加OFDM信號的時域波形。grid on ylabel('Amplitude(volts)')xlabel('Time(samples)')title(&#

28、39;OFDM Time Signal')temp_time2=symbols_per_carrier*(IFFT_bin_length+GI)+GIP;%加窗,循環前綴與循環后綴重疊相加數據長度subplot(2,1,2);plot(0:temp_time2-1,windowed_Tx_data);%畫循環前綴與循環后綴重疊相加OFDM信號的時域波形grid onylabel('Amplitude(volts)')xlabel('Time (samples)')title('OFDM Time Signal')%未加窗發送信號頻譜%對發

29、送數據分段,分段計算頻譜,取平均值作為OFDM信號的頻譜symbols_per_average=ceil(symbols_per_carrier/5);avg_temp_time=(IFFT_bin_length+GI+GIP)*symbols_per_average;averages=floor(temp_time1/avg_temp_time);%將發送數據分5段,每段數據長度為avg_temp_timeaverage_fft(1:avg_temp_time)=0;%存放平均后的OFDM信號的譜,先置0for a=0:(averages-1) subset_ofdm=Tx_data_wit

30、houtwindow(a*avg_temp_time)+1):(a+1)*avg_temp_time);%分段 subset_ofdm_f=abs(fft(subset_ofdm);%對分段后的OFDM信號計算頻譜 average_fft=average_fft+(subset_ofdm_f/averages);%取平均endaverage_fft_log=20*log10(average_fft);%求對數平均譜figure(6);subplot(2,1,1)plot(0:(avg_temp_time-1)/avg_temp_time,average_fft_log);%畫未加窗OFDM符號

31、對數平均譜hold ongrid on axis(0 0.5 -20 max(average_fft_log)ylabel('Magnitude(dB)')xlabel('Normalized Frequency(0.5=fs/2)')title('OFDM Signal Specturm')%計算加窗OFDM信號的頻譜 %這段程序功能與上段程序類似,不同之處在于這段程序是對加窗OFDM信號進行分段計算頻譜,再取平均symbols_per_average=ceil(symbols_per_carrier/5);avg_temp_time=(IFF

32、T_bin_length+GI+GIP)*symbols_per_average;averages=floor(temp_time1/avg_temp_time);%將發送數據分5段,每段數據長度為avg_temp_timeaverage_fft(1:avg_temp_time)=0;%存放平均后的OFDM信號的譜,先置0for a=0:(averages-1) subset_ofdm=Tx_data(a*avg_temp_time)+1):(a+1)*avg_temp_time);%分段 subset_ofdm_f=abs(fft(subset_ofdm);%對分段后的OFDM信號計算頻譜

33、average_fft=average_fft+(subset_ofdm_f/averages);%取平均endaverage_fft_log=20*log10(average_fft);%求對數平均譜subplot(2,1,2)plot(0:(avg_temp_time-1)/avg_temp_time,average_fft_log);%畫加窗OFDM符號對數平均譜hold ongrid on axis(0 0.5 -20 max(average_fft_log)ylabel('Magnitude(dB)')xlabel('Normalized Frequency(

34、0.5=fs/2)')title('Windowed OFDM Signal Specturm')%=經過加性高斯白噪聲信道Tx_signal_power=var(windowed_Tx_data);%計算信號功率linear_SNR=10(SNR/10);%轉換對數信噪比為線性幅度值noise_sigma=Tx_signal_power/linear_SNR;%計算噪聲功率,也就是方差noise_scale_factor=sqrt(noise_sigma);%計算標準差noise=randn(1,(symbols_per_carrier)*(IFFT_bin_length+GI)+GIP)*noise_scale_factor;%產生功率為noise_scale_factor高斯噪聲Rx_data=windowed_Tx_data+noise;%在發送數據上加噪聲,相當于OFDM信號經過加性高斯白噪聲信道%=OFDM解調=Rx_data_matrix=zeros(symbols_per_carrier,IFFT_bin_lengt

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論