OFDM通信连路仿真学习

news2024/9/24 13:25:39

文章目录

  • 前言
  • 一、前置知识
    • 1、块状导频与梳状导频
      • ①、相似点
      • ②、区别
      • ③、其他
    • 2、其他知识
  • 二、仿真任务及方案
    • 1、仿真任务
    • 2、仿真方案
  • 三、MATLAB仿真
    • 1、MATLAB 源码
    • 2、程序流程
    • 3、仿真结果
      • ①、打印信息
      • ③、8PSK 星座图
      • ②、脉冲成型图
      • ③、ETU300登加AWGN信道下误比特率曲线
  • 四、资源自取


前言

本文继续进行 OFDM 通信连路仿真学习。


一、前置知识

1、块状导频与梳状导频

块状导频也称为训练序列

在这里插入图片描述

①、相似点

  • 导频序列和训练序列的作用都是为了得到准确符号同步频偏纠正
  • 导频序列和训练序列都进行信道估计
  • 二者都传输已知数据;
  • 二者都可称之为基于辅助信息的信道估计方法;

②、区别

  • 添加位置不同:导频序列加在频域上,作用在频域。训练序列是在时域上添加的特定的序列;
  • 表现形式不同:导频序列表现为频谱上的一根线,散布在整个时频单元(在整个帧中是离散的)。训练序列表现为时域上的时间块,一个或多个连续的符号(集中在帧头并且连续)。
  • 要求不同:加在时域的训练序列要求有较强自相关性和弱互相关性。加在频域的导频序列无此要求。

③、其他

  • 同步信道(sync channel)的概念一般只在训练序列中涉及,对于导频来说似乎没有;
  • 导频的频率应当是与载频有关的或者就是载频的频率;
  • 块状导频就相当于训练序列;
  • 导频序列常用于载波同步,训练序列用于帧同步;
  • 二者都可进行信道估计,信道估计的目的是获得信道的一些参数,如频移、时延等。因此信道估计也称为信道参数估计。

2、其他知识

有关其他仿真细节原理知识可以参考我之前的博客:OFDM深入学习及MATLAB仿真

二、仿真任务及方案

1、仿真任务

  • 使用 Matlab 语言,仿真实现 OFDM 基带信号在频率选择性信道条件下的发送与接收。输入为随机比特流,经由 OFDM 调制、仿真信道传输、OFDM 解调后输出比特流,可计算不同信噪比条件下的误码率。其中子载波间隔 15KHz,循环前缀长度及子载波数目可调,各子载波使用 QPSK 调制。
  • 信道:信号经历 3GPP TS36.101 附录 B 中表 B.2.2-1 给出的ETU300 多径信道,随后叠加一个信噪比可调的 AWGN 信道。
    在这里插入图片描述
    在这里插入图片描述
  • 要求:能够查看并解释从输入到输出沿路各点信号的时域波形和频域特性图;能够绘制误码率随信噪比变化的曲线。
  • 设计梳状或块状导频并在接收端完成信道估计与补偿(即均衡)。

2、仿真方案

  • 本方案在满足以上要求的前提下,选用了块状导频;除了循环前缀长度及子载波数目可调外,可以通过改变 M 的值,选用 MPSK,且导频间隔与 OFDM 符号数可任意调整,并具有信道编码,交织,脉冲成型模块。
  • 仿真系统模块依次为:
    • 二进制基带数据生成,卷积码编码,交织,QPSK调制,串并转换,加入虚载波(补零,数目为 fft 点数减去子载波数),插入导频,IFFT,插入循环前缀,并串转换,脉冲成型(先上采样再通过升余弦滚降滤波器),过信道。
    • 解脉冲成型(通过相同的升余弦滚降滤波器,再抽样),串并转换,去循环前缀,FFT,信道估计(取出数据与导频,进行LS信道估计),去除虚载波(去零),并串转换,QPSK解调,解交织,信道译码(维比特译码),得到数据并计算误码率。

三、MATLAB仿真

