一、簡介





二、源代碼
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/278936.html
標籤:其他
上一篇:手把手解決“npm、node不是內部或外部命令,也不是可運行的程式或批處理檔案”
下一篇:基于51單片機實作在LCD1602液晶的第一行顯示i like studying,第二局顯示i love you,并依次向右移入
