稀疏傅里叶变换(sparse FFT)

2023-05-16

作者:桂。

时间: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)。打散之后就能稀疏,依据定理(可见n越大,打散的可能性越大,从这里看,sigma与B还是有关系的,sigma体现了相邻频点的最小间隔,而B决定了每个bucket的宽度):

这里是按一定概率(概率性)将频谱重排,MIT重排思路:

对应代码:


fs = 1000;
f0 = 70;
N = 256;
t = [0:N-1]/fs;
x = exp(1j*2*pi*t*f0) ;
%%*************Step1:频谱随机重排**************
sigma = 19; %inv(sigma) = 27
tao = 3;
%permutation
perm_num = mod([1:N]*sigma+tao,N)+1;
pn = x(perm_num);
  

  当然也有强制(确定性)将数据重排的思路,思路类似,只是实现方式不同:

sigma的选择主要利用性质:

这里sigma^-1是sigma关于模N的逆元(数论倒数)。该点主要说明:变化前后的完备性(信号可重建)。

 步骤二:加窗。

 这里根据筐的多少(B),平分2pi频域,即带宽2pi/B,理想窗函数为矩形窗,但时域为无限长的sinc函数,需要加窗截断,可选择gausswin。

即win = sinc.*gausswin:

这里不局限于gausswin,满足给定约束的窗函数均可:

步骤三:频域抽取并作FFT

加窗之后,保证了频谱不至于展宽严重,进一步保证了稀疏性。频域降采样:

等价于时域的混叠的傅里叶变换:

故直接在时域进行处理。处理完成后进行FFT运算。

该操作的理论基础为:

不谈加窗操作,x->p->y,可以看出x与y存在映射关系,而y的∑操作可以转化为并行,这样一来可以用多个低速率AD实现一个高速率AD的功能,前提是多个AD需要完全同步。

与上述降速率思想等价的是:如果各AD可做好同步,则多个现有AD的能力,可以做出现有AD难以完成的事。

步骤四:哈希映射

哈希映射的线索为:最终观察的数据Y(k)【即y(n)】->P(k)【即p(n)】->X(k)【即x(n)】:

第一步(y -> p)转化的理论依据:

第二步(p -> x)转化的理论依据:

序列重排后的频域变换为:

这两步解释了算法step4的参数定义:

但实际中并非第一步提到的理想情况,实际情况是:

因此存在一个频谱重建的成功概率问题:

 4章节的后半部分主要在证明这个概率问题。

步骤五~六的主要目的,引用原文的说法:

  Here are two versions of the inner loop: location loops and estimation loops. Location loops are given a parameter d, and output a set I ⊂ [n] of dkn/B  coordinates that contains each large coefficient with“good” probability. Estimation loops are given a set  I ⊂ [n] and estimate x I such that each coordinate is  estimated well with “good” probability.

 步骤五:定位循环

 d是一个参数,存在约束

原文取值为:

 该步骤的主要操作为:

将 Z ( k )中 dK 个较大值(从大到小依次排列)的坐标( k)归入集合 J 中,通过哈希反映射得到 J 的原像:

这样便得到包含原始频谱坐标的集合,迭代L次:

迭代的目的?

 

步骤六:估值循环

 对于每个k∈Ir,计算频率信息:

步骤5~6主要操作:

至此完成了稀疏FFT(sparse FFT)的整个运算过程,记作sfft_v01。

改进版都是依次大框架进行,不同点主要有三个方面:1)重排的实现思路;2)频谱的重建思路。不再一一展开。 

原文示例

该示例给出了步骤5~6的直观解释:

 

二、问题记录

仿真验证:n = 256点频信号,sigma = 19,则inv_sigma = 27,假设生成点频信号:

图1为重排的信号,图2为重排加窗(此处窗不够理想,看到长尾,论文中强调加窗,作用在于把尾巴剁掉。),图3为原始信号频谱,图4为降采样之后的频谱。可以看出重排容易引入谐波:以sigma为周期。  

原始频谱位置为k=10-1 = 9(下标从0开始),重排后对应频谱位置为mod(sigma*k,n) = 171 = 172-1,与理论分析一致。即原始k点重排后位置:

 即时域信号,x(n),重排序号perm_num = mod([1:n]*sigma,n)+1,则对应重排后的傅里叶变换,频谱顺序与原信号频谱X,经过重排序号perm_num1 =  mod([1:n]*inv_sigma,n)+1,位置始终相差1(数论倒数的性质决定):mod(sigma*inv_sigma,n)=1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

