信号小白 发表于 2013-5-2 21:22

关于DFT根据公式计算结果与理论结果不相符的问题求解

虽然用傅里叶相关的视频变换分析已经很久了,但一直都是利用各种直接提供的FFT函数进行计算。想踏实学习一下信号处理的基础,试验一下傅里叶变换的实现时却发现了一个奇怪的问题:根据DFT的公式自行计算一下离散信号的傅里叶变换,结果发现与现成FFT函数计算的结果相差甚远,而且与信号离散傅里叶变换的理论性质也不相符,似乎按照公式计算的结果应该是错误的。可是对照所有的资料,公式本身又并没有错误,那么请问是什么原因导致了计算的偏差呢?

以例子说明:
根据一般书籍文献,DFT的计算一般根据相关法计算:

这个公式得到的信号傅里叶变换结果是一组频域复数。其中实部意义是不同频率余弦函数的幅值,而虚部为相应频率正弦函数的幅值。因此DFT还可以根据实部虚部意义分别计算:

那么根据后面的三角函数公式我都进行了计算。信号为100Hz的正弦波,采样率1k,采集500个样本点按照上面DFT公式进行计算。同时,利用编程环境中现成的FFT函数对同样的采样信号进行了计算,得到了一下实部虚部的结果:

而FFT函数的结果:

可以看到两种方法得到的实部结果相差甚远,但虚部确实一致的(这里暂时不管幅值归一化和频率坐标的问题)。从DFT变换性质来看,显然FFT的结果100Hz的频率成分很明显,且具有0~1倍采样率频域上关于0.5倍采样率对称的特性,右半部为负频率成分。因此FFT的结果应该是没有问题的。

为了确定我在LabVIEW和Matlab中都做了这样的对比,结果是一样的。而且用第一个复数计算公式虽然得到的实部少有区别但基本特征和余弦公式结果一致。

那么究竟是什么样的原因导致了这个很多资料上列举的公式却得不到和FFT函数一致的结果呢?这个问题自己纠结了很久也不得其解,于是想借论坛宝地求助讨论一下,也许只是自己基础知识不扎实,犯了什么低级错误,还请各位前辈不吝赐教!

信号小白 发表于 2013-5-3 12:35

好吧,自己开的贴自己封。

今天和别人讨论,也是一头纠结,忽然一句话提醒了我,进而恍然大悟!这里说说我自己的理解吧。

还是根据离散傅里叶变换的性质,频域复数结果实部代表了分解的各个频率余弦成分的幅值,虚部代表正弦成分的幅值。而我用来试验的是单频正弦信号,因此理论上来说应该实部为0,虚部才是真正的信号频域成分。而实际计算结果从纵轴可以看到,基本是极小的幅值,可能这时已经是计算误差,也就是噪声了。这应该能解释为什么按照公式计算出来的结果,实部不可理解,而虚部和取模后的结果却是正确的。

不过不知道为什么FFT函数计算的结果在实部依然可以得到“信噪比”很好的结果,所以一比较就给我造成了理应得到这样的实部结果的主观映像。

一个再基础不过的公式,也能引发这么一大串纠结,着实让我感叹基础概念的重要性!此篇自问自答也就到此结束,各位看官见笑了!当然如果有您的看法,也不妨留言赐教,谢谢!

bestvishes 发表于 2014-7-23 20:55

xuexi~```~

hcharlie 发表于 2014-7-24 08:20

本帖最后由 hcharlie 于 2014-7-24 11:15 编辑

我认为你的计算有一点误差,其实远在工程精度要求之内,如果要较真,是不是π取的位数少了。
其实,你的错误在于你画图的横坐标,应该标为0~1000Hz,这样虚部的峰值正好在100,900两个点上就对了。900可以理解为-100。50,450峰值是错的。
页: [1]
查看完整版本: 关于DFT根据公式计算结果与理论结果不相符的问题求解