书接上回:稀疏傅里叶变换原理说明(一)
三、流程中各部分详解
3.3 降采样FFT
降采样指的是频域降采样,当然这一步也是在时域上进行操作的。先看公式:
$$y_{i}=\sum_{j=0}^{\frac{N}{B}-1}x_{i+Bj}$$
上述操作等价于
$$\hat{y}_{i}=\hat{x}_{i(n/B)}, 其中 i=0,1,2,3,...,B-1$$
需要说明的是,Â的含义是对信号序列A进行傅里叶变换后的结果,上同。这里举个例子:
这个例子中,N=4096,滤波器长度ω=384,分筐数B=64。这里与公式稍有出入是因为:之前在滤波器处提到,从信号序列中取出与滤波器序列长度相同的部分序列进行处理,而降采样在滤波之后,因此降采样也没必要对所有的信号序列进行处理,只需要对被滤波器取出来的那部分进行处理即可,因此公式实际为:
$$y_{i}=\sum_{j=0}^{\frac{ \omega }{B}-1}x_{i+Bj}, 其中 i=0,1,2,3,...,B-1$$
既然这一步叫降采样FFT,因此FFT是不能少的,而fft的对象就是经过了求和后的序列y。原本需要进行N点FFT运算,现在只需要进行B点FFT运算,这也是SFT提升运算速度的关键之一。
注:分筐
在SFT的理论框架中,将频谱重排和滤波操作合称为分筐。分筐的含义是指,原始信号频谱中谱线所在的位置(1~N),经过一系列变换后,变到了另一个新位置之中(1~B),每一个新位置的幅值都是由原信号频谱中N/B个位置的幅值按比例相加得到的。正因为这种相加特性,稀疏性的作用就体现出来了:因为大部分点的幅值都是趋近于0,因此每个筐中有很大概率只会有一条谱线。
论文《稀疏傅里叶变换理论及研究进展》【1】中有一张很好的图能描述以上过程:
左图中虚线是原始信号所在的位置和幅值,实线是经过滤波器卷积后频谱,总点数N=256、分筐数B=8,因此一个筐中有256/8=32个点进行相加。时域上的相加操作等效于频域上的采样操作,采样点分别是0、32、64、96、128、160、192、224,也就是右图中的结果。采样点数从256变成了8,明显是一个降低的过程,因此这一过程也被称为降采样。
3.4 定位
定位和估值问题的实质都是从B个筐中,想办法恢复或者模拟出原信号。
原信号谱线所在位置经“分筐”后变到一个新位置,是一个映射过程,又因为每个位置都和一个幅值对应,所以这个过程与“哈希映射”非常相似。利用这种思想进行信号恢复的方法称为“哈希映射法”。除了这种方法外,还有其他恢复方法,但使用“哈希映射法”居多。有的恢复方法可能不分为“定位”和“求值”,统一叫做“重构”,这也是在稀疏傅里叶变换原理说明(一)中的理论框架图将“定位”和“求值”用虚线框住的原因。
使用“哈希映射法”进行定位的流程如下。
首先,对降采样FFT后的信号序列z_hat(这个hat后缀指的是该字母Â头上的玩意,指代FFT后的频域序列,懒得编辑公式了)按照幅值大小进行排序,取出总计dK个最大值所在的坐标。这里的K指的是稀疏度,d一般是一个大于零的整数,用来确定运算精度。
这是取dK个坐标而不是K个坐标是因为:经过频谱重排、滤波器、降采样等操作,不可避免地会生成额外的频率分量,多取一些坐标利于排查出哪些“筐”中是有用信号哪些“筐”是无用信号。但d取得越大,后续计算速度就越慢。下图中的例子中,K=1,d=2,因此取最大两个值的坐标J(1)=25和J(2)=26;
由之前的分析可知,每个筐中都是N/B个频率成分的和,因此一个筐对应有N/B个坐标值,利用函数
low = mod(ceil((J(i) - 1 - 0.5) * N / B), N)
high = mod(ceil((J(i) - 1 + 0.5) * N / B), N)
确定需要进行逆映射的坐标位置的集合。本例中N=4096,B=64,一个筐中含有64个位置。J(1)=25对应的范围为1504~1567,J(2)=26对应的范围为1568~1632,再分别对这些范围内的值进行逆映射,就可以对应上原信号的频率了。逆映射公式为:
$$j=(i \ast \sigma ^{-1}) \% N$$
σ-1是σ关于模N下的逆元,而这个σ就是最开始进行频谱重排的缩放因子。
以J(1)为例,逆映射的结果是:
坐标范围 | 1504 | 1505 | 1506 | 1507 | 1508 | 。。。 | 1566 | 1567 |
原始频率 | 417 | 1700 | 2983 | 170 | 1453 | 。。。 | 2139 | 3422 |
因此,第25号“筐”中的幅值是原始信号中频率成分的位置在417、1700、2983、170。。。等的和。J(2)同理。
这里需要说明的是,这只是一次“定位”得到的结果。一个频谱重排的缩放因子σ对应一个逆元σ-1,对应B个筐,对应dK个最大值的坐标,对应dkN/B个原始信号的频率成分。SFT作为一种估计算法,是不可能单靠一次“定位”就能得到原始信号中有用频率成分的位置的,需要统计多次“定位”的结果。每个“定位”流程选取的σ和σ-1都不一样,因此每个流程中dkN/B个原始信号的频率成分也不一样。假设总共进行了L次定位,则会得到L*(dkN/B)个原始信号的频率成分坐标,统计其中出现次数大于等于L/2的数,就可以认为该数是有用信号的坐标值了。
由于篇幅限制,后续内容放在了“稀疏傅里叶变换原理说明(三)”当中。