↓点击上面的“电子工程图册”即可轻松关注
如果你对信号处理感兴趣,那么说有一天征服了傅里叶就有点言过其实了。当然,如果不反复练习和钻研数学,你不可能在一天之内学会傅里叶变换的所有方面。本文将为您提供如何进行傅里叶变换运算的基本知识。
我们之所以能够有效且非常简单地理解它,是因为我们使用了一种不太传统的近似方法。重要的是,你在学习傅里叶变换的元素时,根本不会超出加法和乘法的数学计算!我将在不超过以下六个部分中尝试解释傅立叶变换在视听信号处理中的实际应用。
第一步:一些简单的前提
下面,你需要了解以下四个基本的东西:加法、乘法、除法。正弦、余弦、正弦信号是什么?显然,我会跳过前两件事,解释最后一件。你大概还记得你在学校学的“三角函数”[1],它神秘地被用来从它们的内角和角一起计算它们的边长,反之亦然。这里不需要这些东西,我们只需要知道两个最重要的三角函数“正弦”和“余弦”的外观特征。很简单:它们看起来像是由波峰和波谷组成的非常简单的波浪,从观测点向左右无限延伸。
最高频率正弦波(附图4)
现在我们来看看最低频率正弦波可能有多低。如果只给单个采样点,如何测量正弦波通过该点的波峰和波谷?我们做不到,因为有很多不同周期的正弦波通过这个点。
所以单个数据点不足以告诉我们任何关于频率的东西。现在,如果我们有两个样本,正弦波通过这两点的最低频率是多少?这种情况下,往往很简单。只有一个频率很低的正弦波通过这两点。看起来是这样的:
最低频率正弦波(附图6)
想象一下最左边的两点是两个钉子,中间有一根弦穿过(图6因为正弦波的周期性描述了三个数据点,但我们实际上只需要最左边的两点来解释它的频率)。我们能理解的最低频率是弦在两个钉子之间来回摆动,如图6中左边两点之间的正弦波所做的那样。如果我们有1000个样本,那么两个“钉子”就相当于第一个或最后一个样本,比如1号样本和1000号样本。从乐器的经验来看,我们知道当长度增加时,弦的频率就会降低。所以我们可以想象,当我们把两个钉子互相移开时,最小正弦波的频率会变低。比如我们选择2000个样本,因为我们的“钉子”在1号和2000号样本之间,最低的正弦波会低一些。其实会低一倍,因为我们的指甲距离是1000个样本的两倍。这样,如果我们有更多的样本,我们就能够分辨出一个频率较低的正弦波,因为它们的过零点(我们的“钉子”)会移动得更远。这对于理解下面的解释非常重要。
我们可以看到,在两个“钉子”之后,我们的波形开始重复上升的斜率(第一个钉子和第三个钉子一样)。这意味着任何两个相邻的钉恰好包含一个完整正弦波的一半,换句话说,一个波峰或波谷或半个周期。
综上所述,我们知道一个采样的正弦波的上限频率是所有其他有峰有谷的样本,低频的下限是正好匹配样本数的正弦波周期的一半。但是等一下,这是不是太难了,不能说明上频固定,下频多了就可以降低?确实如此!因此,我们将从低频添加更多的正弦波,以形成内容未知的长信号。
一切都很清楚,但我们还是不知道最终需要多少正弦波。就像我们现在知道任何正弦波分量都可以有上、下两个频率一样,我们可以计算出这两个极限之间什么是合适的。既然我们已经沿着最左边到最右边的采样固定了最低的正弦波分量,那么我们希望所有其他正弦波都使用这些钉子(为什么我们要区别对待它们?所有正弦波都是均等产生的!)。假设正弦波束是绑在吉他上两个固定点的弦。它们只能在两个钉子之间摆动(除非断了),就像我们下图中的正弦波。这就产生了以下关系:我们最低的组件(1)在1/2周期内组装,第二个组件(2)在1周期内组装,第三个组件在1 1/2周期内组装,以此类推,直到我们看到1000个样本。生动地看起来是这样的:
现在,如果我们计算以这种方式组装我们的1000个样本需要多少正弦波,我们会发现我们正好需要1000个正弦波来表示1000个样本。事实上,我们总是发现我们需要多少正弦波就需要多少正弦波。
烹饪食谱
正如我们在上一段中看到的,计算机上的任何给定信号都可以由正弦波的混合构成。我们考虑它们的频率,以及需要多少具有最低和最高频率的正弦波来完美重建我们分析的任何信号。我们知道,为了确定所需的最小正弦波分量,我们检查的样本数量很重要,但我们没有讨论实际正弦波必须如何混合才能产生特定的结果。对于任何由叠加正弦波组成的给定信号,我们需要测量它们的另一个方面。其实频率不是我们唯一需要知道的。我们还需要知道正弦波的幅度,也就是说每个正弦波的幅度有多高才能混合在一起产生我们需要的输入信号。高度是正弦波峰值的高度,是指峰值到零线的距离。振幅越高,我们听到的声音越大。所以,如果你有一个低音很多的信号,你无疑可以期待低频正弦波在混音中的分量比大于高频正弦波。因此,一般来说,低音中的低频正弦波比高频正弦波具有更高的振幅。在我们的分析中,我们需要确定每个分量正弦波的幅度,以完成我们的公式。
第五步:关于苹果和橘子
如果你一直跟着我,我们几乎完成了傅里叶变换的旅程。我们了解了需要多少正弦波。正弦波的数量取决于我们观察的样本数量。有一个频率上下限,我们不知道如何确定单个分量的幅度来完成我们的公式。我们不知道如何从我们的样品中确定实际的配方。直观上我们可以得出这样的结论:我们可以找到正弦波的振幅,尝试将一个已知频率的正弦波与样本进行比较,通过测量发现它们有多接近。如果它们完全相等,我们就知道正弦波有相同的振幅。如果我们发现我们的信号和参考正弦波完全不匹配,我们就会认为这个不存在。然而,我们如何有效地将已知正弦波与采样信号进行比较?幸运的是,数字信号处理器的作者已经解决了如何做到这一点。其实就像加法和乘法一样简单——我们取一个已知频率的单位正弦波(也就是说它的幅值是1,可以从我们的计算器或者计算机中精确地得到)乘以我们的信号样本。累加乘积后,我们将得到我们正在观察的频率下正弦波分量的幅度。
这是一个例子,一个简单的C代码片段来完成这些任务:
清单1.1:离散正弦变换的直接实现:
定义M _ PI 3。58860 . 88888888861
龙斌,k;
双arg
for(bin = 0;bin <。transformLengthbin++) {
transformData[bin] = 0。;
for(k = 0;k <。transformLengthk++) {
arg =(float)bin * M _ PI *(float)k/(float)transform length;
transformData[bin]+= Inputdata[k]* sin(arg);
}
}
此代码转换存储在输入数据[0...变换长度-1],我们测量的采样点成为正弦波分量的振幅队列,变换数据[0...变换长度-1]。根据一般术语,我们称之为参考正弦波箱的频率步长,
这意味着它们被视为一个容器,我们在其中放置我们估计的任何分量波的振幅。离散正弦变换(DST)是一种常见的程序,它假设我们不能想象我们的信号是什么样子,否则我们可以用一种更有效的方法来确定正弦波分量的幅度(例如,我们预先知道我们的信号是一个已知频率的正弦波。我们不需要计算正弦波的整个范围就可以直接求出它的高度。这种有效近似的实现是基于傅立叶原理,可以在文献中的Goe rtzel算法项下找到。
以上是我们为什么用这种方法计算正弦变换的解释,你坚持的。我们之所以用一个已知频率的正弦波的乘积来做一个非常直观的近似,是因为我们可以想象,这大致相当于系统中出现一个具有自然频率的“共振”时,在物理世界中所发生的情况。项sin(arg)本质上是由输入信号波形激励的谐振器。如果输入(信号)在我们观察的频率上有一个分量,它的输出将是参考正弦波谐振的幅度。因为我们的参考波是单位幅度的,所以输出是该频率下分量实际幅度的直接测量。因为谐振器只是一个简单的滤波器,所以变换(无论是在稍微宽松的条件下)被认为具有非常窄的带通滤波器组的特性,该滤波器组位于我们估计的频率中心周围。这有助于解释傅立叶变换为信号滤波提供了一个有效的工具。
只是为了完整性:当然,上面的程序是可逆的。当我们知道它的正弦波分量时,我们的信号(在数字精度的限度内)可以通过简单地将正弦波相加而完全重构出来。这是留给读者的一个练习。同样,程序可以改变使用余弦波作为基本函数——我们只需要把sin(arg)条件改为cos(arg)就可以得到离散余弦变换(DC T)的直接实现。
现在,正如我们在这篇张文的前一段中所讨论的,我们不能区分实际测量的正弦函数是正弦波还是余弦波。而是我们总是测量正弦信号,正弦和余弦变换在实际中用处不大,除了一些特殊情况(像图像压缩,就是块图像用一个基本的余弦或正弦函数有更好的模拟特性,比如用一个余弦基本函数可以更好的表示大面积的同色)。正弦信号是比正弦或余弦波更一般的一段,因为它可以在其周期中的任意位置开始。我们记得余弦波从1开始,正弦波总是从0开始。当我们以正弦波为参考时,余弦波在其周期的最后四分之一处开始。一般度或弧测量它们的偏移量,这两个单位一般与三角函数有关。一个完整的周期等于360(对于“度”)或者2π弧度(对于“2π”,听起来像“派”。π是希腊字符的个数。3.14152377222 ...在三角学中有重要意义。
余弦波因此具有90°或π/2的偏移。这种偏移称为正弦信号的相位,因此余弦波相对于正弦信号具有90°或π/2°的相位。
以上是阶段的内容。因为我们不能限制信号从0°或90°开始(因为我们在观测一个我们可能无法控制的信号),所以同时直接唯一地描述信号的频率、幅度和相位是非常重要的。正弦或余弦变换的相位被限制在0°或90°,任意相位的正弦信号会在相邻频率上产生假峰值(因为它们试图“帮助”分析,并对测量信号施加0°或90°的相位影响)。这有点像用圆石头填方孔:你需要一个小一点的圆石头填剩下的空房间,小一点的石头还剩下空 空房间,以此类推。我们需要的是能够处理一种信号变换,可以处理任意相位的正弦波组成的信号。
步骤6:离散傅立叶变换
从正弦变换到傅里叶变换的步骤很简单,只需要更一般的方法。在正弦变换中,正弦波用于每个频率的测量,在傅立叶变换中,正弦波和余弦波都被使用。也就是说,对于任何电流频率,我们将测量信号与相同频率的正弦和余弦波进行“比较”(或“共振”)。如果我们的信号看起来像正弦波,变换的正弦部分会有很大的幅度。如果看起来像余弦波,变换的余弦部分幅度会很大。如果它看起来像一个反正弦波,即它从0开始,但下降到-1,而不是上升到1,它的正弦部分将有一个很大的负振幅。这表明,任何给定频率的正弦信号都可以用+、-符号以及正弦和余弦相位来表示。
清单1.2:离散傅立叶变换的直接实现[3]:
定义M _ PI 3。58860 . 88888888861
龙斌,k;
double arg,符号= -1。;/*符号=-1->;快速傅立叶变换,1->;iFFT */
for(bin = 0;bin <。= TransformLength/2;bin++) {
cosPart[bin] = (sinPart[bin] = 0。);
for(k = 0;k <。transformLengthk++) {
arg = 2。(float)BinM _ PI *(float)k/(float)TransformLength;
sin part[bin]+= Inputdata[k]* sign * sin(arg);
cosPart[bin]+= Inputdata[k]* cos(arg);
}
}
我们还有一个问题,就是如何得到傅立叶变换所缺少的那些有用的东西。我说傅里叶变换相对于正弦和余弦变换的优势是因为它对正弦信号起作用。但是到现在为止,我们还没有看到任何正弦信号,只有正弦和余弦。好的,这需要一点额外的处理步骤:
定义M _ PI 3。58860 . 88888888861
龙斌;
for(bin = 0;bin <。= TransformLength/2;bin++) {
/*频率*/
频率[箱] =(浮点)箱*采样率/(浮点)变换长度;
/*震级*/
[星等] = 20。* log10( 2。* sqrt(SiNpart[bin]SiNpart[bin]+CosPart[bin]c
OSPAR[bin])/(float)transform length);
/*阶段*/
phase[bin] = 180。*atan2(sinPart[bin],cosPart[bin]) / M_PI - 90。;
}
在运行清单1.3所示的关于离散傅立叶变换输出的代码段后,我们最终被表示为正弦信号波之和的输入信号。
k阶正弦信号由频率[k]、幅度[k]和相位[k]描述。单位是赫兹(赫兹、周/秒)、分贝(分贝)和度(度)。请注意,经过清单1.3中的后处理(processing),即把正弦和余弦函数转换成单个正弦信号,我们把K阶正弦信号的幅度- DFT命名为幅度,它总是取相对值。我们可以说一个-1.0的振幅对应一个1.0的振幅,这个振幅对应一个+或-180°的相位。在文献中,做傅里叶变换时,队列幅度[]称为被测信号的幅度谱,队列相位[]称为被测信号的相位谱。
例如,如果存储的幅度以分贝为单位测量,输入波的采样值预计在[-1.0,1.0]之间,这是相对于0dB幅度满量程数而言的。作为离散傅立叶变换的一个有趣的应用,例如,清单1.3可以用来编写基于离散傅立叶变换的频谱分析。
结论
众所周知,傅里叶变换及其一系列离散正弦和余弦变换提供了一种方便的工具,可以将信号分解为一束部分波。结果要么是正弦或余弦,要么是正弦信号(用正弦和余弦波的组合来描述)。傅里叶变换同时使用正弦和余弦波的好处是可以引入相位的概念,使得变换更加通用,这样就可以有效清晰地分析既非纯弦也非纯余弦的正弦信号,当然其他信号也一样。
傅里叶变换与被研究的信号无关,所以无论我们分析的信号是正弦信号还是其他一些更复杂的信号,变换都需要相同的操作数。这就是为什么傅里叶变换被称为非参数变换,这意味着它对所需信号的“智能”分析没有直接帮助(当我们考虑已知为正弦的信号时,我们更喜欢精确地获得关于相位、频率和幅度的信息,而不是在一些预定频率下的一串正弦和余弦波)。
现在我们也知道,我们在一组固定频率的网格上寻找输入信号的值,而输入信号的实际频率组可能在这组网格上不起作用。我们在分析中使用的网格是人为的,因为我们几乎是根据对频率的尝试来选择参考正弦波和余弦波。说到这里,很快就清楚了,被测信号的频率位于变换网格的频率之间。因此,两个频率网格之间的正弦曲线中存在一个频率,这在变换中不会很好地描述。最接近输入信号频率的网格周围的相邻网格将试图“校正”频率偏差。因此,输入信号的能量会被拖到几个相邻的网格上。这就是为什么傅里叶变换不能快速分析声音返回给它的基波和谐波(这也是为什么我们称正弦和余弦波为部分波而不是谐波和泛音)。
简而言之,没有进一步的快速处理,DFT就像一个窄坝,有小的并行带通滤波器组(“通道”),每个通道携带额外的相位信息。这对于分析信号、制作滤波器以及使用其他技能都是有好处的(改变一个信号的音调而不改变其速度就是其中之一,在DSPdimension.com上的另一篇不同的文章中有所解释),但是需要在几个常见的任务中加入快速处理。同样,它可以被认为是一系列使用正弦和余弦波之外的基本函数的变换的特殊情况。向这个方向扩展概念超出了本文的范围。
最后,重要的是要提到一种更高效的DFT工具,即一种称为快速傅立叶变换的算法。它最初是由库利和塔克在1969年构思的(其根源仍可追溯到高斯等人的工作)。快速傅立叶变换只是一种有效的算法,通过直接近似计算离散傅立叶变换比上面给出的算法花费的时间更少,而且是其他结果相同的方法。无论如何,F FT都是用库利/塔克算法实现的,要求变换长度是2的幂。实际上,对于大多数应用来说,这是一个可以接受的限制。关于不同方式的FFT实现,已有大量文献,可以说不同的FFT实现已经足够了,其中一些不需要经典FFT的2次方限制。
下面的清单1.4展示了使用smbFft()程序实现快速傅立叶变换。
清单1.4:离散快速傅立叶变换:
定义M _ PI 3。58860 . 88888888861
void smbFft(float *fftBuffer,long fftFrameSize,long sign)
/*
快速傅立叶变换程序,(C)1996s . m . Bernsie .符号= -1是快速傅立叶变换,1是快速傅立叶变换(逆)
填充fftBuffer[0...2*fftFrameSize-1]与fftBuffer中时域数据的傅立叶变换
[0...2*fftFrameSize-1]。快速傅立叶变换阵列以交错方式获取并返回余弦和正弦部分
举止。fftBuffer[0] = cosPart[0],fftBuffer[1] = sinPart[0],asf。fftFrameSize必须是的幂
它需要一个复杂的输入信号(见脚注2)。使用“通用”音频信号时
月桂基硫酸钠
我们的输入信号
必须作为{in[0],0 }传递。,在[1]中,0。,在[2]中,0。,...} asf。在这种情况下,转换
属于…的
的频率
兴趣在fftBuffer[0...fftFrameSize]。
*/
{
float wr,wi,arg,*p1,*p2,temp
float tr,ti,ur,ui,ur,ui,*p1r,*p1i,*p2r,* p2i
long i,bitm,j,le,le2,k;
for(I = 2;i <。2 * fftFrameSize-2;i += 2) {
for (bitm = 2,j = 0;bitm <。2 * fftFrameSizebitm <。& lt= 1) {
if(I & amp;bitm)j++;
j <。& lt= 1;
}
if(I & lt;j) {
P1 = fftBuffer+I;p2 = fftBuffer+j;
temp = * p1*(p1++)= * p2;
*(p2++)= temp;temp = * p1
* p1 = * p2* p2 = temp
}
}
for (k = 0,le = 2;k <。(长)(log(fftFrameSize)/log(2)。));k++) {
le <。& lt= 1;
le2 = le>。>。1;
ur = 1.0
ui = 0.0
arg = M _ PI/(le2 > 1;>。1);
wr = cos(arg);
wi =符号* sin(arg);
for(j = 0;j <。le2j += 2) {
p1r = fftBuffer+j;p1i = p1r+1;
p2r = p1r+le2;p2i = p2r+1;
for(I = j;i <。2 * fftFrameSizei += le) {
tr = * p2r * ur-* p2i * ui;
ti = * p2r * ui+* p2i * ur;
* p2r = * p1r-tr;* p2i = * p1i-ti;
* p1r+= tr;* p1i+= ti;
p1r+= le;p1i+= le;
p2r+= le;p2i+= le;
}
tr = ur * wr-ui * wi;
ui = ur * wi+ui * wr;
ur = tr
}
}
}
看了这篇文章有收获吗?请与更多人分享
关注《电子工程专辑》做一个优秀的工程师!
回复关键词是干货:电路设计,电容,三极管,PCB接地
请加微信13264108376加入“模拟电源”“嵌入式”微信群
长按二维码识别注意力
一键关注+历史信息阅读原文
1.《离散傅里叶变换 搞清楚傅里叶变换,没有想象的那么难!》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《离散傅里叶变换 搞清楚傅里叶变换,没有想象的那么难!》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/shehui/808986.html