XMU《计算方法》实验二 FFT

news/发布时间2024/5/19 21:54:51

实验二 FFT

一、MATLAB 代码

clear;N = 32; TIME = 5;X = linspace(-pi, pi, 33);
X = X(1 : 32);
A = X .^ 2 .* cos(X);for m = 0 : N-1w(m+1) = exp(1i * 2 * pi / 32 * m);
endi = 1;
while i < NB = A;for j = 0 : i*2 : N-1for k = 0 : i-1A(j + k + 1) = B(j / 2 + k + 1) + B(j / 2 + N / 2 + k + 1);A(j + k + i + 1) = (B(j / 2 + k + 1) - B(j / 2 + N / 2 + k + 1)) * w(1 + j / 2);endendi = i * 2;% A
endC = A;a = [];
b = [];
for k = 1 : 17a = [a, 1/16 * real((-1)^k * C(k))];b = [b, 1/16 * imag((-1)^k * C(k))];
enda, bx = [-pi : 0.01 : pi];
for k = 1 : length(x)y(k) = a(1)/2;
end
for k = 2 : 17y = y + cos((k-1) * x) * a(k) + sin((k-1) * x) *  b(k);
end
plot(x, y)hold on
yy = x .^ 2 .* cos(x);
plot(x, yy, 'r')legend('拟合图像', '原始函数')

二、运行结果

image-20230410235227602

image-20230410235245106

答案的三角插值多项式为 \(f(x) = \frac 12a_0 + \sum_{k=1}^{16} (a_i\cos(kx) + b_i\sin(kx))\),其中 \(a_0\) 对应程序中的 \(a(0)\)\(a_i = a(i+1), b_i = b(i+1)\)

三、傅里叶变换

傅里叶变换是一种将函数从时域转换到频域的数学工具。它通过计算不同频率成分的振幅和相位来表示一个函数,从而将一个时域信号转化为频域信号。很多在时域上不可分解的东西,转成频域后很容易过滤和识别。

在离散傅里叶变换的过程中,我们将时域信号的离散序列求得的频域序列。

比如卷积运算,在数字信号处理、模式识别等领域,很多时候我们都需要对于两个时域信号求卷积,而且通常我们需要求卷积的都是离散时域序列,朴素的卷积算法的时间复杂度是 \(\Theta(n^2)\)。通过时域卷积定理,我们有

\[F[f_1(x) * f_2(x)] = F[f_1(x)]\cdot F[f_2(x)] \]

进而可以将时域的卷积转化为频域的相乘,而通过快速傅里叶变换,可以在 \(\Theta(n\log n)\) 的时间复杂度中完成这个任务。

四、离散傅里叶变换(DFT)

假设我们有 \(f(x)\) 是一个以 \(2\pi\) 为周期的复函数,\(N\) 个等分点上的函数值:

\[y_i = f(x_i) \]

那么它的傅里叶逼近可以表示为

\[S(x) =\frac 12a_0 + \sum_{k=1}^{16} (a_i\cos(kx) + b_i\sin(kx))\\= \sum_{k=0}^{N-1} c_ke^{ikx} \]

其中

\[c_j = \frac 1N \sum_{k=0}^{N-1}y_ke^{-ijk\frac{2\pi}N}\\ y_j = \sum_{k=0}^{N-1}c_k e^{ik\frac{2\pi}Nj} \]

五、快速傅里叶变换(FFT)

我们假设 \(\omega_N = e^{i\frac{2\pi}N} = \cos\frac{2\pi}N + i\sin\frac{2\pi}N\)

DFT 本质上就是要计算 \(c_j = \sum_{k=0}^{N-1} x_kw_N^{jk}\)

对于 \(\omega_N\) 数组,我们可以将之看作将一个单位圆分为 \(N\) 等份,因此很显然 \(\omega_N\) 满足如下的一些性质:

\[\omega_N^j\omega_N^k = \omega_N^{j+k}\\ \omega_N^{jN+k} = \omega_N^k\\ \omega_N^{jk+N/2} = -\omega_N^{jk}\\ \omega_{jN}^{jk} = \omega_N^k \]

如果 \(N\)\(2\) 的倍数,那么我们可以将计算 \(c_j\) 的式子继续划分:

\[\begin{align*} c_j &= \sum_{k=0}^{N-1}x_k\omega_N^{jk}\\ &= \sum_{k=0}^{\frac N2 - 1} x_k\omega_N^{jk} + \sum_{k=0}^{\frac N2-1} x_{\frac N2 + k}\omega_N^{j(\frac N2 + k)}\\ &= \sum_{k=0}^{\frac N2 - 1} x_k\omega_N^{jk} + (-1)^j\sum_{k=0}^{\frac N2-1} x_{\frac N2 + k}\omega_N^{jk}\\ &= \sum_{k=0}^{\frac N2 - 1} (x_k +(-1)^j x_{\frac N2 + k})\omega_N^{jk} \end{align*} \]

对于 \(j\) 讨论其奇偶性可得,

\[c_{2j} = \sum_{k=0}^{\frac N2 - 1} (x_k + x_{\frac N2 + k})\omega_{\frac N2}^{jk}\\ c_{2j+1} = \sum_{k=0}^{\frac N2 - 1} (x_k - x_{\frac N2 + k})\omega_N^k\omega_{\frac N2}^{jk} \]

\(y_k = x_k + x_{\frac N2 + k}, y_{\frac N2 + k} = x_k - x_{\frac N2 + k}\)

则上式可化为

