精华内容
下载资源
问答
  • 离散傅里叶变换离散傅里叶变换离散傅里叶变换离散傅里叶变换离散傅里叶变换离散傅里叶变换离散傅里叶变换离散傅里叶变换离散傅里叶变换离散傅里叶变换离散傅里叶变换离散傅里叶变换离散傅里叶变换离散傅里叶变换
  • 离散傅里叶变换

    2018-12-10 16:43:57
    通过opencv2.4.11在VS2012平台上实现离散傅里叶变换,可运行
  • 离散 傅里叶变换

    2018-03-15 22:48:14
    基于OpenCV函数利用离散傅里叶变换求图像的幅值和相位。可以运动,菜鸟可以学习学习。 opencv 2.4.x系列,VS2010
  • N点离散傅里叶变换同时计算两个N点实序列的离散傅里叶变换
  • 更多经验分享,关注 加油射频工程师DFT(discrete fourier transform),称为离散傅里叶变换,是数字信号处理领域的常用工具。DFT可以计算出离散数据序列的频谱。DFT的源头,是连续傅里叶变换,用于将连续时间信号x(t)...

    更多经验分享,关注 加油射频工程师 

    DFT(discrete fourier transform),称为离散傅里叶变换,是数字信号处理领域的常用工具。DFT可以计算出离散数据序列的频谱。

    DFT的源头,是连续傅里叶变换,用于将连续时间信号x(t)转换成连续频域信号X(f)

    da5671aae2eea0fd94b4ad120649d50e.png

    但是,连续傅里叶变换不适合计算机上应用,所以工程师们就发明了离散傅里叶变换(DFT)。

    88b5648bd251bd02a97053faac76c77c.png其中,x(n)是离散输入序列,X(m)是离散输出序列。x(n)X(m)的个数都是N。也就是说,如果有N个离散输入数据,则其DFT也会产生N个离散输出数据。

    N不仅是离散输入数据的数量,也是输出数据的数量,同时还决定DFT的计算量以及输出的频率分辨率。N越大,DFT的计算量越大,频率分辨率也越高。

    假设,用500SPS的采样率去采一个连续时间信号,然后做一个N=16DFT变化,则出来的结果都分布在mfs/N=m*31.25Hz上。

    从上面公式可以看出,DFT变换后,不仅有我们常规看到的频谱幅度,还有频谱相位。这个相位也很有用。比如想测量多通道ADC的相位一致性的时候,就靠这个指标。

    假设有两个信号,分别为:

    xt1=sin(2*pi*1000*t)和xt2=0.5*sin(2*pi*2000*t+3*pi/4),将两个信号叠加,波形如下图所示。

    f3ddd9a8d64a156096837490dede3e89.png

    对其做DFT变换,则:

    69d21f7d89b997dce3e479b93532acc7.png

    部分图片及文字来源于网络,如有侵权,麻烦后台留言,立马删除,谢谢!

    长按图片关注微信号

    3654888b832b2e3a4c39174ddaa99611.png

    展开全文
  • 一、什么是采样 二、狄拉克梳状函数(Dirac comb) ...六、什么是采样定理专栏前面的几篇文章主要介绍了连续系统的一些知识,今天呢我们简要说一下离散系统,主要是离散傅里叶变换、Z变换以及其他的...

    57033863616b0a4219ceecaf351f1b70.png
    一、什么是采样
    二、狄拉克梳状函数(Dirac comb)
        2.1 什么是狄拉克(Dirac)函数
        2.2 什么是狄拉克梳状函数(Dirac comb)
    三、什么是离散时间傅里叶变换(DTFT)
    四、什么是离散傅里叶变换(DFT)
    五、什么是Z变换
    六、什么是采样定理

    专栏前面的几篇文章主要介绍了连续系统的一些知识,今天呢我们简要说一下离散系统,主要是离散傅里叶变换、Z变换以及其他的一些基础知识。

    一、什么是采样

    我们一般对模拟信号比较熟悉,它在时域是连续的,一般长成这个样子:

    3ca439c7c849d1acb6b83cd89b3d3bca.png

    模拟信号一般可以在示波器里面进行观测,在很久很久以前,我们需要处理的信号只有模拟信号。但是现在不一样了,因为我们步入了新时代——数字时代,大部分信号都变成数字式了,典型的数字信号长成这个样子:

    35007c4a24faa367ad6277374fe70c88.png

    把模拟信号变成数字信号的过程称之为采样。

    采样频率定义为:

    为采样时间。

    采样是一个有规律的周期性过程,也就说,采样会引入额外的谐波分量。举个简单的例子,现在有一个余弦信号,频率为 8Hz,表达式为:

    假设我们对这个余弦信号进行采样,采样频率为

    ,采样结果如下图,其中虚线为原始信号,菱形为采样点的数值。

    82418c0405e9c0ce6ee90bd37370d62b.png

    现在我们将原始曲线去掉,只留下菱形的采样点,如下图:

    2d435d9ab0c6d5ff95928eb11e271adf.png

    那怎样才能复原原来的曲线呢?聪明的你可能已经想到了:用曲线拟合啊,假如所有的点都能在某个曲线上,那拟合出来的曲线很有可能就是被采样的曲线,这样想貌似没什么大问题。

    然而事实却很打脸,我们极有可能模拟出如下曲线来,也是一个余弦,但是频域不是原先的8Hz,也不是采样所用的20Hz,而是12Hz,模拟后的12Hz曲线如下图,这是为什么?

    fd5a02a4c9c4da47ada9b96dc6d7effb.png

    如果我们工作足够细致,就会发现还可以用如下频率的曲线拟合采样点:28Hz,32Hz,48Hz,52Hz, ... ,也就是说采样之后信号频谱有很多频率,如下图:

    09ab718b930ebe9495909973dbcf18ba.png

    那么问题就来了,其他的频率分量到底是哪来的?

    这个问题还真不简单,我们要做几个铺垫以后才能回答。


    二、狄拉克梳状函数(Dirac comb)

    2.1 什么是狄拉克(Dirac)函数

    在专栏“如何理解不确定性原理——不确定or测不准”那篇文章中,我们已经认识了什么是狄拉克函数,具体参见如下链接:

    J Pan:如何理解不确定性原理—不确定or测不准?zhuanlan.zhihu.com
    933ee5b8fa28c180487cdbb2278384e1.png

    文章中提到,狄拉克

    函数定义为:

    并且满足

    从定义很容易得出这个函数有如下一些性质:

    • 对称性质:
    • 缩放性质:
    • 筛选性质:

    2.2 什么是狄拉克梳状函数(Dirac comb)

    前面说了,狄拉克函数具有筛选性质,但是每次只能筛选出一个点,那怎样才能有规律的筛选出更多的采样点呢?——狄拉克梳状函数(Dirac comb),这个函数在电子工程领域被称为脉冲序列(impluse train)或者是采样函数(sampling function),有些文章也称之为Shah function。狄拉克梳状函数的本质就是狄拉克

    函数用周期为
    间隔的无穷多级数(多个
    函数合并而成),数学表达式为:

    其时域波是周期为

    的单位脉冲序列,也称之为理想抽样函数,长相如下:

    1e35279faa2cf57ac496c38b266f1b15.png

    由于是周期函数,我们可以按照周期函数的傅里叶级数求其频谱,其傅里叶级数的系数为:

    ,

    所以其傅里叶级数展开为:

    可见,其频率值分布在

    (
    )的离散频率点,各频率分量的幅值均为
    ,傅里叶级数系数如下:

    ba19bc9611ad57cf0c7076b3f36b9b64.png

    其实引进了冲击函数的概念之后,对一般的周期函数也可以求其傅里叶变换:

    稍微变形一下;

    其中

    为周期函数的傅里叶级数,其频谱如下:

    a756631127318ec4b62606e6b91796e8.png

    可见狄拉克梳状函数的傅里叶变换仍然是频域的狄拉克梳状函数,频谱冲激串的周期是基频是采样频率

    ,冲激强度为
    。用狄拉克梳状函数表示离散信号和离散频谱,将给信号分析和处理带来极大的方便。

    三、什么是离散时间傅里叶变换(DTFT)

    在本专栏前面的文章中,我们介绍了什么是傅里叶变换,已经忘记傅里叶变换是怎么回事的童鞋可复习一下这篇文章:

    J Pan:傅里叶变换后面的到底有什么小秘密zhuanlan.zhihu.com
    e9f6044e3a8dec03f14c02b7ea16bbb9.png

    傅里叶变换是用来处理连续系统的,那离散系统如何处理呢?假如对

    为连续系统信号,要转换成离散系统,就要先进行采样,采样频率为
    ,冲击采样序列为:

    则取样之后的的信号为

    连续信号的傅里叶变换的定义为:

    则采样后的信号傅里叶变换为:

    交换一下积分与求和顺序:

    的筛选特性
    可知:

    对数字信号而言,我们只有

    采样后的信号
    ,第n个采样发生在时间
    。因此可以将连续信号的的傅里叶变换写成如下形式:

    上式称之为离散时间傅里叶变换(Discrete Time Fourier Transform),简称为DTFT,也就是无限长离散信号如何进行傅里叶变换。但是呢,DTFT的结果频率

    还是连续的,也是不能直接应用在数字系统中。那实际是怎么办呢?

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

    我们目前处于一个数字化的世界,如果一个信号的频谱是连续的(DTFT),那么我们仍然没法在机器中处理,那怎么办呢?——频率也要离散化才行,所需要的技术就是离散傅里叶变换DFT(Discrete Fourier Transform),即具有周期特性离散信号的傅里叶级数(就是将无限长的离散限号进行截短至N个采样点,然后将这个N个采样点进行周期延拓 ),DFT即IDFT表达式如下:

    ,

    ,

    当然更多的时候也会表示成:

    ,

    ,

    即1/N可以放在DFT或者IDFT里面,两者完全等价的,本文采用前面的表达方式。一般的教材,都是直接给出DFT计算公式,对DFT与DTFT以及傅里叶变和傅里叶级数的关系并没有明确,导致很多童鞋不明觉厉,总觉得心里不是很踏实。

    稍微负责任一点的书会告诉大家:

    ,其中
    ,在
    区间内是完备正交的,然后通过这个完备正交基获得DFT的表达式,这多少给人马后炮的感觉,是逆向推导而不是正向设计。

    今天我们提供一个思路,来看看第一个人或许受到了怎么的启发,发现了DFT的算法。我们知道,周期函数可以用傅里叶级数展开,在引入了

    函数后,更一般的周期函数也能被展开了,根据连续周期信号的傅里叶级数:

    对于连续信号

    按照采样时间
    进行抽样
    ,并将这
    个数值进行周期延拓,可以得到周期的离散信号,在一个周期内,其表达式为:

    可以获得离散周期信号的傅里叶级数为:

    将积分与求和调换一下顺序:

    由于

    冲击函数的筛选性质,上式很容易进行离散化,很显然,
    ,即
    ,积分号内只有采样点
    处的值被保留,所示上式可以简化为:

    所以可以得到:

    这就是离散周期信号的傅里叶变换,理论上离散周期信号的频谱是有无穷多的,但是由于

    的周期性,一般我们只取主值区间
    进行研究。

    上面我们计算了离散周期信号得频谱,即不同频率分量下对应的系数,下面将得出一个重要的结论,很是很多童鞋迷惑的一点,那就是离散傅里叶变换只有离散的数值,那频率去哪了?

    也就说:

    离散周期傅里叶变换后的第

    个数对应的频率是
    ,这个结论非常重要,在后面的Z变换的性质中会用到。

    说到周期离散信号的傅里叶变换DFT(discrete Fourier transform),就不得不提FFT(fast Fourier transform ),即快速傅里叶变换,毕竟FFT在工程中更常见,那它们有什么关系呢?——这俩货其实呢是一回事,FFT本质也是DFT,只不过是利用DFT内部蕴藏的规律的一种简化算法罢了。


    五、什么是Z变换

    在第三部分,我们已经介绍到,DTFT的公式是

    同样的,DTFT需要满足绝对可和的条件,即

    。然而事实上并不是所有的离散数列都满足这个绝对可积条件,那怎么办呢?在文章“从另一个角度看拉普拉斯变换”中,我们也碰到过类似的问题,信号
    要保证能进行傅里叶变换,也要满足绝对可积条件:

    我们是怎么做的呢?——软的不行就来硬的呗,给

    强制乘以一个衰减函数
    ,保证

    具体请参照

    J Pan:从另一个角度看拉普拉斯变换zhuanlan.zhihu.com
    2cf53433a944763f157e0486e1c786c1.png

    对于离散数列,是不是也可以采取这个思路呢?我们不妨试一下:我们给

    乘一个指数函数
    ,对应连续信号的衰减函数
    ,即用
    对应时间

    则函数
    的DTFT为:


    进一步化简:

    这看起来太复杂了,既不符合工程师的调性,也不符合数学家的调性。我们要简洁,简洁,简洁!如果我们令

    则DFT的表达式变为:

    是不是简洁多了!是不是神清气爽了!——这就是Z变换了。

    如果大家记性好的话,肯定还记得我们在推导Z变换的过程中借鉴了拉普拉斯变换的很多处理方式,那它们之间是不是有某种联系呢?

    我们知道:

    我们又知道;

    显然能得出以下结论:


    也就是说,
    域是
    域的进一步映射,
    变换和拉普拉斯变换通过某种映射连接在一起。同时,由
    还可以看出,稳态时,
    ,则
    ,这个函数大家可能很熟悉了,这尼玛就是一个单位圆啊!如果看不出来也没关系,可以参看小潘的另外一篇文章:
    J Pan:被众人膜拜的欧拉恒等式是个什么东东?zhuanlan.zhihu.com
    09c85845c07cc13f916497f1ef64e049.png

    我们再深入研究一下

    之间的映射关系:

    ,当
    时,
    ,对应的是
    域的虚轴,而此时
    对应的是单位圆,也就是说
    变换将
    域的虚轴映射成
    域的单位圆。

    时,
    ,对应的是
    域的正半轴,而此时
    ,由于
    ,也就是说此时
    变换将
    域正半轴映射到了
    域的单位圆外部。

    时,
    ,对应的是
    域的负半轴,而此时
    ,由于
    ,也就是说此时
    变换将
    域负半轴映射到了
    域的单位圆内部。

    这样做有什么好处呢?

    如果

    是拉普拉斯变换对,则
    也是变换对,如果
    延时
    ,那么
    的傅里叶变换对为
    ,可见:
    在时域进行延时操作,在频域就相当于旋转操作
    大量出现在具有延时特性系统的拉普拉斯变换里面,如果用
    来表示的话,表达和计算都会方便很多。简单点来说:
    就相当于定义了一个旋转操作符,这对于具有延时采样的离散系统特别有用。

    六、什么是采样定理

    好了,能坚持到这的童鞋都是好奇宝宝——在等我们第一部分问题的答案呢!到底其他频率的分量是哪来的?

    我们知道,两个信号在时域相乘,在频域相当于卷积;在时域卷积,在频响相当于相乘,这就是卷积定理,具体参见文章

    J Pan:“卷积”其实没那么难以理解zhuanlan.zhihu.com
    80454aac91f5cb397a6be24ca39819d0.png

    离散信号,其实就是连续信号

    与狄拉克梳状函数(也就是采样函数)的相乘,这就是采样。这是时域行为,那在频域会怎么样?——卷积呗!

    在本文的第二部分中,我们又介绍了,狄拉克梳状函数无论在时域还是在频域,其形貌都是一系列的脉冲信号,那问题就转变成了:一个信号的频谱函数和狄拉克梳状函数卷积,结果是什么?——频谱函数被周期延拓了,而且延拓的周期就是采样频率!

    举个例子:

    对于余弦函数而言,比如

    ,其傅里叶变换包含两个频率分量,分别是8Hz以及-8Hz,如下图:

    4f12c1ef6d188987a2bebcc2b0473c57.png

    我们用一个20Hz的狄拉克梳状函数(采样函数)对余弦信号进行抽样,采样函数为:

    ,其中
    ,

    其时域信号以及频谱为:

    85fe25078459a99e613b02f68265b150.png

    可见,抽样信号的频谱也呈现冲击信号的样貌,频谱中两个冲击串的间隔就是采样频率。

    采样后的信号为:

    采样后的时域信号及频谱为:

    e4812cb61a5f483b96c998be20c2620e.png

    可见,采样后的信号的频谱被周期延拓了,延拓的周期就是20Hz,也就是采样频率。

    把以上三张图放在一起,相比能看的更清楚一些。

    21ff90328dd7dba9b9f672da13e90297.png

    到这里,对数字敏感的童鞋可能已经猜到采样后的12Hz是哪来的了—— -8Hz平移一个采样周期(20Hz)得来的。进而可以得到:28Hz是8Hz平移一个采样周期来的,32Hz是-8Hz平移两个采样周期来的,48Hz是8Hz平移两个采样周期来的,....

    通过以上的分析,我们得到了如下结论:对一个连续信号的采样,采样后的频谱相当于将采样前的频谱进行了延拓,延拓的周期就是采样频率

    现在假设一个信号的频谱如下:

    60b9e7b8501707945a5ce43bfa191b21.png

    频谱中最大的频率为

    ,用一个周期为
    狄拉克梳状函数进行采采样后的频谱为原频谱的周期延拓,示意图如下:

    2ce05047a2d6ceee46e8f7c5c19a0689.png

    看着很完美的样子,但是如果出现一种情况:

    ,结果会怎么样?

    ecf8f56000150160f39d7c9b5bf75be1.png

    也就是说,原始频谱信号经过周期延拓后会有一部分重叠,这样在重叠的部分就会有信息的丢失,也就无法进行信号复原了,也就是说,对于连续信号的进行抽样离散的话,必须保证采样频率是原连续信号最大频率分量的2倍频率以上,否则信号就难以复原。这就是采样定理,又叫奈奎斯特采样定理香农采样定理

    展开全文
  • (本人为本文原作者,转载请标明出处)上文请转:DBinary:傅里叶变换推导详解​zhuanlan.zhihu....在本文之后的论述中, 将有限长度且离散的有限长离散时域傅里叶变换的分析公式统一简称为离散傅里叶变换(Discrete Fou...

    (本人为本文原作者,转载请标明出处)

    上文请转:

    DBinary:傅里叶变换推导详解zhuanlan.zhihu.com

    其中,式3.51及3.52被称为傅里叶变换对,其中3.52为正变换,表示离散时间信号变换为频域复信号,式3.51位逆变换,表示由频域复信号还原为离散时间信号,在本文之后的论述中, 将有限长度且离散的有限长离散时域傅里叶变换的分析公式统一简称为离散傅里叶变换(Discrete Fourier Transform)或者其英文缩写DFT,将它的逆变换(Inverse Discrete Fourier Transform)也就是逆变换公式简称为IDFT[3]。

    第一节 采样

    自然信号若要保留为数字离散信号,首先要做的就是对该信号进行采样,一般情况下,使用的采样方式都是等间距采样,即为样本两两之间的采样间隔相同,在数学表达上,常常使用单位冲击采样来表示这一过程。现定义单位冲击函数

    ,这个函数仅在t=0时有值,其它区间的取值都是0,该函数的的定义是

    4469832cf38c5b1c66ba578abb49bd10.png

    在实际的使用中,常常定义

    fd0c51bb34285a1063fa30d4d272d50f.png

    假设一连续时间信号函数

    ,需要对t=2时间进行采样,仅需要对
    进行时移就可以了,定义一个连续时间信号的采样样本x[n]为式4.2

    因此假设我们需要对一个信号多点进行采样,可以使用式4.2的方式进行表达:

    在《信号与系统》[2] 第7.1.1章节推论如下,设对一信号以T间隔取样,那么就有如下数学式

    根据卷积性质时域内的相乘对应于频域内的卷积,其中

    为冲击串频域函数

    根据公式4.7,4.8:

    可得出:

    其中

    为基波频率或称之为频域间距,上式可知
    是频率为
    的周期函数,由一组移位的
    叠加而成,在幅度标以
    的变化,当
    大于频带宽度的一半时频带不会发生堆叠,反之会发生堆叠。

    因此可以得出一个结论,信号的采样频率至少需要该信号最高频率的2倍,否则无法还原出原信号导致失真。

    同时依据第二章第六节的推论,有DFT正变换公式如下:

    其中,N表示信号的采样点数,n的范围是0到

    表示信号的第一个点,
    表示信号的第二个点,依此类推,k的取值范围是0到N-1,由
    可知,其分辨率等于:

    因此得出另一个结论,当对一个信号以频率

    进行采样时,对该信号的傅里叶变换后的频域分辨率是采样率除以其样本点数。

    第二节 DFT共轭对称性

    若某一函数在坐标系上以x=N轴对称,那么其可以写成式4.10的形式

    如图4-2-1,其中的函数

    都是以x=0的轴线对称。

    aed29e0232b2ca65a28cc9a0e2b74698.png
    图4-2-1 两个轴对称函数图像

    在复数中,两个实部相等,虚部互为相反数的复数互为共轭复数(conjugate complex number),假设一复数z,则其共轭写作

    ,其定义满足若

    则其共轭为

    现定义一个离散序列x[n]若x[n]满足式4.13

    则称x[n]为共轭对称序列。

    假设:

    依据欧拉公式,可以得出

    那么,上式可根据4.8写成

    ,并将它带入
    中,那么就有

    由式4.17可知,傅里叶变换结果在

    范围内呈共轭对称,而当k=0时有式4.18

    也即说明变换的第一个结果为

    的累加和,即频率为0部分的累加和,在变换结果中称之为信号的直流分量。

    第三节 DFT应用

    离散傅里叶的正变换的结果为离散复数序列,设某一结果为

    在实际的使用中,常常使用

    表示对应频率的能量,该能量并非物理意义上的能量,它用来表示该频率信号对原始信号的贡献,同时使用
    来表示对应频率的相位,描述的是该频率的位置信息。

    DFT在声学的分析中被广泛的使用,WavFreq是一款能够加载Wav音乐(波形文件)并进行解析的软件。下图显示的是该软件对一段音乐进行分析的频谱图:

    f87c07afc784ab61accc785e313995cf.png
    图4-3-1 音乐频谱图像

    其中,该音频信号的采样频率为44100HZ,每个样本以16位短整形记录,这也就意味着声波信号被量化在范围[-32768,32767]内,从图中的频谱图中可以看出,大部分能量较高的频率被集中在了低频当中,在正常的音乐中,人声大多被集中在了低频范围。女声的频率也会相对的比男声的频率高出一些。

    第四章 使用C语言实现DFT、IDFT代码

    第一节 C语言与环境

    本文所述的程序部分,全部都使用C语言来完成,同时,本文使用开发环境为windows 10 64位系统,集成开发环境使用微软官方发布的Visual Studio 2010(编译器MSVC 2010),C语言依据C99标准编写。因此,程序运行需要安装VC++2010的支持库。

    为了保证代码的可移植性,程序部分仅使用C语言提供的数学标准库math.h,该标准库在众多的编译器中都被支持。

    第二节 使用C语言编写DFT代码

    因为涉及到复数运算,因此,本文定义一个结构体来描述一个复数

    typedef 

    其中该结构体名为complex,当中有两个float类型的成员分别代表复数的实部和虚部,其中re意味really,表示复数的实部,im表示Imaginary表示虚部。同时,实现三个函数用于对虚部进行运算。

    complex complexBuild(float re,float im) 
    { 
    complex cx; 
    cx.re=re; 
    cx.im=im; 
    return cx;
     } 

    其中 complex complexBuild(float re,float im);用于构建并初始化一个复数结构体,re表示构建复数的实部,im表示构建复数的虚部

    complex 

    complex complexAdd(complex a,complex b)用于实现两个复数的相加运算,即虚部加虚部,实部加实部.

    complex complexMult(complex a,complex b) { complex ret; ret.re=a.re*b.re-a.im*b.im; ret.im=a.im*b.re+a.re*b.im; return ret; }

    complex complexMult(complex a,complex b)用于实现两个复数的乘法运算.依据公式

    根据第一章节第六节的推导公式3.52

    根据欧拉公式上式可以写成

    那么,DFT的公式就可以写成

    #include 

    其中x[]表示输入的复信号序列,实信号可以当做虚数为0的复数信号进行输入,X[]表示输出的复数序列,其分配的内存大小至少应该为输入序列的大小,N为输入序列的复信号个数。

    在项目 DFT_DEMO中,对一个长度为10的序列进行DFT变换,其中,该序列为1,2,3,4,5,6,7,8,9,10十个数,如图4-2-1

    3ab4ae07c0eb023f460050a96b2a1482.png
    图4-2-1 DFT变换的结果

    代码如下

    int 

    将上图结果与matlab中的DFT变换结果对比计算结果一致,可知代码编写正确。

    第三节 使用C语言编写IDFT代码

    根据第六节傅里叶变换对的逆变换公式3.46

    可得到适合代码编写的公式5.2

    通过第三节的准备工作,可以直接套用第三节给出的结构体声明,直接在源代码当中写出逆变换的代码。

    定义IDFT变换函数为

    void IDFT(complex x[],complex X[],int N);

    实现代码如下所示

    void 

    其中X[]表示输入的复信号序列,x[]表示输出的信号序列,N表示输入复信号序列的长度,如果逆变换编写正确,那么将第二节的输出作为逆变换的输入,就可以得到正变换前的离散信号序列,为了验证这一结果,将main函数更改如下:

    int 

    运行结果如图4-3-1

    7a3265a783eb4a93a0f2b64ab56b27af.png
    图4-3-1 傅里叶变换对程序执行结果

    从结果来看IDFT的程序成功将DFT变换的结果还原成原信号,逆变换的结果有极小的偏差,这是因为计算过程中浮点运算存在极小的精度损失,导致变换的结果有极小的误差。

    展开全文
  • 之前写过一篇文章:furious:深入理解离散傅里叶变换(DFT),这里再在其基础上探讨DFT的另外一些东西。离散傅里叶变换(DFT)和离散时间傅里叶变换(DTFT)以及离散傅里叶级数(DFS)到底是啥区别? Name Time Frequency ...

    ec304862380e8bbc678565e3a9df5f9c.png

    之前写过一篇文章:furious:深入理解离散傅里叶变换(DFT),这里再在其基础上探讨DFT的另外一些东西。

    1. 离散傅里叶变换(DFT)和离散时间傅里叶变换(DTFT)以及离散傅里叶级数(DFS)到底是啥区别?
         Name                  Time                  Frequency
    Fourier Transform    continous/aperiodic     continous/aperiodic 
    Fourier Series       continous/periodic      discrete/aperiodic 
    Discrete Time FT     discrete/aperiodic      continous/periodic
    DFT                  discrete/periodic       discrete/periodic
    DFS                  discrete/periodic       discrete/periodic

    上面这个表是傅里叶变换家族的几种不同变换名称以及它们在时域和频域的区别。DFT和DTFT的区别很好理解,因为DTFT转换后的频域是连续的,而DFT频域也是离散的。但是DFT和DFS是什么区别呢?它们在时域和频域都是离散周期的!

    我们把DFS和DFT的变换式都写在这里。先是DFT:

    ,其中

    ,其中

    再是DFS:

    因为是周期的,所以这里的

    是N个连续的整数,比如可以是0,1,2,3,...,N-1,也可以是3,4,5,...,N+2。

    仔细观察DFS和DFT的式子,其实它们本质是一样的东西,只不过DFT把DFS的

    改了一下位置,而且对DFS的
    取了(0,1,2,...,N-1)的结果。所以之前那个表应该把DFS和DFT归到一处(DFS or DFT)。

    似乎更好的名称应该为

         Name                  Time                  Frequency
    Fourier Transform    continous/aperiodic     continous/aperiodic 
    Fourier Series       continous/periodic      discrete/aperiodic 
    Discrete FT          discrete/aperiodic      continous/periodic
    Discrete FS          discrete/periodic       discrete/periodic

    但是由于历史原因,这些名字已经用了多年,不会再改了。所以上面这个表看看就好了,当我没说。。。要记住的是第一个表。

    综上,计算机拿来计算的DFT实际上是把采样的N点有限序列想象成这N点采样点不断重复的周期序列,这N点采样值是想象的这个无穷序列的一个周期而已,从而得出这个周期序列的傅里叶级数

    2. 引出问题2,把采样的N点有限序列想象成这N点采样点不断重复的周期序列的一个周期,会有哪些影响?

    看下图的例子:

    4a1633be4b4e1586e0ec5a8d743aa3c2.png

    上面这幅图中,原来的信号是一个周期的信号。上一个采样是N=12点的采样,控制好采样频率使这N点采样的总长时间刚好是原来信号周期的一个周期(或是原周期的整数倍,但注意最后一点,采样值不在0上的),那么有

    ,即由这N点“想象”出来的周期和原信号是刚好符合的,
    即想象出来的离散周期信号确实是原信号的采样。下一个采样的采样频率一样,但是采了N=15个点,那么做15点DFT的时候“想象”出来的信号比实际的一个周期多了3个点的“尾巴”,当然这个“尾巴”也是周期重复的,那么这里可以看到此时想象出来的离散周期信号和原信号已经有失真了。这就是需要注意的地方。

    假如只关注采样的这些点,或信息只有这些点(比如一副N x M的二维图像),就没有所谓原来的信号,也不必关心原信号。大部分的工程应用都是如此,所以都不会有什么问题。

    我们再以一个实际例子看一下这种“失真”带来的影响。

    假设原始信号还是 furious:深入理解离散傅里叶变换(DFT) 里面的

    ,即40Hz和90Hz两个正弦信号的叠加,但是把初始相位改了一下。

    先看0.2秒内采样200点的结果,采样频率为 200/0.2=1000Hz。由于

    以及

    所以这个200点采样“想象”后扩展成周期序列和原信号是一致的,即上文所说的第一种情况,我们来看这200点的DFT(FFT)的结果。

    2ddfe723de700d77fb876d8b82b9e042.png
    原始的0~0.2s的信号

    3b3334a0ffe88ff12861e1467bfd7fd5.png
    FFT结果

    6b117a18658304490f737242371701e4.png
    Value at index:  0 (1.7763568394002505e-14+0j)
    Value at index 1:       (1.8569633000363936e-14+2.2252547978440843e-14j)
    Value at index 199:     (1.8569633000363942e-14-2.2252547978440853e-14j)
    Value at index 2:       (9.547918011776346e-15+2.5299207173645755e-14j)
    Value at index 198:     (1.1886220707651997e-14-2.4050571444046535e-14j)
    Value at index 3:       (-9.693514351633312e-15+3.490491273678388e-14j)
    Value at index 197:     (-9.693514351633318e-15-3.490491273678389e-14j)
    Value at index 6:       (4.551914400963142e-15+4.263256414560601e-14j)
    Value at index 194:     (7.064251276911843e-15-4.3066997108967254e-14j)
    Value at index 7:       (-8.476078683850144e-14-2.2348486787440525e-14j)
    Value at index 193:     (-8.476078683850144e-14+2.234848678744052e-14j)
    Value at index 8:       (70.71067811865467-70.71067811865483j)
    Value at index 192:     (70.71067811865467+70.71067811865481j)
    Value at index 9:       (3.508813072816526e-14-1.215592597591943e-13j)
    Value at index 191:     (3.5088130728165266e-14+1.2155925975919434e-13j)
    Value at index 10:      (8.650050970685519e-14-1.3987942513896568e-14j)
    Value at index 190:     (9.086399079714617e-14+1.3862209280074106e-14j)
    Value at index 11:      (6.340996313142325e-14-2.7527850486775756e-14j)
    Value at index 189:     (6.340996313142323e-14+2.7527850486775753e-14j)
    Value at index 12:      (5.220963443671392e-14-3.811367089091572e-15j)
    Value at index 188:     (5.2209634436713917e-14+3.811367089091572e-15j)
    Value at index 13:      (2.5053185950527098e-14-1.9269983332352148e-14j)
    Value at index 187:     (2.5053185950527105e-14+1.9269983332352144e-14j)
    Value at index 17:      (8.642153846944123e-14-2.3128957114594817e-14j)
    Value at index 183:     (8.642153846944124e-14+2.3128957114594826e-14j)
    Value at index 18:      (43.30127018922197-24.99999999999993j)
    Value at index 182:     (43.30127018922197+24.99999999999993j)
    Value at index 19:      (-8.0252920392197e-14+4.388609799770803e-14j)
    Value at index 181:     (-8.0252920392197e-14-4.3886097997708017e-14j)
    Value at index 20:      (4.745282733354273e-14-1.7615725461739818e-14j)

    furious:深入理解离散傅里叶变换(DFT) 里面已经提到,DFT的结果

    代表的是频率为
    的频率“分量”,
    的模与辐角表征了
    的频率“分量”的幅度与相位。仔细看上面的结果,由于原始信号本来就由两个正弦信号叠加,40Hz对应的是
    , 90Hz对应的
    ,FFT结果中第8点和18点的结果已经说明了原始信号的这两个组成,幅度与相位都不差!

    然后我们把采样的点稍微改一下,按上文所说的第二种情况,来看“想象”失真的情况。还是1000Hz的采样频率,然后采了205点,多了5点的尾巴。下面是这205点DFT的结果。

    17c4b0cbc40a1372865670325cf46527.png
    0~0.2s又多了点尾巴

    7062cd340111bbdc02fc4b1911d9a13a.png
    FFT结果不像200点的图那么尖锐了,表明有了“杂”的频谱分量

    991790db079c5946f5bcb61d576150a3.png
    有了“杂”的频谱分量
    Sample size:  205
    Value at index:  0 (5.957087957548413+0j)
    Value at index 1:       (6.030068228433837-0.015272157358793836j)
    Value at index 204:     (6.030068228433839+0.015272157358794392j)
    Value at index 2:       (6.262358768548947-0.037822084360654484j)
    Value at index 203:     (6.262358768548943+0.03782208436065382j)
    Value at index 3:       (6.700836287229996-0.07779935562844609j)
    Value at index 202:     (6.70083628722998+0.07779935562844753j)
    Value at index 4:       (7.4538392106248335-0.15350591251718748j)
    Value at index 201:     (7.453839210624833+0.1535059125171872j)
    Value at index 5:       (8.778440924568487-0.3056151540138314j)
    Value at index 200:     (8.778440924568487+0.3056151540138314j)
    Value at index 6:       (11.410771310874255-0.6496193957963805j)
    Value at index 199:     (11.410771310874257+0.6496193957963781j)
    Value at index 7:       (18.552598401300198-1.6904049339564933j)
    Value at index 198:     (18.552598401300198+1.6904049339564908j)
    Value at index 8:       (97.46791507224313-14.077921066784947j)
    Value at index 197:     (97.4679150722431+14.077921066784949j)
    Value at index 9:       (-20.89528658860018+4.807051901715209j)
    Value at index 196:     (-20.895286588600182-4.807051901715209j)
    Value at index 10:      (-7.688078109981043+2.888490068466027j)
    Value at index 195:     (-7.688078109981043-2.888490068466027j)
    Value at index 11:      (-3.8351478276217286+2.5000447095661973j)
    Value at index 194:     (-3.8351478276217286-2.500044709566197j)
    Value at index 12:      (-1.9041258847014007+2.486432545198113j)
    Value at index 193:     (-1.9041258847014007-2.48643254519812j)
    Value at index 13:      (-0.6320986607985866+2.6857740236564736j)
    Value at index 192:     (-0.6320986607985901-2.6857740236564736j)
    Value at index 14:      (0.41611572198835933+3.101754264112672j)
    Value at index 191:     (0.41611572198836155-3.101754264112672j)
    Value at index 15:      (1.510656587049075+3.8485563697540526j)
    Value at index 190:     (1.510656587049075-3.8485563697540526j)
    Value at index 16:      (3.0247939620528115+5.280488038038734j)
    Value at index 189:     (3.024793962052807-5.280488038038731j)
    Value at index 17:      (6.115611597887165+8.768440845412808j)
    Value at index 188:     (6.115611597887168-8.768440845412806j)
    Value at index 18:      (21.83877024187418+27.930832903711135j)
    Value at index 187:     (21.83877024187418-27.930832903711135j)
    Value at index 19:      (-18.985858515202462-22.684103724754106j)
    Value at index 186:     (-18.985858515202466+22.68410372475411j)
    Value at index 20:      (-6.974700029701168-8.012988665076517j)
    Value at index 185:     (-6.974700029701168+8.012988665076517j)
    Value at index 21:      (-4.313637637529757-4.858616286490589j)
    Value at index 184:     (-4.313637637529757+4.8586162864905855j)
    Value at index 22:      (-3.114226813389685-3.4863564644399414j)
    Value at index 183:     (-3.114226813389683+3.4863564644399387j)
    Value at index 23:      (-2.4199924255412038-2.7199767563742294j)
    Value at index 182:     (-2.419992425541205+2.719976756374227j)
    Value at index 24:      (-1.9621906686302601-2.2312478392964694j)
    Value at index 181:     (-1.9621906686302597+2.23124783929647j)
    Value at index 25:      (-1.6352450971121604-1.8925441210847886j)
    Value at index 180:     (-1.6352450971121604+1.8925441210847886j)
    Value at index 26:      (-1.3889295242790403-1.6439541090078476j)
    Value at index 179:     (-1.388929524279041+1.643954109007846j)

    以及
    ,40Hz和90Hz的点的index已经不是整数值了,仔细看上面的结果值,峰值还是在8和18点,但是7,9,17,19 等这些点都有了较大的值,表明这些频谱分量也有值,
    而且辐角更是和原信号的那两个初始相位没关系了多出的那点尾巴使得DFT计算表征的原信号已经和真正的原始信号出现失真,显然带入了其他的频率分量。这便是回答了问题2。

    全文完。欢迎讨论。

    展开全文
  • 前面写过一篇傅里叶变换的文章:furious:傅里叶变换...这篇文章再来写写有关离散傅里叶变换的关键点。闲言少叙,直入主题。先把DFT的式子写在这里: ,其中 原信号 的采样信号 可以用 表示为: ,其中 。这也叫DFT...
  • 四、离散傅里叶变换的性质 1、线性: 2、序列的圆周移位 调制特性: 3、共轭对称性
  • 三、离散傅里叶变换(DFT) 有限长序列的DFT正变换和反变换: DFT与序列的DTFT和Z变换的关系:
  • 离散傅里叶变换 离散傅里叶反变换
  • 离散傅里叶变换(DFS)、逆离散傅里叶变换(IDFS)的实现 代码如下,其中xn为时序序列 clc;clear; xn=[7,6,5,4,3,2]; Xk=dfs(xn,6); x=idfs(Xk,6); subplot(2,2,1);stem(0:5,abs(Xk),'filled'); axis([0,5,0,1.1...
  • 傅里叶变换(二维离散傅里叶变换)

    万次阅读 多人点赞 2018-06-15 22:22:35
    (1)可分离性: 二维离散傅里叶变换DFT可分离性的基本思想是DFT可分离为两次一维DFT。因此可以用通过计算两次一维的FFT来得到二维快速傅里叶FFT算法。根据快速傅里叶变换的计算要求,需要图像的行数、列数均满足2...
  • 5离散傅里叶变换及快速算法;5离散傅里叶变换及快速算法;5离散傅里叶变换及快速算法;5离散傅里叶变换及快速算法;5离散傅里叶变换及快速算法;5离散傅里叶变换及快速算法;1线性 如果 都是周期为N的周期序列则;5离散...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,252
精华内容 1,300
关键字:

离散傅里叶变换