% ofdm_mod.m
function [qam_out] = Qam4_mod(qam_in)
%% 4QAM 调制函数
%% 输入: 矩阵,列数必须是4的倍数,01序列
%% 输出: 矩阵,4qam调制后的矩阵
global QamTable
global bitPerSymbol;
QamTable = [ -1-i, 1-i, -1+i, 1+i ];
[ m, n ] = size(qam_in);
qam_out = zeros(m,n/bitPerSymbol);
for k = 1:m
QamTmp = reshape(qam_in(k,:),bitPerSymbol,n/bitPerSymbol)';
QamTmpTmp = bi2de( QamTmp, 'left-msb');
qam_out(k, :) = QamTable( QamTmpTmp+1 );
end
ofdm_demod.m
function [qam_out] = Qam4_demod(qam_in)
%% 4QAM 解调函数
%% 输入: 矩阵,列数必须是的的倍数
%% 输出: 矩阵,解调后的01序列矩阵
%% 之前必须调用过
global QamTable;
global bitPerSymbol ;
[m,n] = size(qam_in);
qam_out = zeros(m,n*bitPerSymbol);
% 判决
for k = 1:m
delt = abs(reshape(qam_in(k,:), n, 1)*ones(1,4) - ones(n,1)*QamTable); %求最近的点
[tmp, index] = min(delt,[],2); %得到索引值
qam_outTmp = de2bi(index-1,bitPerSymbol,'left-msb');
qam_out(k,:) = reshape(qam_outTmp',1,bitPerSymbol*n);
end
ofdm_mod_neq.m
function [s_out] = ofdm_mod_neq( s_in )
%% ofdm 调制,无均衡
%% 输入:二进制序列
%% 输出:ofdm调制后符号
%global CP_len;
global nSubC
global ifft_len;
global symbolPerCarrier;
global bitPerSymbol;
global CP_len;
global carriers;
len = length(s_in);
SQam = reshape(s_in, nSubC,len/nSubC); %串并转换
PQam = Qam4_mod(SQam);
carriers = (1: nSubC) + (floor( ifft_len/4) - floor(nSubC/2));
conj_carriers = ifft_len - carriers + 2;
P_IFFT = zeros(ifft_len, symbolPerCarrier ); % 一个符号块,含4列训练序列,1列 0
P_IFFT(carriers,:) = PQam;
P_IFFT(conj_carriers,:)=conj(PQam); % 构造共轭矩阵
PCh = real(ifft( P_IFFT ));
PCh2 = cat(1, PCh((ifft_len-CP_len+1):ifft_len,:), PCh); % 添加 CP
s_out = reshape(PCh2, 1, (ifft_len+CP_len)*(symbolPerCarrier)); %并串转换
ofdm_mod_eq.m
function [s_out] = ofdm_mod_eq( s_in )
%% ofdm 调制,带均衡
%% 输入:二进制序列
%% 输出:ofdm调制后符号
%global CP_len;
global nSubC
global ifft_len;
global symbolPerCarrier;
global bitPerSymbol;
global trainingSymbols;
global trainingSymbols_len;
global CP_len;
global carriers;
len = length(s_in);
SQam = reshape(s_in, nSubC,len/nSubC); %串并转换
PQam = Qam4_mod(SQam);
tmpTable = [-1,1,i,-i];
trainingSymbols_len = 10;
trainingSymbols = (tmpTable(floor( 4*rand(trainingSymbols_len,nSubC))+1 ))';
PQam = cat(2,zeros(nSubC,1),PQam);
PQam = cat(2,trainingSymbols,PQam);
carriers = (1: nSubC) + (floor( ifft_len/4) - floor(nSubC/2));
conj_carriers = ifft_len - carriers + 2;
P_IFFT = zeros(ifft_len,1 + symbolPerCarrier + trainingSymbols_len);
P_IFFT(carriers,:) = PQam;
P_IFFT(conj_carriers,:)=conj(PQam) ;
PCh = (ifft( P_IFFT ,ifft_len,1));
PCh2 = cat(1, PCh((ifft_len-CP_len+1):ifft_len,:), PCh); % 添加 CP
s_out = reshape(PCh2, 1, (ifft_len+CP_len)*(symbolPerCarrier +trainingSymbols_len + 1)); %并串转换
channel.m
function [s_out] = channel(s_in, SNR)
%% 信道函数
% 模拟多径信道
global fade;
Len = length(s_in);f_len = length(fade);
sch = s_in;
for m = 1:f_len
sch(1+m:Len) = sch(1+m:Len) + fade(m)*(s_in(1:Len-m));
end
% 高斯信道
Tx_signal_power = var(sch); % 方差
linear_SNR = 10^( SNR /10) ;
noise_sigma = Tx_signal_power / linear_SNR;
noise_scale_factor = sqrt(noise_sigma) ;
noise = randn(1, length(sch) )*noise_scale_factor; %模拟信道噪声,为随机数,即高斯白噪
s_out = sch + noise;
ofdm_demod_neq.m
function [s_out] = ofdm_demod_neq(s_in)
%% ofdm 解调
%% 输入为二进制序列
global ifft_len;
global CP_len;
global bitPerSymbol;
global symbolPerCarrier;
global carriers;
global s_len;
P_S = reshape(s_in, ifft_len+CP_len, symbolPerCarrier); % 接收 ,进行串并转换
PDeCP = P_S(1+CP_len:ifft_len+CP_len,:); %去CP
P_FFT = fft(PDeCP);
P_FFT2 = P_FFT(carriers,:);
SQam = Qam4_demod(P_FFT2);
s_out = reshape(SQam,1,s_len); % 并串转换
ofdm_demod_eq.m
function [s_out] = ofdm_demod_eq(s_in)
%% ofdm 解调
%% 输入为二进制序列
global trainingSymbols;
global trainingSymbols_len;
global ifft_len;
global CP_len;
global bitPerSymbol;
global symbolPerCarrier;
global carriers;
global s_len
% 接收 ,进行串并转换
P_S = reshape(s_in, ifft_len+CP_len, symbolPerCarrier + trainingSymbols_len + 1);
PDeCP = P_S(1+CP_len:ifft_len+CP_len,:); %去C P
P_FFT = fft(PDeCP,ifft_len,1);
P_FFT2 = P_FFT(carriers,:);
RxTrainSymbols = P_FFT2(:, (1: trainingSymbols_len));
%RxTrainSymbols =
P_FFT2(:, (1: trainingSymbols_len),size(P_FFT2,2)-trainingSymbols_len+1:size(P_FFT2,2));
%信道均衡
H = RxTrainSymbols./ trainingSymbols;
H_2 = H.^2;
H_2 = sum(H_2,2);
H_C2 = sum(H,2);
H_C2 = conj(H_C2);
H = H_C2./H_2 ; % 1/H = conj(H)/H^2
P_FFT3 = H*ones(1,size(P_FFT2,2)).*P_FFT2 ;
P_FFT4 = P_FFT2(:,(trainingSymbols_len+2:size(P_FFT3,2)));
SQam = Qam4_demod(P_FFT4);
s_out = reshape(SQam,1,s_len); % 并串转换
test1.m
%% 本测试为 不同信道环境下系统误码率曲线
%%
close all;clear all; clc; tic ; %计时开始
global CP_len;
global nSubC;
global ifft_len;
global bitPerSymbol;
global symbolPerCarrier;
global s_len;
global fade; %信道衰弱
%% 测试参数
%SNR = 40; % dB
CP_len = 0;nSubC = 48;ifft_len = 256;bitPerSymbol = 2;symbolPerCarrier = 50;
% 开始测试
s_len = nSubC*bitPerSymbol* symbolPerCarrier;
SNR = 0:2:20;
ber1 = zeros(1,length(SNR));ber2 = zeros(1,length(SNR));ber3 = zeros(1,length(SNR));
for kk = 1:length(SNR)
max = floor((2^kk)/10)+10;
fprintf('仿真信噪比: %d\n', SNR(kk));
fprintf('仿真点数: %d\n', max*bitPerSymbol*symbolPerCarrier*nSubC);
fade = [0]; % 信道参数,下标为延时点数,值为衰减系数
ber = 0;
for m = 1:max
% 生成用于测试的随机比特
s_in = floor( rand(1, s_len )*2 );
sch = ofdm_mod_eq(s_in);
sch = channel(sch,SNR(kk));
s_out = ofdm_demod_eq(sch);
%计算误比特率
err_count = sum(abs(s_in-s_out));
ber = ber + err_count/s_len;
end
ber1(kk) = ber/max;
fade = [0, 0, 0, 0, 0.4]; % 信道参数
ber = 0;
for m = 1:max
s_in = floor( rand(1, s_len )*2 );
sch = ofdm_mod_eq(s_in);
sch = channel(sch,SNR(kk));
s_out = ofdm_demod_eq(sch);
%计算误比特率
err_count = sum(abs(s_in-s_out));
ber = ber + err_count/s_len;
end
ber2(kk) = ber/max ;
fade = [0, 0, 0, 0, 0.4, 0.3]; % 信道参数,下标为延时点数,值为衰减系数
ber = 0;
for m = 1:max
% 生成用于测试的随机比特
s_in = floor( rand(1, s_len )*2 );
sch = ofdm_mod_eq(s_in);
sch = channel(sch,SNR(kk));
s_out = ofdm_demod_eq(sch);
%计算误比特率
err_count = sum(abs(s_in-s_out));
ber = ber + err_count/s_len;
end
ber3(kk) = ber/max ;
end
figure(2);
semilogy(SNR,ber1,'o-');
hold on;semilogy(SNR,ber2,'r*-');hold on;
semilogy(SNR,ber3,'gv-');xlabel('SNR in dB');ylabel('Bit Error Rate');
legend('AWGN','AWGN + 2 path','AWGN + 3 path');grid;
toc
test2.m
%% 多径信道下,有无添加CP的系统误码率曲线
close all;clear all; clc; tic ; %计时开始
global CP_len;
global nSubC;
global ifft_len;
global bitPerSymbol;
global symbolPerCarrier;
global s_len;
global fade; %信道衰弱
%% 测试参数
CP_len = 0;nSubC = 48;ifft_len = 256;bitPerSymbol = 2;symbolPerCarrier = 50;
fade = [0, 0, 0, 0.4, 0.3]; % 信道参数
% 开始测试
s_len = nSubC*bitPerSymbol* symbolPerCarrier;
SNR = 0:2:30;
ber1 = zeros(1,length(SNR));ber2 = zeros(1,length(SNR));
for kk = 1:length(SNR)
max = floor((2^(kk))/50)+10;
fprintf('仿真信噪比: %d\n', SNR(kk));
fprintf('仿真点数: %d\n', max*nSubC*bitPerSymbol*symbolPerCarrier);
CP_len = 0;
ber = 0;
for m = 1:max
% 生成用于测试的随机比特
s_in = floor( rand(1, s_len )*2 );
sch = ofdm_mod_neq(s_in);
sch = channel(sch,SNR(kk));
s_out = ofdm_demod_neq(sch);
%计算误比特率
err_c
基于MATLAB实现的OFDM系统中抗多径衰落的仿真+使用说明文档.zip
版权申诉
50 浏览量
2024-05-23
09:23:33
上传
评论
收藏 15KB ZIP 举报
IT狂飙
- 粉丝: 4779
- 资源: 2640
最新资源
- 因为直接上传文档会被拦截,下载后解压即可正常食用 为postgresql的官方文档,有点老但是全而且里面的东西可以稳定使用
- 认识网络设备-总结文件
- ST3413A-VB一款SOT23封装P-Channel场效应MOS管
- mysql面试题大全.pdf
- QT实战教程实现象棋人机大战+源码+说明文档+教程.zip
- EFK 不是一个软件,而是一套解决方案 EFK 是三个开源软件的缩写,Elasticsearch,FileBeat,Kibana
- ST3407-VB一款SOT23封装P-Channel场效应MOS管
- ST3407SRG-VB一款SOT23封装P-Channel场效应MOS管
- 基于MATLAB实现的车牌识别系统
- ST3407S23RG-VB一款SOT23封装P-Channel场效应MOS管
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