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

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章的方法来分析一定能从细节上搞懂,只是太耗时了,知道可以这么做就行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值