基本DFT变换公式:
(公式1)
然后算法优化上有FFT,即采用蝶形运算。这些可在其他网址上搜到,就不再累述。
下面主要讲一下,滑动DFT变换(SDFT)如何实现(目前网上还没有现成的,本来想自己推一遍的,后来发现有本书上有写,就稍作了一下总结。书名 《数字信号处理》[美] Richard G. Lyons 著 张建华 徐晓东 孙松林 等译)。
首先对DFT公式做了一下简单变换:
(公式2)
其中(1)m表示表示频域坐标,即对应公式1中的k;
(2)q表示第几个窗函数,即窗函数滑动了几次,q=0,1,2,3,…
ok,基本公式解释完毕,先上图理解滑动的含义
这张图是书上截图,横坐标按照时间系列顺次排列的采样点。其中(a)图上方括号表示当前时刻处理的时间窗,(b)图括号表示下一时刻要处理的时间窗。从a到b,就是在时间窗内出一个最前面的点(图中由黑点变为空心点),然后再在最后面加上一个新的点(图中由空心点变为黑点),其他点的相对位置都是不变的。令当前时刻的窗函数(a图)为第0个窗函数,即q=0,那么b图中的q就是1。
那么按照公式2的写法,任意时间窗q时,公式改写为:
(公式3)
再次变形,q时刻下一个q+1的公式为:
(公式4)
令 p=n+1,则
(公式5)
将公式5进行推导(Σ中,添加p=0项,移除p=N项):
(公式6)
整理后得到最终迭代公式:
(公式7)
理论上,具体操作上,可以采用如下步骤计算SDFT:
(1)计算q=0的SDFT即DFT,可以自己写函数,或者调用库函数,甚至FFT
(2)在获得的频谱(复数谱)基础上,采用公式7进行迭代。
举例:
步骤(1)中获得m=0,…,9,共计10个频谱点,
第一个点就用公式7中m=0,即
如此循环10次,即可得到新的频谱图。迭代中注意去区分 频谱点X 和 时域点x 之前的区别即可。因为迭代中不会出现数字累计而后超过定义最大值(如int16,max=2^15)的问题,所以公式7直接可用。