该代码是Monash University的几位老师开源的(Raviteja Patchava, Yi Hong, and Emanuele Viterbo)首先感谢一下^_^

接下来就开始我们的代码学习过程

首先要解决OTFS发射端和接收端对于输入输出符号调制解调的问题,OTFS发射端的流程图如下图所示:

数据符号x[k,l]

因此首先就是输入符号x[k,l]的产生,在这里作者使用的是基于格雷码编码的4-QAM调制,如下图所示:

%% random input bits generation and 4QAM modulation%%%%%data_info_bit = randi([0,1],N_bits_perfram,1); %生成0或1的随机数,且维数是128*1,也就是生成了一个帧结构中包含的bit数data_temp = bi2de(reshape(data_info_bit,N_syms_perfram,M_bits));%二进制数转换成10进制数,reshape为重组数组,语法为reshape(A,a,b)将矩阵A重构为a*b的矩阵%reshape(128,64,2),即将128*1的data_info_bit重组成64*2的矩阵,%x = qammod(data_temp,M_mod,0,'gray');x = qammod(data_temp,M_mod, 'gray'); %输出使用正交幅度调制4-QAM消息信号X的复包络,gray格雷码编码x = reshape(x,N,M); %将64*1的x重组成8*8数组

OTFS调制

然后就是ISSFT变换

其实matlab官网是有ISFFT和SFFT的函数可以调用的Inverse short-time Fourier transform - MATLAB istft - MathWorks 中国

作者的实现方式如下:

OTFS发射机首先使用ISFFT将符号X映射到时频网格Λ上的NM样本X[n,m],如下所示

对于n = 0,...,N−1,m = 0,...,M−1。