1、MATLAB 源码

ofdm.m

%%
% 仿真系统构成:信号输入(为随机比特流)、OFDM调制、仿真信道传输、OFDM解调、信号输出
% 仿真分析内容:根据输入、输出比特流计算不同信噪比条件下的误码率,
% 并绘制曲线对调制的要求:
% OFDM调制的子载波间隔为15KHz
% 循环前缀长度,子载波数目,导频间隔及ofdm符号数可调,
% 各子载波使用QPSK调制
% 未使用扩频技术,未乘以载波进行上变频,未测试梳妆导频性能
%%
clc;
clear ;
close ;
tic;
disp("simulation start");
%% 参数设置
sta_num = 5;              %仿真次数
SNR = -4:1:25; 
num_carriers = 100;       %子载波数
cp_length = 15;           %循环前缀长度
M = 8;                    %QPSK时,M=4
is_pilot_k = 1;           %块状导频
q = 8;                    %fs = q*B_jidai;
pilot_interval = 4;       %导频间隔
num_ofdm_symbol = 99;     %ofdm符号数
%% 以上参数为可调部分
f_delta = 15e3;
n = 1;
while(true)
%     if(2^n >= num_carriers / pilot_interval * (pilot_interval +1))
    if(2^n >= num_carriers )
        num_fft = 2^n;
        break;
    end
    n = n+1;
end
num_bit = num_carriers * num_ofdm_symbol * log2(M);%二进制bit数  乘以 log2(M) 是为了考虑调制方式对传输数据的影响
B_jidai = num_carriers * f_delta;                  %基带宽度
fs = q*B_jidai;                                    %数字系统采样率
ts = 1/fs;
fd = 300;                                          %多普勒频偏
pathPower = [-1.0 -1.0 -1.0 0 0 0 -3.0 -5.0 -7.0];
pathDelays = [0 50 120 200 230 500 1600 2300 5000]*1e-9;
% chan = rayleighchan(ts, fd, pathDelays, pathPower);  
rchan = comm.RayleighChannel('SampleRate',fs, ...
    'PathDelays',pathDelays,'AveragePathGains',pathPower, ...
    'MaximumDopplerShift',fd,'FadingTechnique','Sum of sinusoids');

%% 基带数据数据产生
data_sourcebit = randi([0,1],1,num_bit);
%% 信道编码(卷积码、再交织)
L=7;                %卷积码约束长度
tblen=6*L;          %Viterbi译码器回溯深度
trellis = poly2trellis(7,[133 171]);       %(2,1,7)卷积编码
data_conv = convenc(data_sourcebit,trellis);
data_scramble = matintrlv(data_conv, log2(M), length(data_conv) / log2(M));
%% qpsk调制
data_dec = bi2de(reshape(data_scramble,length(data_scramble)/log2(M),log2(M)));
data_moded = pskmod(data_dec,M,pi/M);
scatterplot(data_moded);
%% 串并转换
data_moded = reshape(data_moded,num_carriers,length(data_moded)/num_carriers);
%% 扩频
%%补零
data_buling = [data_moded;...
    zeros(num_fft-size(data_moded,1),size(data_moded,2))];
%% 插入导频    
if (is_pilot_k==1)
    pilot_bit_k = randi([0,1],1,log2(M)*num_fft);
    pilot_seq = pskmod(bi2de...
    (reshape(pilot_bit_k,length(pilot_bit_k)/log2(M),log2(M))),M,pi/M);
    data_pilot_inserted = insert_pilot_f(data_buling,pilot_seq,pilot_interval,is_pilot_k);
end

