| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 【算法】离散傅里叶变换(DFT) -> 正文阅读 |
|
[人工智能]【算法】离散傅里叶变换(DFT) |
一、离散系统离散控制系统是指在控制系统的一处或数处信号为脉冲序列或数码的系统。如果在系统中使用了采样开关,将连续信号转变为脉冲序列去控制系统,则称此系统为采样控制系统。如果在系统中采用了数字计算机或数字控制器,其信号是以数码形式传递的,则称此系统为数字控制系统。通常把采样控制系统和数字控制系统统称为离散控制系统。离散系统与连续系统相比,既有本质上的不同,又有分析研究方面的相似性。 1 信号的采样与保持采样器与保持器是离散系统的两个基本环节,为了定量研究离散系统,必须用数学方法对信号的采样过程和保持过程加以描述。 2 Z变换拉普拉斯变换是研究线性定常连续系统的基本数学工具,而z变换则是研究线性定常离散系统的基本数学工具。z变换是在离散信号拉普拉斯变换基础上,经过变量代换引申出来的一种变换方法。 二、傅里叶变换的局限性
三、离散时间傅立叶变换(DTFT)离散时间傅立叶变换(DTFT) 实际上真正用的是DFT,离散傅里叶变换。离散傅里叶变换可以将连续的频谱转化成离散的频谱去计算,这样就易于计算机编程实现傅里叶变换的计算。FFT算法的出现,使得DFT的计算速度更快。 离散时间极大地减少了记录信号所需的无数次测量。不是在每个时间点都测量信号,而是在其持续时间内仅测量信号有限的次数 三、离散傅里叶变换(DFT)参考:如何理解离散傅里叶变换DFT----实验数据说话 在 DTFT 中,我们仅在某些离散时间点对信号进行采样或测量。现在在 DFT 中,我们也只针对某些离散频率测试信号。这意味着我们将不得不放弃信号中可用的一些频率信息。理想情况下,我们只想放弃我们绝对需要的尽可能多的信息。换句话说,考虑到系统的处理和时间限制,我们希望 DFT 的频率分辨率尽可能大。两个相邻频率之间的步长大小反应了我们频率分辨率。
例如pwm信号是400kHz,则采样信号至少两倍于信号中最高频率的频率对其进行采样,为800kHz,每秒至少对声音信号进行 800,000 次(800kHz)采样。 回到上面的 DFT 产生的频率图,这次我在 100Hz 处画了一条黑线,被称为奈奎斯特频率的对称就点位于黑线所在的 100Hz 处。至于奈奎斯特频率后续可以专门出一篇文章来讲,另外还有混叠,随着降低采样频率,每秒测量信号的次数越来越少。因此,我们正在丢失越来越多的信号的信息。奈奎斯特频率始终是采样频率的一半,它越来越接近信号中的最高频率。在大约 30Hz 的采样率下,奈奎斯特频率会碰到 10Hz 的频率组,我们从信号中丢失了太多信息。结果,信号开始失真。这种失真称为混叠。
(
190
+
10
)
/
2
=
100
H
z
(190+10)/2=100Hz
(190+10)/2=100Hz
参考文献 四、窗函数与频谱泄露-STFT短时傅里叶变换参考:动手实践–窗函数与频谱泄漏
频谱泄漏:相同的信号显示出非常不同的频率响应。但是,这怎么可能?我们没有改变信号本身,我们只是缩短了每个块的长度。我们在第一张图中看到的峰值的频率分量已被压缩,它们的一些能量已经泄漏到相邻的频率中,这是频谱泄漏。 窗函数如何减少频谱泄漏: DFT 已经取消了这些变化,因为我们无法应对它们造成的无穷大。所以基本上,我们正在使用一个与傅里叶级数非常相似的工具,它只能对重复信号进行建模,来尝试对非重复信号进行建模。这就是为什么我特意选择一个重复信号来演示频谱泄漏现象的原因,对于重复信号,只有在正确的位置拆分它才知道真正发生了重复 当我尝试用余弦波重构整个信号时,以蓝色显示的重构信号不再类似于原始信号,事实上,重建信号成功模仿原始信号的唯一一次是在我们正在处理的实际块期间。这就是你在所选块Block1中看不到红色信号的原因,重建的信号覆盖了它。每个块之间的信号存在不连续性,正是这些不连续性导致了频谱泄漏。当信号试图快速重新调整到它认为它应该在下一个块开始的位置时,信号的一些能量正在泄漏到更高的频率中。 块之间的这种不连续性正是发明窗口函数要解决的问题。它们不能完全恢复原始信号的频率响应,但可以大大减少频谱泄漏到更高频率的分量。有许多不同类型的窗口函数,**但是,它们都有一个共同的目标,确保信号在块的开头和结尾处为零或几乎为零。**为了应用窗口,时域信号的每个点都乘以相应的窗口系数。因此,如果有块中的信号样本,还必须有窗口函数中的系数。让我们看几个例子。 Hann 窗函数以 奥地利气象学家Julius Ferdinand von Hann (1839 – 1921) 的名字命名。他发明了一种加权移动平均技术,用于结合邻近地区的气象数据。他的技术后来被Blackman 和 Tukey用来推导 Hann 窗口函数,如下图左图所示。 Hamming窗函数汉明窗函数是由Richard Hamming (1915 – 1998) 发明的。它的形状与汉窗相似,但有一个重要区别。汉明窗完全淡出信号,而汉明窗在块的开始和结束处留下一点信号 为什么块的开头和结尾处不能有零样本 Bartlett窗函数Bartlett 窗函数由英国统计学家Maurice Stevenson Bartlett(1910 – 2002) 发明,是一个三角形窗。 Tukey 窗函数Tukey 窗口函数以其发明者的名字命名:John Wilder Tukey(1915 – 2000)。我们已经在上面提到了 Tukey,因为他与 Blackman 一起开发了 Hann 窗口。这也不是我们最后一次见到他,与 James Cooley 一起,他发明了Cooley-Tukey FFT 算法 窗函数的应用:对于不同信号使用的最佳窗口函数的问题有点复杂,这取决于将信号 DFT 处理到频域后打算如何处理它。例如,如果想在上面讨论的频域中执行某些操作后恢复时域信号,那么汉明窗可能是最好的。 在将信号分解为 DFT 所需的块之前,加窗函数有助于调节信号。这是为了消除导致频谱泄漏的块之间的不连续性,一些信号的能量泄漏到更高的频率。这些不连续性是由 DFT 看到信号的方式产生的伪影。这是因为它与只能模拟重复信号的傅里叶级数相似。 所以现在,使用 DFT 和窗口函数,终于找到了一种对真实信号执行傅里叶变换的方法。但是,DFT 可能会占用大量处理器资源,尤其是在一个块中有大量样本的情况下。我们能做些什么来提高 DFT 的效率吗? 在接下来的文章中,将介绍快速傅里叶变换,记得点赞加关注哦! 五、FFT算法——(DFT)的加速参考:推导FFT算法的本质-单位圆求逆来加快算法。 分而治之是快速傅里叶变换 (FFT) 的核心。FFT 算法最初发表在 1965 年的一篇名为An Algorithm for the Machine Calculation of Complex Fourier Series 的论文中。它由 IBM 的研究员 James Cooley和普林斯顿大学的教授John Tukey编写。 首先考虑一个与傅里叶变换无关的简单问题。对于一个包含 16 个数字的列表,找出列表中最大的数字。 一般我们按顺序遍历,依次比较验证这16个数,哪个是最大的,根据列表的数量、以及最大数字所在实际位置,这个问题就变得比较繁琐了。 一种更快的方法是将问题分成越来越小的块,直到问题变得非常小,解决起来很简单,这就是“分而治之”的由来。因此,将 16 个值的列表分成 2 组,每组 8 个。上面列表中的前 8 个值将形成第一组,最后 8 个值将形成第二组,…然后再次分成 8 组,每组 2 个值。 DIVIDE:将样本分成样本总数一半的组,直到每组中只剩下一对样本 重复:不断重复第 2 和第 3 阶段,直到得出一个最终的答案 划分DFT并不能像上面数字比大小那样直接划分,但是对于周期为T余弦波和正弦波,所以计算DFT的时候,每隔一个周期T,两个点的复指数是相等的,只是信号值x(n)不同,所以我们只需保存第一个周期cos,sin值, DFT的x(k) 举个例子,下图就是一个周期为2π的余弦波,即时域每隔2π (相应的索引间隔为8),他们的值是相等的,这是第一个结论,可以帮组我们进行分组 另一个结论是随着我们增加余弦波的频率,也会出现周期性,注意目前只观察2个点,索引为0和8的位置(间隔为一个周期的点对)。 假定目前有一个样本点数为16的原始离散信号,如下图绿线,其中蓝线是余弦波,当前的傅里叶级数就是将信号值乘以对应的余弦波值再求累加。 随着频率的增加,0这个点是不变的,而8这个点的值一直在1到-1之间震荡,频谱增加2HZ之后回到原来的值为1。那么对于这个案例,其实就每间隔2hz,就是 0Hz、2Hz、4Hz、6Hz、8Hz 等这些频率中,组合0和8计算DFT的值是相等的。简而言之,每隔 2Hz,无需再次进行乘加运算。这样就可以简单地记住结果并在再次出现相同的点组合时再次使用它。 对于另外一个点组合4和12,也有如上规律,这一次,重复出现的值发生在 0Hz、4Hz、8Hz 等;简而言之,这个组合结果,每隔 4Hz重复一次,那么我们依次类推还有其他这样的两个点组合,正是通过这种重复利用前期的结果,可以节省计算次数,这也就是快速傅立叶变换快速的原因。 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 目前为止,已经通过分治算法,成功地将整个计算划分为很小的块,至于每个小块如何快速计算,需要参见下一章内容:蝴蝶操作 蝴蝶算法参考:彻底搞懂快速傅里叶变换FFT–蝴蝶操作 蝴蝶操作呢,就是一种联合计算方式,形状类似蝴蝶,运算过程也很简单就像你看到的这样,输入两个值x0和x8分别被重复调用来做运算,只有最下面乘以一个-1,我们分别得到2个结果记作a0,a1。这里的x0、x8分别就是信号索引0和8所对应的值。 旋转因子参考:彻底搞懂快速傅里叶变换FFT–旋转因子 算法输出参考: 算法输出 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/8 3:53:39- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |