一、简介
二、源代码
clc
clear all
L=10000; % 符号周期数
N=256; % OFDM字载波个数
G=32; % CP长度
M=2; % 便于调制
Nt=3 ; % 多径信道数 3
Nr=26; % 多径信道数 26
snr=0:2:30;% 信噪比
%% 原始数据流
x_gene_bit= floor(rand(1,L*N*M)*2);
x_QPSK_in=reshape(x_gene_bit,M,L*N);
for n_snr=1:length(snr)
n_snr
cnt=0;
%% QPSK星座映射
for ii=1:L*N
if x_QPSK_in(:,ii)==[0 0]'
x_QPSK(ii)=(1+1i)/sqrt(2);
elseif x_QPSK_in(:,ii)==[0 1]'
x_QPSK(ii)=(-1+1i)/sqrt(2);
elseif x_QPSK_in(:,ii)==[1 0]'
x_QPSK(ii)=(1-1i)/sqrt(2);
elseif x_QPSK_in(:,ii)==[1 1]'
x_QPSK(ii)=(-1-1i)/sqrt(2);
end
end
%% 串并变换
x_OFDM_in=reshape(x_QPSK,N,L);
for ii=1:L
%% 基于Alamouti的编码
x_transmitter1(1:2:N)=x_OFDM_in(1:2:N,ii); %第一个发射天线
x_transmitter1(2:2:N)=-conj(x_OFDM_in(2:2:N,ii));
x_transmitter2(1:2:N)=x_OFDM_in(2:2:N,ii); %第二个发射天线
x_transmitter2(2:2:N)=conj(x_OFDM_in(1:2:N,ii));
%% 分别在第一个天线和第二个天线上进行OFDM x_transmitter1 x_transmitter1;
%% IFFT
X_IFFT_1=sqrt(N)*ifft(x_transmitter1); % 功率归一化 *sqrt(N)
X_IFFT_2=sqrt(N)*ifft(x_transmitter2); % 功率归一化 *sqrt(N)
%% 加循环前缀
X_add_cp_1=[X_IFFT_1([end-31:end]) X_IFFT_1];
X_add_cp_2=[X_IFFT_2([end-31:end]) X_IFFT_2];
%% 产生瑞利衰落的信道系数
h_1=(1/(sqrt(2*Nt)))*(randn(1,Nt) + j*randn(1,Nt)); %产生Nt个信道系数
h_2=(1/(sqrt(2*Nt)))*(randn(1,Nt) + j*randn(1,Nt)); %产生Nt个信道系数
H_1=fft(h_1,N)/sqrt(N); %对信道系数做FFT
H_2=fft(h_2,N)/sqrt(N);
%% 输出的信号
Yy=conv(X_add_cp_1,h_1)+conv(X_add_cp_2,h_2)+normrnd(0,sqrt(10^((-snr(n_snr))/10)/2),1,N+Nt+G-1)+1i*normrnd(0,sqrt(10^((-snr(n_snr))/10)/2),1,N+Nt+G-1);
%% 去循环前缀
Y_de_cp=Yy(33:288);
y_FFT=(1/sqrt(N))*fft(Y_de_cp);
%% 类似于Alamouti 解码的线性解码算法解调符号
y_FFT_odd= y_FFT(1:2:N);
y_FFT_even= y_FFT(2:2:N);
H_1_odd=H_1(1:2:N); %第一个发射天线信道的坐标为奇数
H_1_even=H_1(2:2:N); %第一个发射天线信道的坐标为偶数
H_2_odd=H_2(1:2:N); %第二个发射天线信道的坐标为奇数
H_2_even=H_2(2:2:N); %第二个发射天线信道的坐标为偶数
h_1 = abs(H_1_odd).^2 + abs(H_2_even).^2;
H2 = abs(H_1_even).^2 + abs( H_2_odd).^2;
x_est1 = (conj(H_1_odd).*y_FFT_odd + H_2_even.*conj(y_FFT_even))./h_1;
x_est2 = (conj(H_2_odd).*y_FFT_odd - H_1_even.*conj(y_FFT_even))./H2;
xx(1:2:N) = x_est1; % 接收到的符号
xx(2:2:N) = x_est2;
%% 解调
x_de_QPSK_in=reshape(xx,1,N);
for k=1:N
if real(x_de_QPSK_in(k))>0&&imag(x_de_QPSK_in(k))>0
x_de_QPSK(:,k)=[0 0].';
elseif real(x_de_QPSK_in(k))>0&&imag(x_de_QPSK_in(k))<0
x_de_QPSK(:,k)=[1 0].';
elseif real(x_de_QPSK_in(k))<0&&imag(x_de_QPSK_in(k))>0
x_de_QPSK(:,k)=[0 1].';
elseif real(x_de_QPSK_in(k))<0&&imag(x_de_QPSK_in(k))<0
x_de_QPSK(:,k)=[1 1].';
end
end
%% 计算比特错误数
error=length(find(x_QPSK_in(:,((ii-1)*N+1):ii*N)~=x_de_QPSK));
cnt=cnt+error;
end
ber1(n_snr)=cnt/L/M/N;
end
%% 多径数为26
for n_snrr=1:length(snr)
n_snrr
cnt=0;
%% QPSK星座映射
for ii=1:L*N
if x_QPSK_in(:,ii)==[0 0]'
x_QPSK(ii)=(1+1i)/sqrt(2);
elseif x_QPSK_in(:,ii)==[0 1]'
x_QPSK(ii)=(-1+1i)/sqrt(2);
elseif x_QPSK_in(:,ii)==[1 0]'
x_QPSK(ii)=(1-1i)/sqrt(2);
elseif x_QPSK_in(:,ii)==[1 1]'
x_QPSK(ii)=(-1-1i)/sqrt(2);
end
end
%% 串并变换
x_OFDM_in=reshape(x_QPSK,N,L);
for ii=1:L
%% 基于Alamouti的编码
xx_transmitter1(1:2:N)=x_OFDM_in(1:2:N,ii); %第一个发射天线
xx_transmitter1(2:2:N)=-conj(x_OFDM_in(2:2:N,ii));
xx_transmitter2(1:2:N)=x_OFDM_in(2:2:N,ii); %第二个发射天线
xx_transmitter2(2:2:N)=conj(x_OFDM_in(1:2:N,ii));
%% 分别在第一个天线和第二个天线上进行OFDM x_transmitter1 x_transmitter2;
%% IFFT
X_IFFT_1=sqrt(N)*ifft(xx_transmitter1); % 功率归一化 *sqrt(N)
X_IFFT_2=sqrt(N)*ifft(xx_transmitter2); % 功率归一化 *sqrt(N)
%% 加循环前缀
X_add_cp_1=[X_IFFT_1([end-31:end]) X_IFFT_1];
X_add_cp_2=[X_IFFT_2([end-31:end]) X_IFFT_2];
%% 产生瑞利衰落的信道系数
h_1=(1/(sqrt(2*Nr)))*(randn(1,Nr) + j*randn(1,Nr)); %产生Nr个信道系数
h_2=(1/(sqrt(2*Nr)))*(randn(1,Nr) + j*randn(1,Nr)); %产生Nr个信道系数
H_1=fft(h_1,N)/sqrt(N); %对信道系数做FFT
H_2=fft(h_2,N)/sqrt(N);
%% 输出的信号
Y=conv(X_add_cp_1,h_1)+conv(X_add_cp_2,h_2)+normrnd(0,sqrt(10^((-snr(n_snrr))/10)/2),1,N+Nr+G-1)+1i*normrnd(0,sqrt(10^((-snr(n_snrr))/10)/2),1,N+Nr+G-1);
%% 去循环前缀
Y_de_cp=Y(33:288);
y_FFT=(1/sqrt(N))*fft(Y_de_cp);
%% 类似于Alamouti 解码的线性解码算法解调符号
y_FFT_odd= y_FFT(1:2:N);
y_FFT_even= y_FFT(2:2:N);
H_1_odd=H_1(1:2:N); %第一个发射天线信道的坐标为奇数
H_1_even=H_1(2:2:N); %第一个发射天线信道的坐标为偶数
H_2_odd=H_2(1:2:N); %第二个发射天线信道的坐标为奇数
H_2_even=H_2(2:2:N); %第二个发射天线信道的坐标为偶数
h_1 = abs(H_1_odd).^2 + abs(H_2_even).^2;
H2 = abs(H_1_even).^2 + abs( H_2_odd).^2;
x_est1 = (conj(H_1_odd).*y_FFT_odd + H_2_even.*conj(y_FFT_even))./h_1;
x_est2 = (conj(H_2_odd).*y_FFT_odd - H_1_even.*conj(y_FFT_even))./H2;
xx(1:2:N) = x_est1; % 接收到的符号
xx(2:2:N) = x_est2;
%% 解调
x_de_QPSK_in=reshape(xx,1,N);
for k=1:N
if real(x_de_QPSK_in(k))>0&&imag(x_de_QPSK_in(k))>0
x_de_QPSK(:,k)=[0 0].';
elseif real(x_de_QPSK_in(k))>0&&imag(x_de_QPSK_in(k))<0
x_de_QPSK(:,k)=[1 0].';
elseif real(x_de_QPSK_in(k))<0&&imag(x_de_QPSK_in(k))>0
x_de_QPSK(:,k)=[0 1].';
elseif real(x_de_QPSK_in(k))<0&&imag(x_de_QPSK_in(k))<0
x_de_QPSK(:,k)=[1 1].';
end
end
error=length(find(x_QPSK_in(:,((ii-1)*N+1):ii*N)~=x_de_QPSK));
cnt=cnt+error;
end
ber2(n_snrr)=cnt/L/M/N;
end
三、运行结果
四、备注
完整代码或者代写添加QQ 1564658423