\[c_{2j} = \sum_{k=0}^{\frac N2 - 1} y_k\omega_{\frac N2}^{jk}\\ c_{2j+1} = \sum_{k=0}^{\frac N2 - 1} y_{\frac N2 +k}\omega_N^k\omega_{\frac N2}^{jk} \]

我们只需要反复使用这个公式,将计算的过程分治下去,当达到 \(N=1\) 时,我们就不需要继续递归了。

显然,如果我们的递归过程模拟正确,那么我们很容易就可以求出正确的离散傅里叶变换的结果。

六、\(f(x) = x^2\cos x\) 的三角插值多项式

我们如果需要计算 \(f(x) = x^2\cos x\) 的三角插值多项式,就是要计算出这个函数相关的 \(c_j\) 的值,然后通过如下方法,计算出其三角多项式。

\[\begin{align*} &\frac 1{16} c_j(-1)^j \\ =& \frac 1{16} c_j e^{-i\pi j}\\ =& \frac 1{16}\sum_{k=0}^{31} f_j[\cos j(-\pi + \frac 1{16}k) + i\sin j(-\pi + \frac 1{16}k)]\\ =& \frac 1{16}\sum_{k=0}^{31} f_j(\cos jy_k + i\sin jy_k) \end{align*} \]

\(a_j + ib_j = \frac 1{16} c_j(-1)^j\),得

\[a_j = Re[\frac 1{16} c_j(-1)^j]\\ b_j = Im[\frac 1{16} c_j(-1)^j] \]

即可得到 \(a_j\)\(b_j\) 的两个系数序列。

因为 \(16\) 次的三角插值多项式实际上需要 \(17\) 阶的序列,因此我们取了 \(32\) 个插值节点,只取结果的最高的 \(17\) 项。

七、理解和感悟

傅立叶变换是一种数学工具,用于将信号从时域转换到频域。它被广泛应用于信号处理、图像处理、音频处理等领域。通过傅立叶变换,我们可以将信号分解为不同频率的正弦波,从而更好地分析和理解信号的性质。

快速傅立叶变换是一种优化过的傅立叶变换算法,能够在较短的时间内计算出大量的离散傅立叶变换结果。相对于朴素的傅立叶变换算法,快速傅立叶变换具有更高的计算效率和更小的计算复杂度。它被广泛应用于信号处理、图像处理、音频处理、数据压缩等领域。

这是非常重要和强大的数学工具,傅立叶变换和快速傅立叶变换可以帮助我们更好地理解和分析信号、图像、音频等数据。同时,它们也为实际问题提供了有效的解决方案。这使得我们可以更好地探索和利用数据,推动科学和工程领域的发展。

通过学习傅立叶变换和快速傅立叶变换,我们还可以更好地了解数学在实际问题中的应用和价值。这种数学思维和方法的应用可以帮助我们更好地理解和处理现实世界中的问题,从而使我们的生活更加便捷和舒适。

傅立叶变换和快速傅立叶变换是非常重要和强大的数学工具,它们不仅可以帮助我们更好地理解和分析数据,还可以推动科学和工程领域的发展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.diaolansx.cn/news/37487346.html

如若内容造成侵权/违法违规/事实不符,请联系吊兰实现网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

XMU《计算机网络与通信》第四次实验报告

计算机网络 实验四 通信 这次实验的话,我的报告参考意义不大,毕竟这次实验的主要难点是完成那两个代码,但是我报告中没有任何对于代码的解释。 大家如果需要的话,我的两个代码可以在这里下载,仅供参考:点击下载。 一、个人信息 姓名:XXX 学号:XXXXXXXXXXXXXX 二、实验目…

华为NPU开发流程点滴

华为NPU开发流程点滴 NPU/CPU集成操作流程图介绍了App使用HUAWEI HiAI DDK的集成流程。IR在线模型构建 IR在线模型构建通过IR单算子根据原始模型中的关系级联,配置权重数据,构建IR模型网络。 离线模型转换 离线模型转换需要将Caffe、TensorFlow、ONNX、MindSpore模型转换为HU…

DSP学习笔记

DSP学习笔记 EPWM 1.结构框图2.代码分析 代码配置 //1.关时基时钟(配置前一定要这么做) SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; //2.初始化GPIO引脚(选择EPWM的输出IO口) InitEPwm2Gpio(); //3.设置同步输入脉冲触发条件(为了做后续的移相pwm控制) EPwm2Regs.TBCTL.bi…

检测硬盘读写速度

1. 在左下角搜索框输入“cmd”,并点击“以管理员身份运行”。 2. 输入命令“winsat disk -drive 盘符”,并点击“回车”。从上到下,分别是:✬ 随机读取速度: 179.36MB/s✬ 顺序读取速度: 414.64MB/s✬ 顺序写入速度: 208.79MB/s原文出处 https://baijiahao.baidu.com/s?i…

ICESat-2 从ATL08中获取ATL03分类结果

ICESat-2 ATL03数据和ATL08数据的分段距离不一致,ATL08在ATL03的基础上重新分段,并对分段内的数据做处理得到一系列的结果,详情见数据字典: ATL08 Product Data Dictionary (nsidc.org) ATL08使用DRAGANN算法对ATL03数据做了去噪处理,并使用分类算法对每个光子进行分类标志…

XSS漏洞靶场

XSS漏洞靶场 level1 查看网站源码,发现get传参name的值test插入到了html头里面,还回显payload长度插入js代码,get传参 ?name=<script>alert()</script>本关小结:JS弹窗函数alert() level2貌似不对,查看下源码闭合掉双引号 "> <script>alert()&…