📄 ofdm_with_mssnr.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 + -