稀疏傅里叶变换(sparse FFT) 的相关文章

  • C++到底还能做什么?

    嗯 xff0c 这是一位朋友发到我邮箱里面的 xff0c 很奇怪 xff0c 发到了gmail邮箱 xff0c 而不是我常用的hotmail邮箱哈 我呢 xff0c 试着回答一下 xff0c 如果回答得不好 xff0c 叫做肖某人学艺不精
  • Docker 创建 MySQL 容器

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 拉取镜像 docker pull mysql 5 7 2 查看当前所有的镜像 docker image ls 3 创建并启动一个容器 docker run name t
  • 深入理解Arrays.sort()

    翻译人员 铁锚 翻译日期 2013年11月16日 原文链接 Deep Understanding of Arrays sort T Comparator lt super T gt c Arrays sort T Comparator lt
  • 18个实时音视频开发中会用到开源项目

    实时音视频的开发学习有很多可以参考的开源项目 一个实时音视频应用共包括几个环节 xff1a 采集 编码 前后处理 传输 解码 缓冲 渲染等很多环节 每一个细分环节 xff0c 还有更细分的技术模块 比如 xff0c 前后处理环节有美颜 滤镜
  • px4 uavcan linux,UAVCAN - UAVCAN Bootloader - 《PX4中文维基》 - 书栈网 · BookStack

    安装UAVCAN启动程序警告 xff1a 无人机控制器局域网络 Unmanned Aerial Vehicle Controller Area Network xff0c UAVCAN 设备通常在出厂时就预安装了启动程序 如果你不对UAVC
  • VISTA -MIT开源基于数据驱动的自动驾驶仿真引擎

    引言 VISTA 是MIT开源的一个基于数据驱动的用于自动驾驶感知和控制的仿真引擎 VISTA API提供了一个接口 xff0c 用于将真实世界的数据集转换为具有dynamic agents sensor suites task objec
  • 计算机管理储存u盘无法使用,解决电脑识别不出U盘的问题

    电脑识别不出U盘怎么样 要解决这个问题 xff0c 首先我们要确定的是U盘在其他电脑上使用正常 xff0c 而且你的电脑USB接口也是一切正常的 xff0c 插入电脑后虽然有反应 xff0c 但就无法正确显示出盘符 xff0c 资源管理器也
  • 介绍:成为一名 Jenkins 贡献者的旅程

    转自Jenkins 中文社区 作为一名软件工程师 xff0c 这些年来在我工作过的不同公司里用到过许多开源软件 xff08 包括框架 库 工具等 xff09 然而 xff0c 在此之前我从没有以一名贡献者的身份参与过开源项目 自从我向 Je
  • 国内嵌入式公司比较排名

    随着 ARM内核的应用越来越广泛 xff0c 从手机到电视机 xff0c 从大型工控设备到小型的家电应用 xff0c 都能找到 ARM内核的嵌入式产品 而由此引领了一番全球嵌入式领域火热的变化 xff0c 当然 xff0c 国内的嵌入式领域
  • MYSQL常用操作及python操作MYSQL常用类

    Mysql 常见操作 数据库操作 创建数据库 create database fuzjtest 删除数据库 drop database fuzjtest 查询数据库 show databases 切换数据库 use databas 1231
  • Windows Server 2008的认证监视工具

    管理证书的一个主要目标是获得企业安全的一种高级水平 应当认真对待身份和访问管理问题 在本文中 xff0c 笔者将简要地讨论认证授权 xff0c 然后探讨使用特定的证书监视工具 xff08 如PKIView msc和certutil exe
  • (转)为什么需要正则表达式 by 王珢

    为什么需要正则表达式 by 王垠 学习Unix最开头 xff0c 大家都学过正则表达式 regexp 可是有没有人考虑过我们为什么需要正则表达式 xff1f 正则表达式本来的初衷是用来从无结构的字符串中提取信息 xff0c 殊不知这正好是U
  • 无法启动程序,因为计算机丢失D3DCOMPILER_47.dll 的解决方法

    这个原因应该是windows update在更新的时出现错误导致的 解决方法是安装 KB4019990 更新包 网址如下 xff1a http www catalog update microsoft com Search aspx q 6
  • KNN cosine 余弦相似度计算

    coding utf 8 import collections import numpy as np import os from sklearn neighbors import NearestNeighbors def cos vect
  • sqlserver2017 重装过程中出现“无法找到数据库引擎启动句柄”错误的解决办法...

    sqlserver数据库引擎修改账号名 xff0c 详情参考 xff1a http blog 51cto com djclouds 2089047 utm source 61 oschina app 在SQL Server安装期间 xff0
  • python基本常用语法&函数&数据结构

    1 Python概述 1989年12月 Google工程师 Guido van Rossum为了打发圣诞节假期 开发了ABC语言的后继 并以他自己喜欢的一个情景剧 Monty Python s Flying Circus命名 Python
  • R语言中对文本数据进行主题模型topicmodeling分析

    主题建模 在文本挖掘中 xff0c 我们经常收集一些文档集合 xff0c 例如博客文章或新闻文章 xff0c 我们希望将其分成自然组 xff0c 以便我们可以分别理解它们 主题建模是对这些文档进行无监督分类的一种方法 xff0c 类似于对数
  • NLTK基础基础教程学习笔记(十四)

    对于文本分类 xff0c 最简单的定义就是基于文本内容来对其进行分类 通常情况算法是根据数字 变量特征来写的 先从https archive ics uci edu ml datasets SMS 43 SPam 43 Collection
  • ***故障错误代码列表

    故障错误代码列表 724 IPX 协议无法在此端口拨出 xff0c 因为此计算机是 IPX 路由器 725 IPX 协议无法在此端口拨入 xff0c 因为未安装 IPX 路由器 726 IPX 协议不能同时在一个以上的端口上用于拨出 727
  • 如何下载网页所有资源(附源码)

    nodejs扒取html页面中所有链接资源 前言 xff1a 总有些人 xff0c 想下载一个插件 xff0c 能直接获取浏览器显示页面的所有资源 也就是下载一个其他人的网站 xff0c 但是不想一个个复制链接的内容 xff0c 原因大致有

随机推荐