%% IFFT
data_ifft = ifft(data_pilot_inserted,num_fft)*num_fft;
%data_ifft = ifft(data_pilot_inserted,num_fft)*sqrt(num_fft);
%% 插入保护间隔、循环前缀
data_after_cp = [data_ifft(num_fft-cp_length+1:end,:);data_ifft];
%% 并串转换
data_total = reshape(data_after_cp,[],1);
%% 脉冲成型,
sendfir = rcosdesign(0.4,4,fs/B_jidai,'sqrt');
data_upsam = upsample(data_total,fs/B_jidai);
data_send = conv(data_upsam,sendfir,'same');
%% 画图
signal = data_send;
figure(2);
subplot(311);
plot(real(signal));
subplot(312);
plot(imag(signal));
subplot(313);
fft_y=abs(fft(signal,q*num_fft));
fft_x=fs*((1:(q*num_fft))/(q*num_fft)-1/2);
plot(fft_x,20*log10(fftshift(fft_y./max(fft_y))));
%% DA
%% 上变频
%% 信道(通过多经瑞利信道、AWGN信道)

Ber=zeros(1,length(SNR));
for jj=1:length(SNR) 
    for ii=1:sta_num
        channel_out = step(rchan,data_send);
        rx_channel=awgn(channel_out,SNR(jj),'measured');       
%% 下变频
%% AD
        rx_data1 = conv(rx_channel, sendfir, 'same');
        rx_data2 = rx_data1(1:fs/B_jidai:length(rx_data1));
%% 串并转换
        rx_data3=reshape(rx_data2,num_fft+cp_length,[]);
%% 去掉循环前缀
        rx_data4=rx_data3(cp_length+1:end,:);
%% FFT
        rx_data_fft = (1/num_fft)*fft(rx_data4,num_fft);
%% 信道估计与插值(均衡)
%% 信道校正
        [rx_data_delpilot,H] = get_pilot_f(rx_data_fft,pilot_interval);
        rx_data_estimation = chan_estimation_f...
        (rx_data_delpilot,H,pilot_seq,pilot_interval);
%% 去零,并串转换
        rx_data_quling = rx_data_estimation(1:num_carriers,:);
        rx_data_psk = reshape(rx_data_quling,[],1);
%         scatterplot(rx_data_psk);
%% 解扩
%% QPSK解调
        demodulation_data=pskdemod(rx_data_psk,M,pi/M);    
        De_data1 = reshape(demodulation_data,[],1);
        De_data2 = de2bi(De_data1);
        De_Bit = reshape(De_data2,1,[]);   
%% (解交织)
        rx_data_jiejiaozi = matdeintrlv(De_Bit, log2(M), length(De_Bit) / log2(M));
%% 信道译码(维特比译码)
        rx_data_deco = vitdec(rx_data_jiejiaozi,trellis,tblen,'trunc','hard');   %硬判决
%% 计算误码率
[~, ber] = biterr(rx_data_deco(1:length(data_sourcebit)),data_sourcebit);%译码后的误码率
Ber(jj)=Ber(jj)+ber;
    end
Ber(jj)=Ber(jj)/sta_num;
fprintf("SNR = %d dB, ber = %.5f \n",SNR(jj),Ber(jj));
end
figure(3);
signal = rx_channel;
subplot(311);
plot(real(signal));
subplot(312);
plot(imag(signal));
subplot(313);
fft_y=abs(fft(signal,q*num_fft));
fft_x=fs*((1:(q*num_fft))/(q*num_fft)-1/2);
plot(fft_x,20*log10(fftshift(fft_y./max(fft_y))));
figure(4);
%  semilogy(SNR,Ber2,'b-s');
%  hold on;
semilogy(SNR,Ber,'r-o');
hold on;
xlabel('SNR');
ylabel('BER');
title('ETU300叠加AWGN信道下误比特率曲线');

