📄 ofdm_simu.m
字号:
%%%%%%%%%%%%%%%%%%
% OFDM系统的仿真
% 数据调制采用QPSK
%%%%%%%%%%%%%%%%%%
clear;
clc;
%%%%%%%%%% 参数设置部分 %%%%%%%%%
SNR = 10; % 信噪比取值,dB为单位
f1 = 128; % 设置FFT长度
Ns = 6; % 设置一个帧结构中OFDM信号的个数
para = 128; % 设置并行传输的子载波个数
sr = 250000; % 设置符号速率
br = sr.*2; % 设置每个子载波的比特率
g1 = 32; % 设置保护间隔的长度
%%%%%%%%% 发送端部分 %%%%%%%%%
Signal = rand(1,para*Ns*2)>0.5;
% 产生0,1随机数列,符号个数为para*2*Ns(子信道个数*调制水平*每个子信道中有用符号个数)
for i = 1:para
for j = 1:Ns*2
SigPara(i,j) = Signal(i*j);
% 串并转换,将随机产生的二进制矩阵变换为行数为para,列数为2*Ns的矩阵
end
end
% 进行QPSK数据调制,将数据分为两个通道
for j = 1:Ns
ich(:,j) = SigPara(:,2*j-1);
qch(:,j) = SigPara(:,2*j);
end
kmod = 1./sqrt(2);
ich1 = ich.*kmod;
qch1 = qch.*kmod;
x = ich1+qch1.*sqrt(-1); % 产生复信号
y = ifft(x); % 通过傅里叶反变换,将频域数据转换为时域数据
ich2 = real(y); % I信道取变换后的实部
qch2 = imag(y); % Q信道取变换后的虚部
% 插入保护间隔
ich3 = [ich2(f1-g1+1:f1,:);ich2];
qch3 = [qch2(f1-g1+1:f1,:);qch2];
% 并串转换
ich4 = reshape(ich3,1,(f1+g1)*Ns);
qch4 = reshape(qch3,1,(f1+g1)*Ns);
% 形成复数发射数据
TrData = ich4+qch4.*sqrt(-1)'
% 接收机
% 加入高斯白噪声
ReData = awgn(TrData,SNR,'measured');
% 接收端
% 移去保护间隔
idata = real(ReData);
qdata = imag(ReData);
idata1 = reshape(idata,f1+g1,Ns);
qdata1 = reshape(qdata,f1+g1,Ns);
idata2 = idata1(g1+1:g1+f1,:);
qdata2 = qdata1(g1+1:g1+f1,:);
% FFT
Rex = idata2+qdata2*sqrt(-1);
ry = fft(Rex);
ReIChan = real(ry);
ReQChan = imag(ry);
ReIChan = ReIChan/kmod;
ReQChan = ReQChan/kmod;
% QPSK逆映射
for j = 1:Ns
RePara(:,2*j-1) = ReIChan(:,j);
RePara(:,2*j) = ReIChan(:,j);
end
ReSig = reshape(RePara,1,para*Ns*2);
% 符号抽样判决
ReSig = ReSig>0.5;
figure(2)
subplot(211)
stem(ReSig(1:20))
grid;
subplot(212)
stem(Signal(1:20))
grid;
% End of script file
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -