文章目录
- 1 背景
- 2 DFT & 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)
从上述计算中可以总结出两点:
- 时域序列经过DFT后的第一个点 X[0] 等于原时域 x[n] 的累加
- 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(使用前将#替换为@)