⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ofdm_with_mssnr.m

📁 该程序对ofdm系统中mmsnr的信道缩短算法的误码率性率进行了仿真
💻 M
字号:
clear all;
close all;
fprintf('OFDM仿真\n');
IFFT_bin_length=256;
carrier_count=128;
bits_per_symbol=2;
cp=1;
symbols_per_carrier=2;
TN=30;
bit_error_rate_cp_sum=zeros(1,8);
bit_error_rate_mssnr_sum=zeros(1,8);

for times=1:TN

baseband_out_length=carrier_count*symbols_per_carrier*bits_per_symbol;  %输入的序列长度
baseband_out=round(rand(1,baseband_out_length));                         %输入序列

%二进制比特数据映射为四进制数0-3(基带调制)
convert_matrix=reshape(baseband_out,bits_per_symbol,length(baseband_out)/bits_per_symbol);
for k=1:(length(baseband_out)/bits_per_symbol)
    modulo_baseband(k)=0;
    for i=1:bits_per_symbol
        modulo_baseband(k)=modulo_baseband(k)+convert_matrix(i,k)*2^(bits_per_symbol-i);
    end
end

%S/P 串并变换
carrier_matrix=reshape(modulo_baseband,carrier_count,symbols_per_carrier).';  %转换为ofdm调制的形式

%QPSK四进制相位调制
module_carrier_matrix=pskmod(carrier_matrix,2^bits_per_symbol);
time_wave_matrix=ifft(module_carrier_matrix.');  %ifft变换

%加cp
for i=1:symbols_per_carrier
    time_wave_matrix_cp(:,i)=[time_wave_matrix((carrier_count-cp+1:carrier_count),i);time_wave_matrix(:,i)];  %把数据前部补充为cp
end

%P/S 并串变换
ofdm_modulation_cp=reshape(time_wave_matrix_cp,1,size(time_wave_matrix_cp,1)*size(time_wave_matrix_cp,2));
Tx_data_cp=ofdm_modulation_cp;


%%%%%%%%%%%%%%% 信道  %%%%%%%%%%%%%%%%%%%
 a=[1 0.3 0.2 0 0 0.4 0 0 0 0.1 0.2];           % 10条多径的信道系数
%a=randn(1,11);
%a=[-0.099489971139637;-0.248455452409105;-0.116310709616826;-0.20020766951854;-0.072552111624562;-0.468942039641397;0.101636275736763;-0.146226244106927;-0.367990468058297;-0.496574690577863;0.310651430811606;-0.108344804929213;0.047843186738168;0.197147784556698;-0.004029889945121;-0.058940389863363;0.099404948781597;-0.094147828702356;0.145211727912209;0.207734206781256;]';

 delay=0:length(a)-1;   
 path=length(a);
 Tx_data1=0;
        for i=1:path
           x_temp=[zeros(1,delay(i)) Tx_data_cp(1:length(Tx_data_cp)-delay(i))];
           Tx_data1=Tx_data1+a(i)*x_temp;                            %经多径信道传输
        end
            
  h=a;
  Lh=length(h);
  Nw=30;
  Nb=cp+1;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%555

SNRindB=0:2:14;
for n=1:length(SNRindB)
    SNR=10^(SNRindB(n)/10);
    noise_cp=typic_awgn(Tx_data1,SNR); 
     Rx_data_cp=Tx_data1+noise_cp;
    
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   
  Dmin=0;
  Dmax=Lh-Nb+Nw-1;
 %[wopt,dopt,Dev]=mssnr1(h,Nb,Nw,Dmin,Dmax);
[wopt,dopt]=mssnr(h,Nb,Nw,Dmin,Dmax);
copt=conv(h,wopt);    
% H_shorten=H_zero_shorten5(h,cp);
% zi=zeros(length(wopt)-1,1);
% Rx_data_mssnr=filter(wopt,1,Rx_data_cp,zi);

zi=zeros(length(copt)-1,1);
Rx_data_mssnr=filter(copt,1,Tx_data_cp,zi);
% Rx_data_shorten=filter(H_shorten,1,Tx_data_cp,zi);
noise_mssnr=typic_awgn(Rx_data_mssnr,SNR); 
Rx_data_mssnr=Rx_data_mssnr+noise_mssnr;


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%S/P变换
Rx_data_matrix_mssnr=reshape(Rx_data_mssnr,carrier_count+cp,symbols_per_carrier);
Rx_data_matrix_cp=reshape(Rx_data_cp,carrier_count+cp,symbols_per_carrier);

%去掉CP
for i=1:symbols_per_carrier
    Rx_data_matrix_recp1(:,i)=Rx_data_matrix_cp((cp+1:carrier_count+cp),i);
end

for i=1:symbols_per_carrier
    Rx_data_matrix_recp2(:,i)=Rx_data_matrix_mssnr((cp+1:carrier_count+cp),i);
end
%fft变换
Rx_carriers_cp=fft(Rx_data_matrix_recp1);
Rx_carriers_mssnr=fft(Rx_data_matrix_recp2);

%解调
demodule_carrier_matrix_cp=pskdemod(Rx_carriers_cp,2^bits_per_symbol);
demodule_carrier_matrix_mssnr=pskdemod(Rx_carriers_mssnr,2^bits_per_symbol);
%接收到的符号

Rx_serial_symbols_cp=reshape(demodule_carrier_matrix_cp,1,size(demodule_carrier_matrix_cp,1)*size( demodule_carrier_matrix_cp,2));
Rx_serial_symbols_mssnr=reshape(demodule_carrier_matrix_mssnr,1,size(demodule_carrier_matrix_mssnr,1)*size( demodule_carrier_matrix_mssnr,2));
%转换接收到的符号为二进制信号
Rx_binary_matrix_cp=Symbol2Bin(Rx_serial_symbols_cp,bits_per_symbol);
Rx_binary_matrix_mssnr=Symbol2Bin(Rx_serial_symbols_mssnr,bits_per_symbol);

%接收到的二进制序列
baseband_in_cp=reshape(Rx_binary_matrix_cp,1,size(Rx_binary_matrix_cp,1)*size(Rx_binary_matrix_cp,2));
baseband_in_mssnr=reshape(Rx_binary_matrix_mssnr,1,size(Rx_binary_matrix_mssnr,1)*size(Rx_binary_matrix_mssnr,2));

bit_error_rate_cp(times,n)=BER(baseband_in_cp,baseband_out);
bit_error_rate_mssnr(times,n)=BER(baseband_in_mssnr,baseband_out);
end;

bit_error_rate_cp_sum=bit_error_rate_cp_sum+bit_error_rate_cp(times,:);
bit_error_rate_mssnr_sum=bit_error_rate_mssnr_sum+bit_error_rate_mssnr(times,:);
 end;

 bit_error_rate_cp=bit_error_rate_cp_sum/TN;
bit_error_rate_mssnr=bit_error_rate_mssnr_sum/TN;

semilogy(SNRindB,bit_error_rate_cp,'-o')
hold on
semilogy(SNRindB,bit_error_rate_mssnr,'-^')



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -