利用卷积定理进行信道估计 + 深入探究 DFT 与 matlab 中的 fft 用法

2023-05-16

文章目录

  • 1 背景
  • 2 DFT & FFT 公式级别解析
    • 2.1 DFT / IDFT
    • 2.2 FFT
  • 3 利用卷积定理进行信道估计

1 背景

最近尝试用时域卷积定理来进行信道估计

假设 TX信号为 s(t),信道脉冲响应(CIR)为 h(t),那么RX信号 y(t) = s(t) * h(t)
根据时域卷积定理,时域卷积的傅里叶变换,等于各自傅里叶变换的乘积
因此,在已知 s(t) 和 y(t) 的前提下, 可以通过 Y(f) / S(f) 来获得 H(f),然后再进行傅里叶逆变换,就可以得到 h(t)

用matlab来完成以上过程时,会有一个疑问
假设 s(t)的长度为 m, h(t)的长度为n, 那么卷积之后 y(t)的长度为 m+n-1
在matlab中,使用 fft 函数来进行离散傅里叶变换,使用 ifft 函数来进行傅里叶反变换。因为傅里叶变换是不改变序列长度的,所以如果按原序列长度进行 n 点 FFT变换,最后S(f)长度为m, Y(f)长度为m+n-1,两个不一样长度的序列要如何进行除法操作呢?

为了解决长度问题,需要对短的那一个序列进行补零操作,在matlab中使用 fft(X, n),X就是准备进行FFT的时域序列,n代表进行n点傅里叶变换,如果n大于X的长度,那么X就在末尾补零,如果n小于X的长度,那么就将X截断。
那么我们只需要通过

fft(s(t), m-n-1)

就可以弥补长度差距,做个小实验,确实如此
在这里插入图片描述
在这里插入图片描述

2 DFT & FFT 公式级别解析

2.1 DFT / IDFT

在这里为了方便实验,定义一个序列 st = [1, 2, ,3 ,4]

首先来看 DFT 的公式
请添加图片描述
请添加图片描述
验证一下

st = [1, 2, 3, 4];
fft(st)

在这里插入图片描述
从上述计算中可以总结出两点:

  1. 时域序列经过DFT后的第一个点 X[0] 等于原时域 x[n] 的累加
  2. X[K] 的每一个值实际上都是 x[n] 所有值的线性组合,且系数都是基于算子W,本质是原时域序列的加权求和

搞懂了DFT,接下来再来看 IDFT公式

在这里插入图片描述
验证一下

st = [1, 2, 3, 4];
sf = fft(st)
st2 = ifft(sf)

在这里插入图片描述
至此,通过一个简单的例子,证明了 DFT 与 IDFT 的正确性,以及matlab中 fft 和 ifft 这两个函数的可靠性

2.2 FFT

FFT通过蝶形算法来进行计算

蝶形算法的本质是将DFT点数不停对半拆分,然后利用计算机并行计算

一般数字信号处理的教科书上都会介绍蝶形算法

用 DIT-FFT流图计算st的过程如下所示:
请添加图片描述
在 matlab中,一般会使用 fftshift 来搭配 fft 使用

fftshift的作用是将 sf 左右交换,比如 sf = [1, 2, 3, 4],那么交换后 sf = [3, 4, 1, 2];如果 sf = [1, 2, ,3, 4, 5],那么交换后 sf = [4, 5, 1, 2, 3]

我们将 sf[0] 这个位置成为零频,fftshift的作用就是将零频移到频谱中心,为什么这么做?我目前的理解就是为了方便观察。
作了 fft 之后的序列除了零频处外是左右共轭对称的,且左边的虚部一般为正,右边虚部一般为负。
举个例子,假设 st = [1, 2, ,3 ,4, 5],其fft结果为 sf = [15.0000 + 0.0000i, -2.5000 + 3.4410i, -2.5000 + 0.8123i , -2.5000 - 0.8123i, -2.5000 - 3.4410i], 其频谱为
在这里插入图片描述
使用了 fftshift之后,其频谱为:
在这里插入图片描述

3 利用卷积定理进行信道估计

在第一章中,阐述了此方法的原理,那么真的有用吗,做个实验验证一下

v = [2.55, 7.38,     4.9,     9.9, 8.64, 8.9123, 5, 6, 7];
h = [1.2,  0.0008, 1.234];
u = conv(v, h);

maxLen = max([length(v), length(u)]); % 补零,统一长度
vf = fft(v, maxLen);
uf = fft(u, maxLen);
hf = uf ./ vf;
est_h_rough = real(fftshift(ifft(hf)));
disp(['est_h_rough: ', num2str(est_h_rough)]);
est_h = est_h_rough(floor(length(est_h_rough) / 2 + 1):end);
disp(['est_h: ', num2str(est_h)]);

结果为
est_h_rough:
在这里插入图片描述
est_h:
在这里插入图片描述
est_h就是最终的信道估计结果
如果事先知道 h 的长度为3,那么提取前三个,就和原h一摸一样了
但是在真实信道中,我们往往不知道h有多长,那就把剩下的尾巴带着,反正并不影响使用

为什么这么巧,正好在这些位置就是原h的值?目前还不知道,但是按照第2章的方法来分析一定能从细节上搞懂,只是太耗时了,知道可以这么做就行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用卷积定理进行信道估计 + 深入探究 DFT 与 matlab 中的 fft 用法 的相关文章

  • 三维点沿指定向量方向到平面的距离计算方法及C++代码实现

    设平面外一点为P p1 p2 p3 xff0c 指定的方向向量为d 61 d1 d2 d3 xff0c 平面Q方程为Ax 43 By 43 Cz 61 D xff0c 设系数ABC已经归一化 xff0c 则其法向量为n 61 A B C 则
  • ubuntu使用proxychains给终端设置代理

    有时 xff0c 我们需要下载一些国外网站上的东西 xff0c 如果用国内网络直接下载的话 xff0c 往往是连接不上的 或者有时下载一个东西速度很慢 xff0c 这都是因为国内网络限制的问题 xff0c 大大影响了我们的工作效率 解决方法
  • int为什么占4个字节?一个字节为什么是8位?

    不知道大家有没有思考过这样的问题 xff0c 一个字节为什么是8位呀 xff0c 也许还有小伙伴不知道我说的这些是什么 xff0c 没关系往下看 第一个解释 xff08 历史 xff09 是IBM为System 360设计了一套8位EBCD
  • K8S之kubectl命令详解及示例

    目录 1 查看类命令 2 操作类命令 3 进阶命令操作 4 kubectl replace 重启pod的四种方法 5 kubectl语法 1 查看类命令 获取节点和服务版本信息 kubectl get nodes 获取节点和服务版本信息 x
  • ROS运动规划学习五---global_planner

    文章目录 前言一 global planner功能包结构二 planner core1 执行过程2 calculatePotentials 3 getPlanFromPotential 总结 前言 本节将学习ROS中的全局规划期global
  • ROS自定义消息---发布数组和整型数据

    ROS自定义消息 数组和整型数据 前言一 ROS中的消息数据格式二 自定义话题消息1 新建msg文件2 编写发布者和接收者程序 总结 前言 ROS自带的消息格式已经包含一维数组 xff0c 有时候我们需要定义多维数组 xff0c 以及混合数
  • Markdown中的公式、字母表示汇总

    Markdown中的公式 字母表示汇总 1 常用希腊字母表2 数学公式 最近几个月打了很多Markdown公式 xff0c 隔一段时间就会忘一些表示方式 xff0c 还不如在这里慢慢汇总记录 xff0c 以后要用的时候来查就行了 xff01
  • CMake项目中神器:CMakeLists.txt

    首次接触 CMake xff0c 见识了 CMakeLists txt 的强大后 xff0c 赶紧整理出来分享一下 参考资料 xff1a Cmake 3 6 W3Cschool参考手册 本文讲述了一个 CMake 项目 xff0c 在从单文
  • TCP详解之拥塞控制

    概述 TCP模块还有一个重要任务 xff0c 就是提高网络利用率 xff0c 降低丢包率 xff0c 并保证网络资源对每条数据流的公平性 xff0c 这就是所谓的拥塞控制 拥塞控制的四个部分 xff1a 慢启动 拥塞避免 快速重传 快速恢复
  • frps搭建自己的内网穿透服务器

    frps搭建自己的内网穿透服务器 开发过程中 xff0c 很多时候我们需要用到内网穿透 xff0c 将自己的服务器映射到外网 xff0c 下面说一下怎么用frps搭建自己的内网穿透服务器 frps Github地址 里面有中文文档 xff0
  • 更换backbone心得

    1 对于目标检测 xff0c backbone相当于连接中间环节 xff0c 连接着图片输入和后面的检测头 xff0c 所以在更换网络时候只要注意输入backbone的数据形式以及后面一个环节要求输入的形式 xff0c 把backbone的
  • from torch._C import *ImportError: DLL load failed while importing _C: 找不到指定的模块。

    更新torch的版本 xff0c 原先是1 4 0出现这个问题 xff0c 更新到1 11 0后解决 pip install torch 61 61 1 11 0 43 cpu torchvision 61 61 0 12 0 43 cpu
  • 模型衡量标准recall precision accuracy f1score(hmean)

    问题背景 xff1a 在处理分类问题时 xff0c 会遇到一种情况 xff1a 假设一个二元分类问题 xff1a 假设我们的预测算法是 xff1a xff0c 这个算法忽略特征值 xff0c 不管任何情况下都是预测等于0 毫无疑问这是一个糟
  • layoutlmV3使用步骤

    1 layoutlm系列的预训练权重全都是放在huggingface上面 xff0c 安装官方教程如果下载失败 xff0c 可以在linux系统下载 xff0c 然后将下载的缓存文件保存 或者在官网上下载并保存 需要下载的文件如下图 2 将
  • Python引用路径

    0 官方建议 xff0c 总是优先使用绝对引用 xff0c 只有在引用路径较为复杂导致引用代码很长时 xff0c 才考虑使用相对引用 绝对引用 优点是清晰且直接 xff0c 可以很容易就确定引用文件位置 xff1b 且即使当前文件的位置发生
  • 关于batch normalization的理解

    套餐 xff1a 卷积 43 BN 43 激活 xff0c 原始的BN0 61 X E X std xff0c 减去均值除以标准差 xff0c 改进后的BN 61 BN0 43 xff0c 其中 和 是通过模型学习得到的 原因 xff1a
  • 基于tablemaster的表格检测与表格重构。

    1 结果展示 原图1 原图1的结果 原图2 原图2的结果
  • 【文献笔记】【精读】MobileNet V1

    文章目录 1 论文结构2 研究的问题3 文献综述3 1 当前 xff08 2017 xff09 已有的DNN的问题3 2 当前已有的网络轻量化的方法 4 MobileNet 简介4 1 本网络创新点4 2 本网络优点 5 MobileNet
  • 【知识点】神经网络输入归一化区别:[0, 1]和[-1, 1]

    1 前置知识 1 1 ReLU的单侧抑制 参考 xff1a RELU的单侧抑制 单侧抑制含义 xff1a relu的曲线是一个折线 xff0c 在小于0的部分一直为0 xff0c 而在大于0的部分是一条斜率为1的直线 单侧抑制的优点 xff
  • 【知识点】机器学习降维方法

    摘抄文章 xff1a 打破 维度的诅咒 xff0c 机器学习降维大法好 为什么数据需要降维 机器模型用来帮忙预测一个目标变量 xff0c 但是不一定输入图像的每一个特征都对应目标变量 xff0c 这会使模型变得复杂 这里所说的降维的纬度 x

随机推荐