声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

123
返回列表 发新帖
楼主: lebronze

[FFT] 长度随机的信号FFT如何实现

[复制链接]
发表于 2016-7-12 16:15 | 显示全部楼层
小白弱弱的问一句  补零和2的整数幂是啥意思
回复 支持 反对
分享到:

使用道具 举报

 楼主| 发表于 2016-7-13 10:19 | 显示全部楼层
失心控 发表于 2016-7-12 16:15
小白弱弱的问一句  补零和2的整数幂是啥意思

FFT是离散傅里叶变换的快速算法,速度提升非常大,但是FFT要求做变换的原始信号长度必须是2的整数幂才行,因此对于长度随机的信号,需要补零到2的整数幂才能应用FFT

点评

就是补一些0进去 是数据长度为2的整数次幂 对吗?  详情 回复 发表于 2016-7-13 14:06
 楼主| 发表于 2016-7-13 10:21 | 显示全部楼层
多谢各位回复,目前的解决方法是:对原始信号末尾补零到2的整数幂,在进行FFT。
时域补零,相当于频域插值,不会改变频谱的包络
发表于 2016-7-13 13:01 | 显示全部楼层
lebronze 发表于 2016-7-13 10:21
多谢各位回复,目前的解决方法是:对原始信号末尾补零到2的整数幂,在进行FFT。
时域补零,相当于频域插值 ...

你的程序只能做2的整数幂的FFT,加零的工作应由调用者去做,不能由程序本身去做,加零以后的结果肯定与不加零有区别的,从算法来看就不合适,而且也有具体问题,比如你并不能确定原来的数组空间够不够加零?

点评

笨蛋一个。  发表于 2016-7-13 21:06
发表于 2016-7-13 14:06 | 显示全部楼层
lebronze 发表于 2016-7-13 10:19
FFT是离散傅里叶变换的快速算法,速度提升非常大,但是FFT要求做变换的原始信号长度必须是2的整数幂才行 ...

就是补一些0进去  是数据长度为2的整数次幂  对吗?
 楼主| 发表于 2016-7-13 14:23 | 显示全部楼层
hcharlie 发表于 2016-7-13 13:01
你的程序只能做2的整数幂的FFT,加零的工作应由调用者去做,不能由程序本身去做,加零以后的结果肯定与不 ...

恩,我就是这么做的。在调用fft前先判断是不是2的整数幂,如果是:直接做fft;    如果不是:补零再做fft。

点评

楼主总算开窍了。  发表于 2016-7-13 21:07
搜噶 明白了 谢谢你!!  详情 回复 发表于 2016-7-13 14:39
发表于 2016-7-13 14:39 | 显示全部楼层
lebronze 发表于 2016-7-13 14:23
恩,我就是这么做的。在调用fft前先判断是不是2的整数幂,如果是:直接做fft;    如果不是:补零再做fft ...

搜噶 明白了 谢谢你!!
发表于 2016-7-14 07:17 | 显示全部楼层
本帖最后由 hcharlie 于 2016-7-14 07:29 编辑
lebronze 发表于 2016-7-13 14:23
恩,我就是这么做的。在调用fft前先判断是不是2的整数幂,如果是:直接做fft;    如果不是:补零再做fft ...


我们也可以换个思路来考虑你的问题,也就是根据你们的用处,你们对FFT速度的要求是多少?
30几年前,我们花了很大力气,在IBM-PC机上调试FFT程序,1024点FFT速度达到700ms,完成了我们的任务,而用DFT需要几十秒,是根本不行的。
现在不一样了,我们测试了我们同一个程序,在现在的普通微机上1024点FFT只需要0.1ms,以此速度计算,做DFT也只需要10ms以下了!
所以你们认真考虑一下你们对速度的具体要求是什么,如果合适是不是可以全部用DFT来完成你们的工作,放弃FFT,而满足所有任务精度的要求!DFT公式极其简单,自己编程也不难。

点评

输入序列变了,输出序列肯定跟着变化。楼主都明白了的事情,你还不赶紧搞明白。  发表于 2016-7-14 21:29
DFT没有长度的限制,一加零结果就不一样了。  发表于 2016-7-14 07:36
FFT仅仅是DFT的快速算法,这两者之间的运算结果完全是一样的。  发表于 2016-7-14 07:27
发表于 2016-7-14 08:44 | 显示全部楼层
就是计算速度上有差异呗
发表于 2016-7-14 09:41 | 显示全部楼层
lebronze 发表于 2016-7-12 14:56
多谢
我也尝试过将任意点数信号补零或者截断到2的整数幂,结果做FFT后发现相位会有变化。如下图:原始信号 ...

经过FFT之后所有的相位都会有变化,只不过一般我们用不到而已,如果你想得到准确的相位值,那么最好再做一下矫正!!!
发表于 2016-7-15 18:44 | 显示全部楼层
DSP常用算法c语言.pdf (945.31 KB, 下载次数: 5) 希望对你能有帮助,里边有DFT,FFT C程序
发表于 2016-7-16 21:03 | 显示全部楼层
本帖最后由 hcharlie 于 2016-7-19 11:08 编辑

chybeyond 提供了DFT代码,它在DFT正变换时不除N,在逆变换时除N。
这个代码不复杂,我试了一下速度,做1024点DFT需时100ms,看看能不能满足LZ的需要了。
研究一下上述代码,写得挺简单,但显然没有经过优化,本人初步速度优化以后,速度能提高5倍,到20ms左右,应该不错了。
下面是本人经过速度优化后的DFT代码,经过算例考核过。
x[ ],y[ ]为变换前的实部虚部,a[ ],b[ ]为变换后的实部虚部,n为数据长度,sign=1为正变换,=-1为逆变换。

DFT.PNG

发表于 2016-7-18 09:08 | 显示全部楼层
空口无凭  赶紧上算例  看看  否则犟也是白犟

点评

欢迎公布算例正确性与实测速度的结果。  发表于 2016-7-19 09:11
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-28 18:44 , Processed in 0.076164 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表