作者:桂。
时间:2018-01-06 14:00:25
链接:http://www.cnblogs.com/xingshansi/p/8214122.html
前言
对于数字接收来讲,射频域随着带宽的增加,AD、微波、FPGA资源的需求越来越高,但频域开的越宽并不意味着频谱越宽,有限信号内可认为信号在宽开频域稀疏分布,最近较为流行的稀疏FFT(SFFT)是在传统FFT的基础上,利用了信号的稀疏特性,使得计算性能优于FFT。本文简单记录自己的理解。
一、稀疏FFT
主要是12年MIT的论文:Simple and Practical Algorithm for Sparse Fourier Transform。
核心思想:
SFT 作为这样一种“输出感知”算法,其核心思路是按照一定规则 Γ ( • )将信号频点投入到一组“筐”中(数量为 B,通过滤波器实现 ) . 因频域是稀疏的,各大值点将依很高的概率在各自的“筐”中孤立存在 . 将各“筐”中频点叠加,使 N 点长序列转换为 B点的短序列并作 FFT 运算,根据计算结果,忽略所有不含大值点的“筐”,最后根据对应分“筐”规则,设计重构算法 Γ -1 ( • )恢复出 N 点原始信号频谱。
算法流程:
步骤一:选定一个sigma,实现数据频域重排。
频域重排主要是因为FFT之后,频域大值集中在一起,需要将这一伙打散,保证频域的稀疏性(sparse)。sigma的选择主要利用性质:
这里sigma^-1是sigma关于模N的逆元。该点主要说明:变化前后的完备性(信号可重建)。
步骤二:加窗。
这里根据筐的多少(B),平分2pi频域,即带宽2pi/B,理想窗函数为矩形窗,但时域为无限长的sinc函数,需要加窗截断,可选择gausswin。
即win = sinc.*gausswin。
步骤三:频域抽取并作FFT
加窗之后,保证了频谱不至于展宽严重,进一步保证了稀疏性。频域降采样:
等价于时域的混叠的傅里叶变换:
故直接在时域进行处理。处理完成后进行FFT运算。
该操作的理论基础为:
步骤四:哈希映射
主要就是(4)~(6)的操作,这个就比较直观了。
code(仅供参考)
clc;clear all;close all; %%*************Step0:生成信号************** fs = 1000; f0 = 100; N = 256*256; t = [0:N-1]/fs; x = exp(1j*2*pi*t*f0); %%*************Step1:频谱随机重排************** sigma = 19; %inv(sigma) = 27 pn = []; for i = 1:sigma data = x(i:sigma:end); pn = [pn data]; end %%*************Step2:加窗************** %加窗函数,窗函数频谱宽度与B的尺寸有关,宽度理论上为2*pi/B %此处B取32 B = 32*32; n0 = -N/2:N/2-1; G = sinc(pi/B*n0).*gausswin(N)‘;%2*pi/B %滤波 pn = pn.*G; % figure() % plot(abs(fft(G))); %%*************Step3:FFT降采样************** %降采样序列 yn = sum(reshape(pn,B,N/B),2); figure() plot(abs(fft(yn))); %%*************Step4:频率估计************** %根据Hash映射 [val,hk] = max(abs(fft(yn))); k_est = round(hk*N/sigma/B); % omega_k = sigma*k-hk*(N/B); [~,k_real] = max(abs(fft(x))); disp([k_real k_est])