数字信号处理1:完全掌握Matlab中的FFT
大三下半学期的时候我学习了数字信号处理这门课程,理论部分的新内容实际上并不多,基本都是继承自信号与系统这门课,但是令人迷惑的地方也还真是不少,尤其是从连续变换到离散,很多特性都有了很大的变化,我基本上学完之后还是处于比较迷糊的状态,所以就慢慢通过仿真梳理一下里面的难点,争取让自己理解的更深入。
今天先来谈一谈傅里叶变换,主要从仿真切入。这篇博客的前置知识是DFT(IDFT)、FFT(IFFT)的一些最基本的概念,主要取材于 Wireless Communication Systems in MATLAB 这本书。
一、基本公式
离散傅里叶变换中有两个最基本的公式,一个是 DFT ,另一个是 IDFT。考虑长度为 N 的时域复信号 x[n],它通过 N 点的 DFT 就可以变成长度为 N 的频域复信号 X[k],反过来从频域变换到时域就是 IDFT 了。 具体的公式如下:
Matlab 中采用 FFT 来实现 DFT,FFT 是 DFT 的快速算法,从数学本质上和 DFT 是没有什么区别的。
二、从时域计算频域波形
仿真中一开始让我比较迷惑的是索引,下面这张图非常清楚的说明了索引的对应问题。
从时域转换到频域, 代表直流分量,紧接着的 个点代表的是正频率分量,接下来的 个点代表的是负频率分量。具体详细的分析通过下面的一个示例给出:
这是一个余弦函数 ,持续时间 2 秒,采样频率 320 Hz。因此上面的这张图中存在采样点 640 个,也就是 。下面进行 FFT,需要注意的是,如果输入的时域信号是一个非周期信号,那么 FFT 的长度需要不小于时域信号的长度,但是如果时域信号是一个周期信号,那么 FFT 的长度只需要比该周期信号的一个周期长即可。
FFT 的计算结果横轴是以 k 作为单位的,但我们需要得到频率值,因此这里存在一步转化,这也就是第一张图中的 部分,其中 表示采样频率,N 表示 FFT 的大小。在这个例子中
这个余弦函数的频率是 10Hz,因此如果索引从 0 开始,那么该函数索引应该位于 10/1.25 = 8,但是 Matlab 的索引是从 1 开始,因此在上面的图中该函数的频率索引位于 9 。按照上述公式的对应关系可以将索引转换到 Hz,可以在下面的图中看到,频域用 Hz 来表示确实是 10Hz。
我们在信号与系统中学到的 的频域图像应该是关于纵坐标轴对称的,因此需要将负频域部分搬移到横坐标轴的负半轴,在 Matlab 中采用 fftshift 就可以实现。
需要注意的是在完成频谱搬移后真实频率(以Hz为单位)的计算,下面默认 N 是偶数,如果 N 是奇数,那取 。
三、获得 FFT 后频域的幅值以及相位信息
由于是对复信号进行 FFT,因此在显示幅值的时候要取绝对值。同时注意使用 Matlab 进行 FFT 后,要乘以 1/N 才能得到和一开始的公式相同的幅值。
上图的结果和理论是一样的,但是在仿真的过程中有一个细节: FFT 计算完的结果有的地方应该是 0 ,但是由于浮点数的运算误差所以最终是一个非常小的数,因此就需要先做一个预处理,将应该是 0 的地方先置位为 0。
四、从频域重建时域信号
从频域重建时域信号是比较简单的,在 Matlab 中直接采用 ifft 即可。但是这里也有几个细节需要注意:如果之前进行过 fftshift,现在就要进行 ifftshift 把负频域搬回正半轴,如果之前乘过 1/N,现在就要乘上 N(要和之前进行 FFT 变换的 N 保持相同)。一定要注意重建信号的时间计算,具体看代码附录即可。
程序也附在下面:
下面对这篇文章中没有提到的一些重要问题进行了进一步的说明:hal3515:数字信号处理1:完全掌握Matlab中的FFT(补充)
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/96599.html