MATLAB仿真代码

% ==================================================
% 作者: 肆拾伍
% 时间:11/30 2019
% 版本:V3
% =================OFDM仿真参数说明:================
%
% 子载波数 carrier_count     ---200
% 总符号数 symbol_count      ---100
% IFFT长度 ifft_length       ---512
% 循环前缀 CP_length         ---512/4=128
% 循环后缀 CS_length         ---20
% 升余弦窗系数 alpha         ---7/32
% 调制方式                   QAM16、QPSK 可选
% 多径幅度 mult_path_am      ---[1 0.2 0.1]
% 多径时延 mutt_path_time    ---[0 20 50]
% ====================仿真过程=======================
% 产生0-1随机序列 => 串并转换 => 映射 => 取共轭、过采样
% => IFFT => 加循环前缀和后缀 => 加窗 => 并串转换 =>
% 多径信道 =>  加AWGN => 串并转换 => 去前缀 => FFT =>
% 下采样 =>  解映射 => 求误码率
% ==================================================
clear all;
close all;
carrier_count = 200; % 子载波数
symbol_count = 100;
ifft_length = 512;
CP_length = 128;
CS_length = 20;
rate = [];
SNR =20;
bit_per_symbol = 4; % 调制方式决定
alpha = 1.5/32;
% ================产生随机序列=======================
bit_length = carrier_count*symbol_count*bit_per_symbol;
bit_sequence = round(rand(1,bit_length))'; % 列向量
% ================子载波调制方式1========================
% 1-28置零 29-228有效 229-285置零 286-485共轭 486-512置零
carrier_position = 29:228;
conj_position = 485:-1:286;
bit_moded = qammod(bit_sequence,16,'InputType','bit');
figure('position',[0 0 400 400],'menubar','none');
scatter(real(bit_moded),imag(bit_moded));
title('调制后的散点图');
grid on;
% ===================IFFT===========================
% =================串并转换==========================
ifft_position = zeros(ifft_length,symbol_count);
bit_moded = reshape(bit_moded,carrier_count,symbol_count);
figure('position',[400 0 400 400],'menubar','none');
stem(abs(bit_moded(:,1)));
grid on;
ifft_position(carrier_position,:)=bit_moded(:,:);
ifft_position(conj_position,:)=conj(bit_moded(:,:));
signal_time = ifft(ifft_position,ifft_length);
figure('position',[0 400 400 400],'menubar','none');
subplot(3,1,1)
plot(signal_time(:,1),'b');
title('原始单个OFDM符号');
xlabel('Time');
ylabel('Amplitude');
% ==================加循环前缀和后缀==================
signal_time_C = [signal_time(end-CP_length+1:end,:);signal_time];
signal_time_C = [signal_time_C; signal_time_C(1:CS_length,:)];
subplot(3,1,2); % 单个完整符号为512+128+20=660
plot(signal_time_C(:,1));
xlabel('Time');
ylabel('Amplitude');
title('加CP和CS的单个OFDM符号');
% =======================加窗========================
signal_window = zeros(size(signal_time_C));
% 通过矩阵点乘
signal_window = signal_time_C.*repmat(rcoswindow(alpha,size(signal_time_C,1)),1,symbol_count);
subplot(3,1,3)
plot(signal_window(:,1))
title('加窗后的单个OFDM符号')
xlabel('Time');
ylabel('Amplitude');
% ===================发送信号,多径信道====================
signal_Tx = reshape(signal_window,1,[]); % 变成时域一个完整信号,待传输
signal_origin = reshape(signal_time_C,1,[]); % 未加窗完整信号
mult_path_am = [1 0.2 0.1]; %  多径幅度
mutt_path_time = [0 20 50]; % 多径时延
windowed_Tx = zeros(size(signal_Tx));
path2 = 0.2*[zeros(1,20) signal_Tx(1:end-20) ];
path3 = 0.1*[zeros(1,50) signal_Tx(1:end-50) ];
signal_Tx_mult = signal_Tx + path2 + path3; % 多径信号
figure('menubar','none')
subplot(2,1,1)
plot(signal_Tx_mult)
title('多径下OFDM信号')
xlabel('Time/samples')
ylabel('Amplitude')
subplot(2,1,2)
plot(signal_Tx)
title('单径下OFDM信号')
xlabel('Time/samples')
ylabel('Amplitude')
% =====================发送信号频谱========================
% ====================未加窗信号频谱=======================
% 每个符号求频谱再平均,功率取对数
figure % 归一化
orgin_aver_power = 20*log10(mean(abs(fft(signal_time_C'))));
subplot(2,1,1)
plot((1:length(orgin_aver_power))/length(orgin_aver_power),orgin_aver_power)
hold on
plot(0:1/length(orgin_aver_power):1 ,-35,'rd')
hold off
axis([0 1 -40 max(orgin_aver_power)])
grid on
title('未加窗信号频谱')
% ====================加窗信号频谱=========================
orgin_aver_power = 20*log10(mean(abs(fft(signal_window'))));
subplot(2,1,2)
plot((1:length(orgin_aver_power))/length(orgin_aver_power),orgin_aver_power)
hold on
plot(0:1/length(orgin_aver_power):1 ,-35,'rd')
hold off
axis([0 1 -40 max(orgin_aver_power)])
grid on
title('加窗信号频谱')
% ========================加AWGN==========================
signal_power_sig = var(signal_Tx); % 单径发送信号功率
signal_power_mut = var(signal_Tx_mult); % 多径发送信号功率
SNR_linear = 10^(SNR/10);
noise_power_mut = signal_power_mut/SNR_linear;
noise_power_sig = signal_power_sig/SNR_linear;
noise_sig = randn(size(signal_Tx))*sqrt(noise_power_sig);
noise_mut = randn(size(signal_Tx_mult))*sqrt(noise_power_mut);
% noise_sig=0;
% noise_mut=0;
Rx_data_sig = signal_Tx+noise_sig;
Rx_data_mut = signal_Tx_mult+noise_mut;
% =======================串并转换==========================
Rx_data_mut = reshape(Rx_data_mut,ifft_length+CS_length+CP_length,[]);
Rx_data_sig = reshape(Rx_data_sig,ifft_length+CS_length+CP_length,[]);
% ====================去循环前缀和后缀======================
Rx_data_sig(1:CP_length,:) = [];
Rx_data_sig(end-CS_length+1:end,:) = [];
Rx_data_mut(1:CP_length,:) = [];
Rx_data_mut(end-CS_length+1:end,:) = [];
% =========================FFT=============================
fft_sig = fft(Rx_data_sig);
fft_mut = fft(Rx_data_mut);
% =========================降采样===========================
data_sig = fft_sig(carrier_position,:);
data_mut = fft_mut(carrier_position,:);
figure
scatter(real(reshape(data_sig,1,[])),imag(reshape(data_sig,1,[])),'.')
grid on;
figure
scatter(real(reshape(data_mut,1,[])),imag(reshape(data_mut,1,[])),'.')
grid on;
% =========================逆映射===========================
bit_demod_sig = reshape(qamdemod(data_sig,16,'OutputType','bit'),[],1);
bit_demod_mut = reshape(qamdemod(data_mut,16,'OutputType','bit'),[],1);
% =========================误码率===========================
error_bit_sig = sum(bit_demod_sig~=bit_sequence);
error_bit_mut = sum(bit_demod_mut~=bit_sequence);
error_rate_sig = error_bit_sig/bit_length;
error_rate_mut = error_bit_mut/bit_length;
rate = [rate; error_rate_sig error_rate_mut]
% ==========================================================
% ==========================================================
function window=rcoswindow(alpha,bit_length)warning off;window = zeros(1,bit_length/2);t = 1:bit_length/2;T = bit_length/(2*(1+alpha));window(t) = 0.5*(1 - sin(pi/(2*alpha*T)*(t-T)));window(1:(1-alpha)*T) = 1;window=[fliplr(window) window]';
end

直接运行代码可以得到下面的结果

自己加个循环就可以得到误码率和信噪比的曲线了

OFDM调制matlab仿真详细代码相关推荐

  1. 基于matlab的64QAM,通信调制体制设计之64QAM性能分析MATLAB仿真及代码

    通信调制体制设计之64QAM性能分析MATLAB仿真及代码 通信调制体制设计之64QAM性能分析MATLAB仿真及代码 任务背景 弗雷泽岛旅游经理在审查您之前建立无线链路任务的解决方案时,正在研究使用 ...

  2. matlab实现ofdm调制解调,基于MATLAB的OFDM调制解调仿真

    基于MATLAB的OFDM调制解调仿真 题目:基于 MATLAB的 OFDM调制解调仿真2009年 6 月 13 日目 录摘要 .IIAbstract IV第 1章 正交频分复用的来源 - 1 -1. ...

  3. 滑模变结构控制matlab仿真 程序,滑模变结构控制MATLAB仿真 程序代码

    [实例简介] 滑模变结构控制MATLAB仿真 程序代码,值得借鉴 [实例截图] [核心代码] 滑模变结构控制MATLAB仿真 └── 滑模变结构控制MATLAB仿真 ├── 43188036Slidi ...

  4. ofdm系统matlab仿真论文,基于MATLAB的OFDM仿真(SIMULINK仿真)

    中 文 摘 要 正交频分复用(OFDM)是一种多载波宽带数字调制技术.相比一般的数字通信系统,它具有频带利用率高和抗多径干扰能力强等优点,因而适合于高速率的无线通信系统.正交频分复用 OFDM 是第四 ...

  5. 【数字信号调制】正交幅度调制matlab仿真

    1 简介 2 部分代码 ​M=16;k=log2(M);n=100000; %比特序列长度 samp=1; %过采样率x=randint(n,1); %生成随机二进制比特流subplot(211);s ...

  6. 教你用Matlab进行系统仿真 - Matlab仿真详细教程

    前言 MATLAB是美国著名公司MathWorks推出的商业数学软件.该软件为用户提供算法开发.数据可视化.数据分析等交互操作环境.本文主要介绍如何利用MATLAB进行仿真.请参见下面的详细操作. 一 ...

  7. fm调制matlab仿真,FM调制的matlab仿真报告.doc

    FM调制的matlab仿真报告 FM 调制及解调题目要求:设输入信号为m(t) = cos 2πt ,载波中心频率为f c =10 Hz ,VCO的压控振荡系数为5 H z / V,载波平均功率为1W ...

  8. 雷达辐射源调制信号仿真(代码)

    雷达辐射源调制信号仿真 说明:通过Matlab进行单载频(CW),线性调频(LFM).非线性调频(NLFM).二相编码(BPSK).四相编码(QPSK).二频编码(BFSK).四频编码(QFSK)七种 ...

  9. 通信调制体制设计之64QAM性能分析MATLAB仿真及代码

    关注公号[逆向通信猿]更精彩!!! 任务背景 弗雷泽岛旅游经理在审查您之前建立无线链路任务的解决方案时,正在研究使用无线链路传输实时安全视频源的可能性.由于来自岛周围的多个安全摄像机的视频信号在传输之 ...

最新文章

  1. BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊
  2. 10个月产品演化之路-快速试错,快速反应,探索产品成功之道
  3. 签到 数据库php,php与数据库的连接用法 (签到一)
  4. Android官方开发文档Training系列课程中文版:性能优化建议
  5. U盘安装centos 7 提示 “Warning: /dev/root does not exist, could not boot” 解决办法
  6. Extjs4 Tab面板Mapbar地图关闭再打开气泡失效问题解决
  7. ensp提示抓包工具wireshark配置路径不正确
  8. WIFI 信道 channel
  9. STM32超低功耗入门之停止模式
  10. C语言 小明的调查作业
  11. 企业微信_H5应用如何真机调试_host配置及代理相关
  12. 【vue2】ElementUI与VantUI组件库的使用详解(vue全家桶之一)
  13. 20-交换技术——Trunk技术详解
  14. DAMOYOLO:基于DAMOYOLO训练数据集详细教程
  15. 信息经济学 - 信息不对称
  16. asp.net页面名首字母大小写对网页权重的影响
  17. iOS、Android连接Charles代理(Mac版)
  18. LeetCode 700题 题解答案集合 Python
  19. Linux Shell远程执行命令(ssh)
  20. Object-C Target-Action模式 回调

热门文章

  1. 第一章-算法在计算中的作用
  2. 关于修改虚拟机内存,和开启 硬件加速
  3. magento怎么修改货币符号,在之前加上国家缩写
  4. flask---》url_for 模板语法 内置过滤器 url_map
  5. 使用CStdioFile::ReadString来逐行读取文件
  6. 大漠老师:2022 年的 CSS,到底有哪些特性
  7. Java技术之AQS详解
  8. Navicat for MySQL 12破解
  9. crontab 定时任务时间格式设置
  10. 人脸识别2:InsightFace实现人脸识别Face Recognition(含源码下载)