%% OTFS Modulation: 1. ISFFT
X = fft(ifft(x).').'/sqrt(M/N); %%%ISFFT

接下来就是海森堡变换

时频调制器使用发射波形gtx (t)将样本X[n,m]转换为连续的时间波形x(t)

(3)在数学文献中也被称为(离散的)海森堡变换,由参数化的gtx (t)实现

%% OTFS Modulation:2. Heisenberg transform
s_mat = ifft(X.')*sqrt(M); % Heisenberg transform
s = s_mat(:);
end

ISSFT和海森堡拼接在一起就实现了OTFS的调制

function s = OTFS_modulation(N,M,x)
%% OTFS Modulation: 1. ISFFT, 2. Heisenberg transform
X = fft(ifft(x).').'/sqrt(M/N); %%%ISFFT,其中.'表示转置,
s_mat = ifft(X.')*sqrt(M); % Heisenberg transform
s = s_mat(:);%(:)表示将矩阵重构为列向量:
end

注意:最后生成的s是一个64*1的复数列向量

OTFS解调

在接收端,一个匹配的滤波器计算交叉模糊度函数Agrx,r(t,f)如下

function y = OTFS_demodulation(N,M,r)
%% OTFS demodulation: 1. Wiegner transform, 2. SFFT
r_mat = reshape(r,M,N);
Y = fft(r_mat)/sqrt(M); % Wigner transform
Y = Y.';
y = ifft(fft(Y).').'/sqrt(N/M); % SFFT
end

调制解调我们解决了之后,就需要考虑在信道中传输和接收端匹配滤波的过程

信道参数生成

需要得到时延和多普勒域中的抽头数量和信道系数,根据文献

”Interference Cancellation and Iterative Detection for Orthogonal Time Frequency Space Modulation“

可知信号s (t)在具有复基带信道脉冲响应h(τ,ν)的时变信道上传输,它描述了信道对具有延迟τ和多普勒ν 的脉冲的响应。接收信号的r (t)由(忽略噪声以简化符号)表示

由于通常在通道中只有少量的反射器具有相关的延迟和多普勒,因此不需要太多的参数来模拟延迟-多普勒域中的通道。信道h(τ,ν)的稀疏表示为

P是传播路径的数量;hi、τi和νi分别表示与第i条路径相关的路径增益、延迟和多普勒频移(或频率),δ(·)表示Dirac增量函数。我们表示第i条路径的延迟和多普勒抽头如下

具体来说,lτi和kνi分别表示(连续)延迟τi抽头系数和多普勒频率νi抽头系数

因此信道参数可以按照下图生成

function [taps,delay_taps,Doppler_taps,chan_coef] = OTFS_channel_gen(N,M)
%% Channel for testing%%%%%
%channel with 4 taps of uniform power%%%
taps = 4;   %抽头数设置为4
delay_taps = [0 1 2 3]; %时延抽头设置为4
Doppler_taps = [0 1 2 3];   %多普勒域抽头设置为4
pow_prof = (1/taps) * (ones(1,taps));
chan_coef = sqrt(pow_prof).*(sqrt(1/2) * (randn(1,taps)+1i*randn(1,taps)));%信道系数
%%%%%%%%%%%%%%%%%%%%end

于是按照公式(4)接受信号r(t)可以表示为

function r = OTFS_channel_output(N,M,taps,delay_taps,Doppler_taps,chan_coef,sigma_2,s)
%% wireless channel and noise
L = max(delay_taps);%最大的时延
s = [s(N*M-L+1:N*M);s];%add one cp %加入循环前缀编码(将OTFS符号数组的后四位信号复制到头部构成的一组(64+4)*1的数组)
s_chan = 0; %信道输入信号初始化
for itao = 1:tapss_chan = s_chan+chan_coef(itao)*circshift([s.*exp(1j*2*pi/M *(-L:-L+length(s)-1)*Doppler_taps(itao)/N).';zeros(delay_taps(end),1)],delay_taps(itao));%%s_chan是71*1维数组
end
noise = sqrt(sigma_2/2)*(randn(size(s_chan)) + 1i*randn(size(s_chan)));%信道噪声
r = s_chan + noise;
r = r(L+1:L+(N*M));%discard cp(去掉循环前缀,也就是输出68*1维数组的后64位)
end

经过OTFS解调以及去掉循环前缀后得到的接收函数r为64*1维数组,接下来就要进行联合干扰消除与检测的消息传递算法(MP)

MESSAGE PASSING ALGORITHM

我们现在提出了一种使用(20)(或(24))中的输入-输出关系的OTFS的消息传递(MP)算法。

A. 低复杂度的MP检测算法

接收到的矢量化信号可以写成

其中y和z是维数NM×1的复向量,元素分别为y[d]和z[d],1≤d≤NM;H是一个NM×NM复矩阵。x是维数NM×1的信息向量,包含元素x[c]∈A,1≤c≤NM^2,z是噪声。只有当NM中的元素满足如下条件时在H中的元素是非零的。

其中P是传播路径的数量,我们可以看到,由于S比NM小得多,所以H是一个稀疏矩阵(元素大部分为零的矩阵)

请注意,尽管(26)适用于(20)中的理想脉冲情况和(24)中的矩形脉冲情况,但对于不同的矩阵H,这两种情况下H的每一行和列中的非零元素S的数量保持相同。该条件有助于用理想脉冲的复杂度检测算法补偿矩形脉冲的ICI和ISI。

在(26)的基础上,我们将系统模型为稀疏连接因子图,NM变量节点对应x,NM观测节点对应y。在这个因子图中,每个观测节点y[d]都连接到S个变量节点的集合{x[c],c∈I (d)}。同样,每个变量节点x[c]连接到S观测节点集{y[d],d∈J (c)}。如下图所示

从(26)中,给出了估计传输信号的联合最大后验概率(MAP)检测规则

由于联合MAP检测不利于实际值N和M,我们考虑了c = 1,...,NM的逐符号MAP检测规则

在(27)中,我们假设所有的传输符号aj∈A都是等可能的,而在(28)中,我们假设y的分量是近似独立的,对于一个给定的x[c],由于H的稀疏性。为了求解(28)中近似的逐符号MAP检测,我们提出了一种具有线性复杂度的MP检测器。对于每个y[d],一个变量x[c]与其他干扰项隔离,然后将其近似为高斯噪声,其均值和方差易于计算。

在MP算法中,干扰项的均值和方差被用作从观测节点到变量节点的信息。.另一方面,从一个变量节点x[c]传递到观察节点y[d]d∈J (c)的消息是字母pc的概率质量函数(pmf)d=(aj)|质量函数|aj∈A}。MP算法描述见算法1。

MP算法中迭代i的步骤细节如下

A. 消息从观察节点y[d]传递到变量节点x[c]

干扰的平均μ(i)和方差(σ(i)可似建模为高斯随机变量ζ(i)dc,定义如下

可以计算为

以及

B.消息从变量节点x[c]传递到观察节点y[d]

C.更新决策

如果η(i)>η(i−1),则我们将传输符号的决定更新为

也就是说只有当当前迭代能够提供比上一次迭代更好的估计时,我们才会更新对传输符号的决策

D.停止判据

当至少满足以下条件之一时,MP算法停止。

我们选择来忽略η的小波动。在这里,第一个条件发生在最好的情况下,其中所有的符号都已经收敛。如果当前迭代提供了比以前迭代中的决策更糟糕的决策,那么第二个条件对于停止算法很有用

值得注意的是,该MP算法也适用于OFDM系统。

先前为OTFS开发的MP也可以用于OFDM符号检测。

由于(38)的形式类似于(26),以前为OTFS开发的MP也可以应用于OFDM符号检测。我们注意到Hofdm在对角线上占优势,当我们远离对角线项时,每一行的非对角线元素的值会在[20]中解释中衰减。因此,Hofdm矩阵也是稀疏的,可以使用所提出的低复杂度MP检测算法。

图中的黄色尖峰即为主对角项,其余幅度较低的是噪声干扰。

仿真结果如下图所示:

完整代码见主页

OTFS代码学习记录Ⅰ相关推荐

  1. DAB-Deformable-DETR代码学习记录之模型构建

    DAB-DETR的作者在Deformable-DETR基础上,将DAB-DETR的思想融入到了Deformable-DETR中,取得了不错的成绩.今天博主通过源码来学习下DAB-Deformable- ...

  2. ECCV2022细粒度图像检索SEMICON代码学习记录

    代码链接:GitHub - aassxun/SEMICON 环境配置 # 创建&激活虚拟环境 conda create -n semicon python==3.8.5 conda activ ...

  3. 深度学习+心脏医学图像分割——自动心脏诊断挑战赛(ACDC)项目的代码学习记录

    自己的研究方向是心脏AI相关(心脏MRI+深度学习这样子),最近在学习医学图像分割--自动心脏诊断挑战赛(ACDC)的代码: GitHub - baumgach/acdc_segmenter: Pub ...

  4. 【LVI-SAM代码学习记录】

    文章目录 目录 文章目录 前言 一.思路 二.LIO部分代码阅读 1.imagaProjection() 2.featureTracker() 3.imuPreintegration() 4.mapO ...

  5. Pytorch学习记录-torchtext和Pytorch的实例( 使用神经网络训练Seq2Seq代码)

    Pytorch学习记录-torchtext和Pytorch的实例1 0. PyTorch Seq2Seq项目介绍 1. 使用神经网络训练Seq2Seq 1.1 简介,对论文中公式的解读 1.2 数据预 ...

  6. 2021-01-22学习记录 || 通过二维数组初始化窗体并进行代码重构

    今天主要是通过二维数组将整个界面16个数字块展示出来,并为了下一步添加左移.右移功能创建子类MainFrame继承JFrame类并进行代码重构. 二维数组展示初始化界面 由于2048小游戏需要16个数 ...

  7. AMBA总线协议之AHB学习记录(1)—ahb_bus(附verilog代码)

    目录 0.前言 1.AHB简介 2.ahb_bus实现(verilog) 3.总结反思 & 后面学习计划 0.前言 前段时间粗略过了一下riscv指令集相关内容,并对开源项目tinyriscv ...

  8. Opencv+Python学习记录9:掩膜(掩码)的使用(内附详细代码)

    一,基本概念 OpenCV中的很多函数都会指定一个掩模,也被称为掩码,例如: 计算结果=cv2.add(参数1,参数2,掩模) 当使用掩模参数时,操作只会在掩模值为非空的像素点上执行,并将其他像素点的 ...

  9. VQA任务学习记录1(附数据使用代码记录)

    0.前言 最近需要学习处理VQA任务特此记录,这个主要是对论文bottom-up and top-down()和bilinear attention network()中的代码部分的学习记录,目前也并 ...

最新文章

  1. Matlab与线性代数 -- 全1矩阵
  2. Win2003配置邮件服务器
  3. Reactive框架:简化异步及事件驱动编程
  4. AndroidStudio更新时报错:Connection Error,Temp directory inside installation
  5. 史上最大,人工智能算法模型 GPT-3 问世,这意味着什么?
  6. tp3.2 执行原生sql
  7. 庆贺使用VS2017编译OpenJDK12成功!
  8. Pycharm解决plotly不显示离线网页的问题
  9. 谁在制造房价泡沫:土地供应下滑 居民杠杆上升
  10. android让字体左右对齐,Android 实现文字左右对齐
  11. 社区智能充电管理系统新能源汽车充电桩系统开发
  12. 电脑小鸟壁纸怎么彻底删除?
  13. 张柏芝谢霆锋喜得贵子
  14. 如何删除windows 10系统桌面的所有快捷图标
  15. 魔方教程一步一步图解(史上最简单的魔方入门教程)新手一看就会
  16. STM32中的RCC是什么意思
  17. Aescripts Bang for mac(AE三维枪口火焰特效插件)
  18. Docker精通:微服务
  19. 【毕业设计】基于stm32的智能水杯(恒温控制 饮水杯) - 单片机 物联网 嵌入式
  20. 华硕计算机用户名默认密码是多少,华硕路由器(ASUS)默认登录IP地址是多少

热门文章

  1. 无线倾角报警仪 NB-lot和lora无线倾角仪隧道监测预警
  2. 有这个 RESTED 插件,谁还用postman?哈哈
  3. JcJc 中文错别字在线检查服务
  4. mysql数据库中修改错别字_如何形成正确的MySQL连接字符串?[关闭]
  5. 51单片机串口打印函数
  6. 系统维护工具之Glary Utilities Pro 5.33 专业版|全能系统维护军刀
  7. A Blockchain-based Decentralized Federated Learning Framework wth Committee Consensus
  8. 使用轮询方式进行ADC转换(野火STM32 MINI开发板)
  9. c语言输入年月日输出星期几,基姆拉尔森计算公式 (根据输入的年月日输出星期几)...
  10. JDK1.5新特性--自动装箱与拆箱