⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ofdm_simu.m

📁 使用MATLAB,对基于IFFT/FFT实现的OFDM系统进行仿真
💻 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 + -