如果你对信号处理感兴趣,说一天征服傅里叶有点夸张。当然,没有反覆实践和钻研数学,您无法在一天里学会傅立叶变换的方方面面。无论如何,这个在线课程将提供给您怎样进行傅立叶变换运算的基本知识。
能有效和能非常简单地领会的原因是我们使用了一种不太传统的逼近。重要的是你将学习傅立叶变换的要素而完全不用超过加法和乘法的数学计算!我将设法在不超过以下六节里解释在对音像信号处理中傅立叶变换的实际应用。
步骤1:一些简单的前提
在下面,您需要理解以下四件最基本的事情:加法,乘、除法。什么是正弦,余弦和正弦信号。明显地,我将跳第一二件事和将解释位最后一个。您大概还记得您在学校学过的“三角函数”[1],它神秘地用于与角度一起从它们的内角计算它们的边长,反之亦然。我们这里不需要所有这些事,我们只需要知道二个最重要的三角函数,"正弦"和"余弦"的外表特征。这相当简单:他们看起来象是以峰顶和谷组成的从观察点向左右无限伸展的非常简单的波浪。
步骤2:了解傅立叶定理
Jean-BaptisteJosephFourier是孩子们中让父母感到骄傲和惭愧的的一个,因为他十四岁时就开始对他们说非常复杂的数学用语。他的一生中做了很多重要工作,但最重大的发现可能是解决了材料热传导问题。他推导出了描述热在某一媒介中如何传导的公式,即用三角函数的无穷级数来解决这个问题(就是我们在上面讨论过的正弦、余弦函数)。主要和我们话题有关的是:傅里叶的发现总结成一般规律就是任意复杂的信号都能由一个个混合在一起的正弦函数的和来表示。这是一个例子:
在这里你看到的是一个原始的信号,以及如何按某一确定的关系(“配方”)混合在一起的正弦函数混合物(我们称它们为分量)所逼近。我们将简略地谈论一下那份配方。如你所知,我们用的正弦函数愈多其结果就愈精确地接近我们的原始信号波形。在“现实”世界中,在信号连续的地方,即你能以无穷小的间隔来测量它们,精度仅受你的测试设备限制,你需要无限多的正弦函数才能完美地建立任意一个给定的信号。幸运地是,和数字信号处理者们一样,我们不是生活在那样的世界。相反,我们将处理仅以有限精度每隔一定间隔被测量的现实世界的采样信号。因而,我们不需要无限多地正弦函数,我们只需要非常多。稍后我们也将讨论这个“非常多”是多少。目前重要的一点是你能够想象,任意一个在你计算机上的信号,都能用简单正弦波按配方组成。
步骤3:“非常多”是多少
正如我们所知道的,复杂形状的波形能由混合在一起的正弦波所建立。我们也许要问需要多少正弦波来构造任意一个在计算机上给定的信号。当然,倘若我们知道正在处理的信号是如何组成的,这可能至少是一个单个正弦波。在许多情况下,我们处理的现实世界的信号可能有非常复杂的结构,以至于我们不能深入知道实际上有多少“分量”波存在。在这种情况下,即使我们无法知道原始的信号是由多少个正弦波来构成的,肯定存在一个我们将需要多少正弦波的上限。尽管如此,这实际上没解决有多少的问题。让我们试着来直观地逼近它:假设一个信号我们有1000个样采,可能存在的最短周期正弦波(即多数波峰波谷在其中)以交替的波峰波谷分布在每个采样内。因此,最高频率的正弦波将有500个波峰和500个波谷在我们的1000个采样中,且每隔一个采样是波峰。下图中的黑点表示我们的采样,所以,最高频率的正弦波以看起来象这样:
现在让我们来看一下最低频率正弦波可能多么低。如果我们只给一个单独的采样点,我们将如何能测量穿过这点的正弦波的峰顶和谷我们做不到,因为有许多不同周期正弦波穿过这点。
所以,一个单独数据点不足以告诉我们关于频率的任何事。现在,如果我们有两个采样,那么穿过这两点的正弦波的最低频率是什么?在这种情况下它很常简单。只有一个穿过这两点的非常低频率的正弦波。它看起来向这样:
在,如果我们算一下要多少正弦波以那种方法装配我们的1000个采样,就会发现我们精确地需要1000个正弦波叠加起来表示1000个采样。实际上,我们总是发现我们需要和采样一样多的正弦波。
步骤4关于烹饪食谱
在前面的段落我们看到,任一个给定的在计算机上的信号能被正弦波混合物来构造。我们考虑了他们的频率,并且考虑了需要多大的最低和最高频率的正弦波来完美地重建任一个我们所分析信号。我们明白了为确定所需最低的正弦波分量,我们考察的采样的数量是重要,但我们还未论述实际正弦波如何必需被混合产生某一确定的结果。由叠加正弦波组成任何指定的信号,我们需要测量他们的另外一个方面。实际上,频率不是我们需要知道的唯一的事。我们还需要知道正弦波的幅度,也就是说每个正弦波幅度有多高才能混合在一起产生我们需要的输入信号。高度是正弦波的峰顶的高度,意即峰顶和零线之间距离。幅度赿高,我们听到的声音也就赿大。所以,如果您有一个含有许多低音的信号,无疑可以预期混合体中的低频率正弦波的分量比例比高频正弦波分量更大。因此一般情况下,低音中的低频正弦波有一个比高频正弦波更高的幅度。在我们的分析中,我们将需要确定各个分量正弦波的幅度以完成我们的配方。
步骤5:关于苹果和桔子
如果你一直跟着我,我们几乎完成了通向傅里叶变换的旅程。我们学了需要多少正弦波,它的数量依赖于我们查看的采样的数量有一个频率上下限界,并且不知道怎么确定单个分量的幅度以完成我们的配方。我们一直不清楚究竟如何从我们的采样来确定实际的配方。直观上我们可以断定能找到正弦波的幅度,设法把一个已知频率正弦波和采样作对比,我们测量找出它们有多么接近。如果它们精确地相等,我们知道该正弦波存在着相同的幅度,如果我们发现我们的信号与参考正弦波一点也不匹配,我们将认为这个不存在。尽管如此,我们如何高效地把一个已知的正弦波同采样信号进行比较?幸运地是,数字信号处理工作者早已解决了如何作这些。事实上,这象加法和乘法一样容易-我们取一个已知频率的单位正弦波(这意味着它的振幅是1,可从我们的计算器或计算机中精确地获得)和我们的信号采样相乘。累加乘积之后,我们将得到我们正在观测的这个频率上正弦波分量的幅度。
这是个举例,一个简单的完成这些工作的C代码片段:
从正弦变换到傅里叶变换的步骤是简单的,只需用更一般的方法。在正弦变换中对每个频率上的测度使用正弦波,在傅里叶变换中正弦、余弦波二者都使用。就是说,对任意的当前频率,我们以同一频率的正弦和余弦波来“比较”(或“共振”)被测信号。如果我们的信号看起来很象正弦波,变换的正弦部份将有一个大的幅值。如果它看起来象余弦波,变换的余弦部份将有一个大的幅值。如果看起来象反相的正弦波,也就是说,它开始于0但下降至-1取代上升至1,它的正弦部份将有一个大的负幅值。这表明用+、-符号和正弦、余弦相位能表示任意给定频率的正弦信号[2]。
Listing1.2:ThedirectrealizationoftheDiscreteFourierTransform[3]:#defineM_PI3.14159265358979323846longbin,k;doublearg,sign=-1.;/*sign=-1->FFT,1->iFFT*/for(bin=0;bin<=transformLength/2;bin++){cosPart[bin]=(sinPart[bin]=0.);for(k=0;k