OFDM仿真程序,可直接运行,注释详细(没人注释比我还详细了)
生活随笔
收集整理的這篇文章主要介紹了
OFDM仿真程序,可直接运行,注释详细(没人注释比我还详细了)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
OFDM仿真程序
clc clear allIFFT_bin_length=128; %IFFT點數128個 carrier_count=50; %子信道(子載波)數目 bits_per_symbol=2; %4進制符號 symbols_per_carrier=200;%每個子信道或者說子載波有200個符號 SNR=0:1:40; for num=1:41baseband_out_length=carrier_count*symbols_per_carrier*bits_per_symbol; %總bit數 %下面是載波位置,為了滿足得到的是實數信號,載波的位置要滿足共軛對稱 carriers=(1:carrier_count)+(floor(IFFT_bin_length/4)-floor(carrier_count/2)); %floor函數是朝負無窮大四舍五入 conjugate_carriers=IFFT_bin_length-carriers+2;%baseband_out=round(rand(1,baseband_out_length));%20000個0-1信源符號,round函數為四舍五入為最近的小數 baseband_out=randi(2,1,baseband_out_length)-1; %返回一個介于1和2之間的1*20000的數組 %將一行20000的數據交叉轉換為2行10000的數據 convert_matrix=reshape(baseband_out,bits_per_symbol,length(baseband_out)/bits_per_symbol); %不如寫個函數將值映射成0-3,如00-0,01-1,10-2,11-3 for k=1:(length(baseband_out)/bits_per_symbol)modulo_baseband(k)=0;for i=1:bits_per_symbolmodulo_baseband(k)=modulo_baseband(k)+convert_matrix(i,k)*2^(bits_per_symbol-i);end end%串并轉換 %將本次的模4的串行數據流轉換為并行數據流,其中,每行整體是一個OFDM符號,每一個OFDM符號由所有載波在該采樣點疊加產生,每列代表一個子載波 carrier_matrix=reshape(modulo_baseband,symbols_per_carrier,carrier_count);%采用了差分相移鍵控調制 carrier_matrix=[zeros(1,carrier_count);carrier_matrix];%補了一行全0,作為編碼的參考起點 for i=2:(symbols_per_carrier+1)carrier_matrix(i,:)=rem(carrier_matrix(i,:)+carrier_matrix(i-1,:),2^bits_per_symbol); %rem函數是除后的余數 end%將差分編碼轉換為相位變化 carrier_matrix=carrier_matrix*((2*pi)/(2^bits_per_symbol));%將相位轉換為一個復數 %這句代碼保證幅值都是1 [X,Y]=pol2cart(carrier_matrix,ones(size(carrier_matrix,1),size(carrier_matrix,2))); %構造映射,將相位的值轉換為極坐標上的一個復數點0-1,pi/2-j.pi--1,3pi/2--j complex_carrier_matrix=complex(X,Y);%將每個子載波分配到之前定義好的IFFT輸入端,根據IFFT的對稱性,這樣可以得到實值序列 IFFT_modulation=zeros(symbols_per_carrier+1,IFFT_bin_length); IFFT_modulation(:,carriers)=complex_carrier_matrix; IFFT_modulation(:,conjugate_carriers)=conj(complex_carrier_matrix);%畫出未經過IFFT的離散幅度譜,總共有50+50個輸入端有數據,所以頻譜圖顯示為兩個矩形形狀 % figure(1) % stem(0:IFFT_bin_length-1,abs(IFFT_modulation(2,1:IFFT_bin_length)),'b*-') % grid on;axis([0,IFFT_bin_length -0.5 1.5]);xlabel('IFFT BIN');ylabel('Magnitude'); % title('OFDM Carrier Frequency Magnitude'); %畫出未經過IFFT的離散相位譜 % figure(2) %所有128個點的相位圖 % plot(0:IFFT_bin_length-1,(180/pi)*angle(IFFT_modulation(2,1:IFFT_bin_length)),'go'); % hold on; %帶數據的100個點的相位圖 % stem(carriers-1,(180/pi)*angle(IFFT_modulation(2,carriers)),'b*-'); % stem(conjugate_carriers-1,(180/pi)*angle(IFFT_modulation(2,conjugate_carriers)),'b*-'); % axis([0 IFFT_bin_length -200 200]);grid on;ylabel('Phase');xlabel('IFFT Bin'); % title('OFDM Carrier Phase');%IFFT變換 time_wave_matrix=ifft(IFFT_modulation,[],2);%對列進行離散傅里葉反變換 %time_wave_matrix=time_wave_matrix;%作圖 figure(3) plot(0:IFFT_bin_length-1,time_wave_matrix(2,:)); grid on; ylabel('幅度');xlabel('時間'); title('一個OFDM符號時域信號波形圖');%colors=['r' 'g' 'b' 'k'] %for f=1:4%temp_bins(1:IFFT_bin_length)=0+0j;%temp_bins(carriers(f))=IFFT_modulation(2,carriers(f));%temp_bins(conjugate_carriers(f))=IFFT_modulation(2,conjugate_carriers(f));%temp_time=ifft(temp_bins');%figure(4)%plot(0:IFFT_bin_length-1,temp_time,colors(f));%hold on; %end %grid on;ylabel('幅度');xlabel('時間');title('分離出的時域波形');% 添加一個窗函數,就是濾波器,減弱信號的不連續點 % 每一個時間波形表示所有載波的一個符號周期 % 因為時域矩陣中所有虛部都等于0,所以利用Hamming窗時,只保留實部用于加窗 for i=1:symbols_per_carrier+1windowed_time_wave_matrix(i,:)=real(time_wave_matrix(i,:)).*hamming(IFFT_bin_length)'; % windowed_time_wave_matrix(i,:)=real(time_wave_matrix(i,:)); end%將調制波形序列化(并串轉換) ofdm_modulation=reshape(time_wave_matrix,1,IFFT_bin_length*(symbols_per_carrier+1));%作圖 % temp_time=IFFT_bin_length*(symbols_per_carrier+1); % figure(5) % plot(0:temp_time-1,ofdm_modulation); % grid on; % ylabel('幅度');xlabel('時間(采樣)');title('OFDM時間信號');%頻譜圖 % symbols_per_average=ceil(symbols_per_carrier/5); % avg_temp_time=IFFT_bin_length*symbols_per_average; % averages=floor(temp_time/avg_temp_time); % average_fft(1:avg_temp_time)=0; % for a=0:(averages-1) % subset_ofdm=ofdm_modulation(((a*avg_temp_time)+1:((a+1)*avg_temp_time))); % subset_ofdm_f=abs(fft(subset_ofdm)); % average_fft=average_fft+(subset_ofdm_f/averages); % end % average_fft_log=20*log10(average_fft); % figure(6) % plot((0:(avg_temp_time-1))/avg_temp_time,average_fft_log); % hold on; % plot(0:1/IFFT_bin_length:1,-35,'rd');grid on; % axis([0 0.5 -40 max(average_fft_log)]);ylabel('幅度(dB)');xlabel('標準化頻率(0.5=fs/2)'); % title('OFDM 信號頻譜'); Tx_data=ofdm_modulation;%上變頻,不一定用得到%經過信道 Rx_data=awgn(Tx_data,SNR(num)); % Rx_data=Tx_data;%%%%%%%%%%%%%%%%%%接收端%%%%%%%%%%%%%%%%%%%%%%%%%串并轉換 Rx_data_matrix=reshape(Rx_data,symbols_per_carrier+1,IFFT_bin_length);%FFT變換 Rx_spectrum=fft(Rx_data_matrix,[],2);%經過FFT的頻域相應圖 figure(7) stem(0:IFFT_bin_length-1,abs(Rx_spectrum(1:IFFT_bin_length,2)),'b*-'); grid on;axis([0 IFFT_bin_length -0.5 1.5]);ylabel('幅度');xlabel('FFT Bin'); title('OFDM 接收頻譜,幅度'); % figure(8) % plot(0:IFFT_bin_length-1,(180/pi)*angle(Rx_spectrum(1:IFFT_bin_length)),'go'); % hold on; % stem(carriers-1,(180/pi)*angle(Rx_spectrum(carriers,2)),'b*-'); % stem(conjugate_carriers-1,(180/pi)*angle(Rx_spectrum(conjugate_carriers,2)),'b*-'); % axis([0 IFFT_bin_length -200 200]); % grid on;ylabel('相位譜');xlabel('FFT Bin'); % title('OFDM 接受信號相位譜');%將128中真正含有數據的50個載波提取出來 Rx_carriers=Rx_spectrum(:,carriers);%畫出每一個接收符號 % figure(9) % Rx_phase_P=angle(Rx_carriers); % Rx_mag_P=abs(Rx_carriers); % polar(Rx_phase_P,Rx_mag_P,'rd');%對每個FFT點,解映射出對應的相位值 Rx_phase=angle(Rx_carriers)*(180/pi); phase_negative=find(Rx_phase<0); Rx_phase(phase_negative)=rem(Rx_phase(phase_negative)+360,360);%將負的相位對應為0-2pi內的值%從差分相移編碼中,提取相位差值,這里利用diff()函數 Rx_decoded_phase=diff(Rx_phase); phase_negative=find(Rx_decoded_phase<0); Rx_decoded_phase(phase_negative)=rem(Rx_decoded_phase(phase_negative)+360,360);%解映射,將不同的相位轉換為0-3的信源符號,0的相位范圍為-45,45,1的相位范圍為45-135,依此類推 base_phase=360/2^bits_per_symbol; delta_phase=base_phase/2; Rx_decoded_symbols=zeros(size(Rx_decoded_phase,1),size(Rx_decoded_phase,2));for i=1:(2^bits_per_symbol-1)center_phase=base_phase*i;plus_delta=center_phase+delta_phase;minus_delta=center_phase-delta_phase;decoded=find((Rx_decoded_phase<=plus_delta)&(Rx_decoded_phase>minus_delta));Rx_decoded_symbols(decoded)=i; end %Rx_decoded_symbols=Rx_decoded_symbols'; %并串轉換 Rx_serial_symbols=reshape(Rx_decoded_symbols,1,size(Rx_decoded_symbols,1)*size(Rx_decoded_symbols,2));%將4進制的符號解碼為二進制符號 for i=bits_per_symbol:-1:1if i~=1Rx_binary_matrix(i,:)=rem(Rx_serial_symbols,2);Rx_serial_symbols=floor(Rx_serial_symbols/2);elseRx_binary_matrix(i,:)=Rx_serial_symbols;end end baseband_in=reshape(Rx_binary_matrix,1,size(Rx_binary_matrix,1)*size(Rx_binary_matrix,2));%求誤碼率 bit_errors=find(baseband_in~=baseband_out); bit_error_count(num)=size(bit_errors,2); BER(num)=bit_error_count(num)/baseband_out_length; end figure(10) semilogy(SNR,BER,'-ob','MarkerFaceColor','b','MarkerSize',5,'LineWidth',2);hold on;grid on; title('DPSK-OFDM信噪比與誤碼率曲線');xlabel('SNR(dB)');ylabel('BER'); plot([0 35],[3.8e-3,3.8e-3],'r','LineWidth',1);hold on; legend('DPSK-OFDM','FEC(3.8x10^-^3)');總結
以上是生活随笔為你收集整理的OFDM仿真程序,可直接运行,注释详细(没人注释比我还详细了)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于温柔的句子262个
- 下一篇: 诗意淡雅的网名802个