toc;
  • 第 36 行计算 num_bit 时乘以 log2(M) 是为了考虑调制方式对传输数据的影响。
    • 在 OFDM 系统中,每个子载波上可以传输多个比特,通常使用调制方式将多个比特映射到一个符号上进行传输。调制方式可以是 QPSK、16-QAM、64-QAM等。
    • 在计算 num_bit 时,乘以 log2(M) 可以得到需要传输的总比特数。这是因为在 OFDM 系统中,每个 OFDM 符号的数据部分由多个子载波组成,每个子载波上都传输一定数量的比特,因此需要考虑每个符号上的比特数和调制方式的关系。
  • 第 82 行使用 rcosdesign 函数设计了一个根号升余弦滤波器。该函数的输入参数为滚降系数(0.4)、滤波器的长度(4),以及滤波器的归一化截止频率(fs/B_jidai),其中 fs 为数字系统的采样率,B_jidai 为基带带宽。这个滤波器的作用是在信号传输过程中对信号进行滤波,以限制频带内的能量,并控制信号的带内和带外衰减。
  • 第 83 行使用 upsample 函数对输入的信号 data_total 进行上采样。上采样是将信号的采样率提高,即在信号中插入更多的零值样本,以增加信号的频带范围。上采样的倍数为 fs/B_jidai,其中 fs 为数字系统的采样率,B_jidai 为基带带宽。
  • 第 84 行使用 conv 函数对上采样后的信号 data_upsam 和滤波器的脉冲响应 sendfir 进行卷积运算。卷积运算的结果是将信号通过滤波器,得到经过滤波的信号。'same' 参数表示输出的卷积结果与输入信号的长度相同。
  • 第 94 行计算频域的横坐标,即频率。fs 是采样率,(1:(q*num_fft))/(q*num_fft)-1/2 生成一个从 -0.5 到 0.5 的等间隔序列,并乘以采样率 fs 得到真实的频率值。
  • 第 95 行在当前子图中绘制频谱图。fftshift 函数将频域数据进行移位,使得 0 频率位于图形中心。./max(fft_y)FFT 结果进行归一化处理,使得最大值为 1。20*log10 将幅度转换为以分贝为单位的对数尺度。绘制出的图形将显示信号的频域特性。
  • 第 107-108 行:这两行代码实现了接收端的信号处理。首先,通过卷积运算将接收到的信号与发送端的滤波器的脉冲响应进行反脉冲成型,恢复出发送信号的波形。然后,通过采样操作从反脉冲成型后的信号中提取出每个采样点的样本,以便后续的信号解调和处理。提取后的样本保存在 rx_data2 变量中。
    • 第 107 行使用 conv 函数将接收到的信号 rx_channel 与发送端的滤波器的脉冲响应 sendfir 进行卷积运算。卷积的结果是对接收信号进行反脉冲成型,即恢复出发送信号经过信道传输后的波形。'same' 参数表示输出的卷积结果与输入信号的长度相同。
  • 第 110 行:将接收到的连续信号按照每个子载波的长度(包括循环前缀)进行分组,重新排列为一个矩阵。矩阵的每一列对应于一个子载波的信号样本,行数则表示每个子载波上进行FFT的点数加上循环前缀的长度。这样做的目的是为了后续对每个子载波进行 FFT 处理,以提取频域信息。

2、程序流程

程序流程思维导图文末资源自取。
在这里插入图片描述

3、仿真结果

①、打印信息

simulation start
SNR = -4 dB, ber = 0.45980 
SNR = -3 dB, ber = 0.45087 
SNR = -2 dB, ber = 0.42770 
SNR = -1 dB, ber = 0.41361 
SNR = 0 dB, ber = 0.38854 
SNR = 1 dB, ber = 0.37098 
SNR = 2 dB, ber = 0.34956 
SNR = 3 dB, ber = 0.32510 
SNR = 4 dB, ber = 0.30745 
SNR = 5 dB, ber = 0.28106 
SNR = 6 dB, ber = 0.25711 
SNR = 7 dB, ber = 0.24377 
SNR = 8 dB, ber = 0.22386 
SNR = 9 dB, ber = 0.21781 
SNR = 10 dB, ber = 0.21100 
SNR = 11 dB, ber = 0.20307 
SNR = 12 dB, ber = 0.18618 
SNR = 13 dB, ber = 0.19459 
SNR = 14 dB, ber = 0.16919 
SNR = 15 dB, ber = 0.16418 
SNR = 16 dB, ber = 0.16908 
SNR = 17 dB, ber = 0.15683 
SNR = 18 dB, ber = 0.15314 
SNR = 19 dB, ber = 0.15960 
SNR = 20 dB, ber = 0.14756 
SNR = 21 dB, ber = 0.17572 
SNR = 22 dB, ber = 0.16144 
SNR = 23 dB, ber = 0.14231 
SNR = 24 dB, ber = 0.15244 
SNR = 25 dB, ber = 0.15856 
时间已过 29.591768 秒。

③、8PSK 星座图

请添加图片描述

②、脉冲成型图

在这里插入图片描述
从上到下依次为脉冲成型后待发送的实部图、虚部图和频谱图

③、ETU300登加AWGN信道下误比特率曲线

请添加图片描述

四、资源自取

OFDM通信连路仿真学习

本文参考:
matlab-ofdm通信链路仿真


我的qq:2442391036,欢迎交流!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1272263.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【人工智能Ⅰ】实验4:贝叶斯分类

实验4 贝叶斯分类 一、实验目的 1. 了解并学习机器学习相关库的使用。 2. 熟悉贝叶斯分类原理和方法,并对MNIST数据集进行分类。 二、实验内容 1. 使用贝叶斯方法对mnist或mnist variation数据集进行分类,并计算准确率。数据集从网上下载&#xff0…

【C++】异常处理 ② ( 异常捕获类型 | 异常捕获机制 - 严格匹配异常类型 | 未知异常捕获 - 不知道异常类型 )

文章目录 一、异常捕获机制 - 严格匹配异常类型1、异常捕获机制 - 严格匹配异常类型2、代码示例 - 异常捕获严格匹配异常类型 二、异常捕获机制 - 未知异常捕获1、未知异常捕获 - 不知道异常类型2、代码示例 - 未知异常捕获 一、异常捕获机制 - 严格匹配异常类型 1、异常捕获机…

嵌入式Linux:配置Ubuntu系统环境和安装开发工具

目录 1、配置Ubuntu系统环境 1.1、APT下载工具 1.2、更新语言 1.3、更新本地数据库 1.4、安装VIM编辑器 1.5、Ubuntu 和 Windows 文件互传 1.6、开启NFS服务 1.7、开启SSH服务 2、安装开发工具 2.1、Ubuntu安装VSCode 2.2、Windows安装MobaXterm 安装好Ubuntu系统环…

需求不明确的情况下,测试该如何处理?

当需求不明确的情况下,测试团队可以采取以下措施来处理: 1. 与项目团队进行沟通:测试团队应与项目团队密切合作,与业务分析师、产品经理等相关人员进行沟通,以获取更多的需求细节和背景信息。通过与相关方的交流&…

No matching version found for @babel/compat-data@^7.23.5 处理

npm ERR! notarget No matching version found for babel/compat-data^7.23.5 处理 报错信息 npm WARN ERESOLVE overriding peer dependency npm ERR! code ETARGET npm ERR! notarget No matching version found for babel/compat-data^7.23.5. npm ERR! notarget In most …

Shopee引流妙招!Shopee产品标签重要吗?教你有效打标签引爆流量!

对Shopee平台的卖家来说,在新产品上架时除了要注重产品title、介绍以及图文的优化,还有一件事情很重要,那就是——产品打标签。 对于每个跨境电商卖家来讲,对产品打标签都是必不可少的一个运营环节 下面小宇就来告诉大家&#xf…

字符串的旋转

