原文:https://github.com/pencilCool/dspguide/blob/main/Ch8.pdf
摘要以及自己的解读
傅里叶分析是一系列数学技术,都是基于将信号分解为正弦波。
离散傅里叶变换(DFT)是用于数字化信号的家族成员。
这是关于实数DFT的四章中的第一章,实数DFT是离散傅里叶变换的一个版本,使用实数来表示输入和输出信号。
复数DFT是一种使用复数的更高级技术,将在第31章讨论。
在这一章中,我们研究了傅里叶分解的数学和算法,这是DFT的核心。
傅立叶变换家族
拉格朗日指出了傅立叶变换表换的缺陷,(变换不了不可导的函数)从而拒绝了 傅立叶变换的工作,后来证明傅立叶变换用处多多。
一个 理论有缺陷并不可怕,我们依然可以用它来解决问题。有些现象解释不了,只是我们的认识还不够深刻,不要轻视不完美的理论 。
不能完美契合,但能尽可能逼近
为什么要用cos ,sin 这样的波
一个信号可以有无数种方式被分解。分解的目的是为了最终得到比原始信号更容易处理的东西。
脉冲分解使得信号可以一次检查一个点,从而导致卷积的强大技术。
正弦波和余弦波的分量比原始信号更简单,因为它们有一个原始信号没有的特性:正弦保真度。
一个正弦波输入到一个系统中,可以保证产生一个正弦波的输出。
只有信号的振幅和相位可以改变,频率和波形必须保持不变。
正弦波是唯一具有这种有用特性的波形
傅里叶变换的分类
一般来说,傅里叶变换可以分成四类,由可能遇到的四种基本的信号类型产生。
一个信号可以是连续的或离散的,可以是周期性的或非周期性的。这两个特征的结合产生了四个类别
非周期性-连续的
这包括,例如,衰减的指数和高斯曲线。这些信号延伸到正负无穷大,没有周期性的重复。这种类型的信号的傅里叶变换被简单地称为傅里叶变换。
周期性-连续的
这里的例子包括:正弦波、方波,以及任何从负无穷到正无穷有规律地重复的波形。傅里叶变换的这一版本被称为傅里叶级数。
非周期性-离散性
这些信号只在正负无穷大之间的离散点定义,并且不以周期性方式重复。这种类型的傅里叶变换被称为离散时间傅里叶变换。
周期性-离散性
这些是离散的信号,以周期性的方式从负数到正无穷大重复。这类傅里叶变换有时被称为离散傅里叶数列,但最常被称为离散傅里叶变换。
这四类信号都延伸到正负无穷大。
等一下,你说! 如果你的计算机中只存储了有限数量的样本,比如说由1024个点形成的信号。
难道没有一个使用有限长度信号的傅里叶变换的版本吗?不,没有。
正弦和余弦波被定义为从负无穷延伸到正无穷。你不能用一组无限长的信号来合成有限长度的东西。
解决这个难题的方法是使有限的数据看起来像无限长的信号。这是通过想象信号在实际点的左边和右边有无限多的样本来实现的。
如果所有这些 "想象的 "样本的值都是零,那么信号看起来就是离散的、非周期性的,离散时间傅里叶变换也就适用。
作为一种选择,想象的样本可以是实际1024个点的重复。在这种情况下,信号看起来是离散的和周期性的,有1024个样本的周期。这就要求使用离散傅立叶变换。
事实证明,要合成一个非周期性的信号,需要无限多的正弦波。
这使得在计算机算法中不可能计算出离散时间傅里叶变换。
通过排除法,唯一能在DSP中使用的傅里叶变换类型是DFT。
换句话说,数字计算机只能处理离散的、长度有限的信息。当你纠结于理论问题,努力解决家庭作业问题,并思考数学奥秘时,你可能会发现自己在使用傅里叶变换家族的前三个成员。
当你坐在电脑前时,你将只使用DFT。我们将在以后的章节中简要介绍一下这些其他的傅里叶变换。现在,请集中精力理解离散傅立叶变换。
回顾一下图8-1中的DFT分解例子。从表面上看,它似乎是一个16点的信号被分解成18个正弦波,每个正弦波由16点组成。从更正式的角度来看,(a)中所示的16点信号必须被视为一个无限长的周期性信号的一个周期。同样,(b)中所示的18个正弦波中的每一个都代表了一个无限长的正弦波中的16点段。我们是把它看作由16点正弦波合成的16点信号,还是看作由无限长的正弦波合成的无限长的周期性信号,这真的很重要吗?答案是:通常不是,但有时是的。在接下来的章节中,我们会遇到DFT的一些特性,如果把信号看成是有限的,这些特性似乎令人费解,但如果考虑到周期性,这些特性就变得很明显了。需要理解的关键点是,这种周期性是为了使用一种数学工具,即DFT而调用的。就信号的来源或获取方式而言,它通常毫无意义。
四种傅里叶变换中的每一种都可以被细分为实数和复数版本。实数版本是最简单的,
使用普通数字和代数进行合成和分解。例如,图8-1是一个实数DFT的例子。四个傅里叶变换的复数版本则复杂得多,需要使用复数。这些数字是这样的。3+4j,其中j等于图像(电气工程师使用变量j,而数学家使用变量i)。复杂的数学很快就会让人不知所措,即使对那些专门从事DSP的人来说也是如此。事实上,本书的一个主要目标是在不使用复杂数学的情况下介绍DSP的基本原理,使更多的科学家和工程师能够理解这些材料。复杂的傅里叶变换是那些专门研究DSP的人的领域,他们愿意在数学的沼泽中沉沦。如果你有这样的倾向,第30-33章将带你到那里去。
数学术语变换在数字信号处理中被广泛使用,如:。傅里叶变换、拉普拉斯变换、Z变换、希尔伯特变换、离散余弦变换,等等。只是什么是变换?要回答这个问题,请记住什么是函数。函数是一种算法或程序,将一个值变为另一个值。例如,y = 2x + 1就是一个函数。你选择一些x的值,把它插入方程,然后跳出一个y的值。函数也可以把几个值变成一个单一的值,例如:y = 2a + 3b + 4c,其中a、b和c被改变成y。
变换是这种方式的直接延伸,允许输入和输出都有多个值。假设你有一个由100个样本组成的信号。如果你设计了一些方程、算法或程序来将这100个样本变成另100个样本,你就有了一个变换。如果你认为它足够有用,你完全有权利把你的名字附在它上面,向你的同事阐述它的优点。(如果你是18世纪的法国著名数学家,这样做效果最好。) 变换不限于任何特定的数据类型或数量。例如,你可能有100个离散数据样本作为输入,200个离散数据样本作为输出。同样地,你可能有一个连续信号的输入和一个连续信号的输出。混合信号也是允许的,离散输入和连续输出,反之亦然。简而言之,转换是任何固定的程序,它将一个数据块变为另一个数据块。让我们看看这如何适用于眼前的主题:离散傅里叶变换。
实数DFT的符号和格式
离散傅里叶变换将一个N点输入信号变为两个N/2+1点的输出信号。
输入信号包含被分解的信号,而两个输出信号包含正弦波和余弦波的分量(以我们即将讨论的方式缩放)的振幅。输入信号被说成是在时域。这是因为进入DFT的最常见的信号类型是由在固定时间间隔内的采样组成的。当然,任何类型的采样数据都可以被送入DFT,不管它是如何获得的。当你在傅里叶分析中看到 "时域 "一词时,它实际上可能指的是在一段时间内采集的样本,也可能是泛指正在分解的任何离散信号。术语 "频域 "用于描述正弦波和余弦波的振幅(包括我们承诺要解释的特殊缩放)。
图8-3 DFT术语。在时域,x[ ] 由N个从0到N-1的点组成。在频域中,DFT产生两个信号,实部,写为 Re X[ ],和虚部,写成。Im X[ ]。这些频域信号的长度为N/2+1点,从0到N/2。正向DFT从时域转换到频域,而反向DFT则从频域转换到时域。(注意:此图描述的是实数DFT。第31章讨论的复数DFT是将N个复数点变成另一组N个复数点)。
频域包含与时域完全相同的信息,只是形式不同。如果你知道一个域,你可以计算另一个域。给出时域信号,计算频域的过程被称为分解、分析、正向DFT,或者简单地说,DFT。如果你知道频域,时域的计算就叫做合成,或者反DFT。合成和分析都可以用方程形式和计算机算法表示。
虽然N可以是任何正整数,但通常选择2的幂,即128、256、512、1024,等等。这有两个原因。首先,数字数据存储使用二进制寻址,使二的幂成为自然的信号长度。其次,计算DFT的最有效的算法,快速傅里叶变换(FFT),通常在N是2的幂的情况下操作。通常情况下,N被选择在32和4096之间。在大多数情况下,样本从0到N-1,而不是1到N。
标准DSP符号使用小写字母来表示时域信号,如x[ ]、y[ ]和z[ ]。相应的大写字母用来表示它们的频域,即X[ ]、Y[ ]和Z[ ]。为了说明问题,假设一个N点的时域信号包含在x[ ]中。这个信号的频域被称为X[ ],由两部分组成,每一部分都是N/2+1个样本的阵列。这两部分被称为X[ ]的实部,写成。Re X[ ],和X[ ]的虚数部分,写成。Im X[ ]。Re X[ ]中的数值是余弦波的振幅,而Im X[ ]中的数值是正弦波的振幅(暂时不用担心缩放系数)。正如时域从x[0]到x[N-1]一样,频域信号从Re X[0]到Re X[N/2],以及从Im X[0]到Im X[N/2]。仔细研究这些符号;它们对理解DSP中的方程式至关重要。不幸的是,有些计算机语言并不区分小写和大写,这使得变量名称由个人程序员决定。本书中的程序使用数组XX[ ] 来保存时域信号,数组REX[ ] 和IMX[ ] 来保存频域信号。
实部和虚部的名称源于复数DFT,它们被用来区分实数和虚数。对于实数DFT来说,不需要这么复杂。在你读到第31章之前,只需认为 "实部 "是指余弦波振幅,而 "虚部 "是指正弦波振幅。不要让这些暗示性的名称误导你;这里的一切都使用普通数字。
同样,也不要被频域信号的长度所误导。在DSP文献中,经常可以看到这样的说法。"DFT将一个N点的时域信号变成一个N点的频域信号"。这是指复数DFT,其中每个 "点 "是一个复数(由实部和虚部组成)。现在,请专注于学习真实的DFT;困难的数学问题很快就会出现。
频域的独立变量
图8-4是一个N=128的DFT例子。时域信号包含在阵列中:x[0]到x[127]。频域信号包含在两个数组中。Re X[0]到Re X[64],以及Im X[0]到Im X[64]。注意,时域中的128个点对应于每个频域信号中的65个点,频率指数从0到64。也就是说,时域中的N个点对应于频域中的N/2+1个点(不是N/2个点)。忘记这个额外的点是DFT程序中一个常见的错误。
图8-4 DFT的例子。DFT将时域信号x[ ]转换为频域信号Re X[ ]和Im X[ ]。频域的横轴可以用三种方法之一来标记:(1)作为阵列索引,在0和N/2之间;(2)作为采样频率的分数,在0和0.5之间;(3)作为自然频率,在0和π之间。在这里的例子中,(b)使用第一种方法,而(c)使用第二种方法。
频域的横轴可以用四种不同的方法来参考,这些方法在DSP中都很常见。在第一种方法中,横轴被标记为从0到64,对应于阵列中的0到N/2个样本。当使用这种标记时,频域的索引是一个整数:例如,Re X[k]和Im X[k],其中k从0到N/2,步长为1。程序员喜欢这种方法,因为他们就是这样写代码的,用索引来访问数组位置。图8-4b中就使用了这种符号。
在(c)中使用的第二种方法中,横轴被标记为采样率的一个分数。这意味着横轴上的数值总是在0和0.5之间,因为离散数据只能包含直流和二分之一采样率之间的频率。这个符号使用的指数是f,代表频率。实部和虚部被写成。Re X[f]和Im X[f],其中f在0和0.5之间有N/2+1个等距的值。要从第一种符号k转换到第二种符号f,请将横轴除以N,也就是说,f=k/N。本书中的大多数图表都使用了这种第二种方法,强化了离散信号只包含采样率的0和0.5之间的频率。
第三种样式与第二种相似,只是横轴要乘以2π。这种标记使用的指数是ω,是希腊语小写的omega。在这种记号中,实部和虚部被写成。Re X[ω]和Im X[ω)],其中ω在0和π之间有N/2+1个等距的值。参数ω被称为自然频率,单位为弧度。这是基于一个圆里有2π个弧度的想法。数学家喜欢这种方法,因为它使方程更短。例如,考虑一下余弦波在前三种符号中的写法:使用k:c[n]=cos(2πkn/N),使用f:c[n]=cos(2πfn),以及使用ω:c[n]=cos((ωn)。
第四种方法是用特定应用中使用的模拟频率来标记横轴。例如,如果被检查的系统的采样率为10 kHz(即每秒10,000个样本),频域的图表将从0到5 kHz。这种方法的优点是以现实世界的意义来呈现频率数据。缺点是它与特定的采样率相联系,因此不适用于一般的DSP算法开发,如设计数字滤波器。
这四种符号在DSP中都有使用,你需要适应它们之间的转换。这包括图形和数学方程。要找到正在使用的符号,看一下自变量和它的取值范围。你应该找到四种符号之一:k(或其他整数指数),从0到N/2;f,从0到0.5;ω,从0到π;或用赫兹表示的频率,从直流到实际采样率的二分之一。
DFT基函数
DFT中使用的正弦和余弦波通常被称为DFT基函数。换句话说,DFT的输出是一组代表振幅的数字。基函数是一组振幅统一的正弦和余弦波。如果你把每个振幅(频域)分配给适当的正弦波或余弦波(基函数),结果就是一组经过缩放的正弦波和余弦波,可以加在一起形成时域信号。
DFT基函数的方程式。在这些方程中,ck[i]和sk[ ]是余弦波和正弦波,每一个长度为N点,从i = 0到N-1。参数,k,决定了波的频率。在一个N点DFT中,k的值在0和N/2之间。
其中:ck[ ]是Re X[k]中保持振幅的余弦波,sk[ ]是Im X[k]中保持振幅的正弦波。例如,图8-5显示了N=32点DFT中使用的17个正弦波和17个余弦波中的一些。由于这些正弦波相加形成输入信号,它们必须与输入信号的长度相同。在这种情况下,每个都有32个点,从i=0到31。参数k设定了每个正弦波的频率。特别是,c1[ ]是在N个点上做一个完整周期的余弦波,c5[ ]是在N个点上做五个完整周期的余弦波,等等。这是理解基函数的一个重要概念;频率参数k等于信号的N个点上出现的完整周期数。
DFT基函数是由方程式产生的。
图8-5 DFT基函数。一个32点的DFT有17个离散的余弦波和17个离散的正弦波作为其基础函数。本图中显示了其中的八个。这些都是离散的信号;这些图中显示的连续线只是为了帮助读者的眼睛跟踪波形。
让我们详细看看这些基函数中的几个。图(a)显示了余弦波c0[ ]。这是一个频率为零的余弦波,是一个1的常量值。这意味着Re X[0]持有时域信号中所有点的平均值。在电子学中,可以说Re X[0]保持直流偏移。频率为零的正弦波,s0[ ],如(b)所示,是一个由所有零组成的信号。由于这不能影响正在合成的时域信号,Im X[0]的值无关紧要,总是设置为零。稍后会有更多关于这方面的内容。
图(c)和(d)显示了c2[ ]和s2[ ],在N点中完成两个周期的正弦波。它们分别对应于Re X[2]和Im X[2]。同样,(e)和(f)显示了c10[ ]和s10[ ],在N个点上完成十个周期的正弦波。这些正弦波对应于Re X[10]和Im X[10]数组中的振幅。问题是,(e)和(f)中的样本看起来不再像正弦波和余弦波。如果这些图中没有连续的曲线,你甚至很难检测到波形的模式。这可能会让你有点不安,但不要担心。从数学的角度来看,这些样本确实形成了离散的正弦波,即使你的眼睛无法遵循这个模式。
基函数中的最高频率显示在(g)和(h)中。这些是cN/2[ ]和sN/2[ ],或者在这个例子中,c16[ ]和s16[ ]。离散的余弦波在1和-1之间交替变化,这可以解释为在峰值处对一个连续的正弦波进行采样。相比之下,离散正弦波包含所有的零,这是由于在零点交叉处取样造成的。这使得Im X[N/2]的值与Im X[0]相同,总是等于零,而且不影响时域信号的合成。
这里有一个难题:如果有N个样本进入DFT,有N+2个样本退出,那么额外的信息从何而来?答案是:其中两个输出样本不包含任何信息,使得其他N个样本完全独立。正如你可能已经猜到的,不含信息的点是Im X[0]和Im X[N/2],这些样本的值总是为零。
合成,计算逆向DFT
把到目前为止所说的一切拉到一起,我们可以写出综合方程式。
---- continue