字符串的旋转 左旋(逆时针) 示例:abcd------>bcda 右旋(顺时针) 示例:abcd------>dabc 例: 输入若干个字符串(1≤长度≤1000)右旋转串后的n(-长度…

芒格传奇落幕!生前最后一次谈论比特币,说了什么?

当地时间11月28日,知名投资公司伯克希尔哈撒韦发布声明,公司董事会副主席查理芒格(Charlie Munger)于当天早上在美国加利福尼亚州的一家医院去世,终年99岁,距离其百岁生日仅剩1个月。 巴菲特在一份声明中表示:“没有查…

Anaconda超简单安装教程,超简洁!!!(Windows环境下,亲测有效)

写下这篇文章的动机,是今天在装Anaconda的时候,本来想搜点教程按照教程一步一步安装的,但没想到,所谓“保姆级”教程呀,“最详细”之类的,好复杂。然后一些本应该详细说的反而一笔带过了。所以今天我想把我…

基于YOLOv8深度学习的安全帽目标检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

滴滴遭遇重击:12小时内损失千万订单量与超4亿成交额,背后有何启示?

近期,中国最大的出行平台之一——滴滴,经历了一次长达12小时的系统崩溃,造成了重大的经济损失。这一事件引起了广泛关注,并凸显出一些关键信息。本文将深入探讨此次事件中凸显的关键信息和可能的技术原因。 首先,滴滴作…

GeoServer改造Springboot源码四(图层管理设计)

一、界面设计 图 1图层管理列表 图 2选择图层数据源 图 3添加图层 图 4编辑图层

从setText处理来学习绘制流程

Android中TextView调用setText是会进行text文字的更新,是一个比较简单的画面变化,这可以作为一个出发点来查看绘制处理流程。这里来问问chatGPT,来查看大致流程 请讲讲Android中textView的setText处理流程 ChatGPT Poe 当你调用 textView.s…

【人工智能Ⅰ】实验3:蚁群算法

实验3 蚁群算法的应用 一、实验内容 TSP 问题的蚁群算法实现。 二、实验目的 1. 熟悉和掌握蚁群算法的基本概念和思想; 2. 理解和掌握蚁群算法的参数选取,解决实际应用问题。 三、实验原理 1.算法来源 蚁群算法的基本原理来源于自然界…

P1025 [NOIP2001 提高组] 数的划分

暴搜 剪枝 枚举固定的位置 #include<bits/stdc.h> using namespace std; using ll long long; const int N 1e310; int n,k; int res; void dfs(int last,int sum,int cur){if(curk){if(sumn)res;return;}for(int ilast;isum<n;i)dfs(i,sumi,cur1); } int main() {c…

DDD落地:从携程订单系统重构,看DDD的巨大价值

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 谈谈你的DDD落地经验&#xff1f; 谈谈你对DDD的理解&#x…

玄学调参实践篇 | 深度学习模型 + 预训练模型 + 大模型LLM

&#x1f60d; 这篇主要简单记录一些调参实践&#xff0c;无聊时会不定期更新~ 文章目录 0、学习率与batch_size判断1、Epoch数判断2、判断模型架构是否有问题3、大模型 - 计算量、模型、和数据大小的关系4、大模型调参相关论文经验总结5、训练时模型的保存 0、学习率与batch_s…

抑制过拟合——Dropout原理

抑制过拟合——Dropout原理 Dropout的工作原理 实验观察 在机器学习领域&#xff0c;尤其是当我们处理复杂的模型和有限的训练样本时&#xff0c;一个常见的问题是过拟合。简而言之&#xff0c;过拟合发生在模型对训练数据学得太好&#xff0c;以至于它捕捉到了数据中的噪声和…

热烈欢迎省工信厅毛郑建处长莅临公司调研指导工作

2023年11月28日&#xff0c;河南省工信厅信息化和软件服务业处毛郑建处长莅临郑州埃文计算机科技有限公司&#xff08;以下简称“埃文科技”&#xff09;调研考察工作。河南省工业信息安全产业发展联盟理事长任传军陪同调研。 首先&#xff0c;埃文科技董事长王永向毛处长介绍埃…

开源运维监控系统-Nightingale(夜莺)应用实践(未完)

一、前言 某业务系统因OS改造,原先的Zabbix监控系统推倒后未重建,本来计划用外部企业内其他监控系统接入,后又通知需要自建才能对接,考虑之前zabbix的一些不便,本次计划采用一个类Prometheus的监控系统,镜调研后发现Nightingale兼容Prometheus,又有一些其他功能增强,又…