执行DFT的方法、装置和计算机设备和存储介质与流程

文档序号:29437045发布日期:2022-03-30 09:06阅读:321来源:国知局
执行DFT的方法、装置和计算机设备和存储介质与流程
执行dft的方法、装置和计算机设备和存储介质
技术领域
1.本技术涉及计算机技术领域,特别涉及一种执行dft的方法、装置和计算机设备和存储介质。


背景技术:

2.离散傅里叶变换(discrete fourier transform,dft)是计算机领域一种非常常用的技术,用于对离散的时域数据和离散的频域数据进行转换。一般在进行dft时,会采用快速傅里叶变换(fast fourier transform,fft)技术,以提高处理效率。
3.库利-图基算法是一种非常常见的fft算法,该算法以分治法为策略,将规模值较大的dft式分解(一般包括时域分解或频域分解)为多个规模较小的dft式与旋转因子的复数乘法(可称作子变换式),这些子变换式分为多级,每级包括若干个子变换式,各级按顺序执行,级内各子变换式也按顺序执行,前一级的多个输出数据会作为后一级的多个输入数据。fft可以大大简化dft的计算复杂度,可以提升dft的计算效率。
4.在实现本技术的过程中,发明人发现现有技术至少存在以下问题:
5.无论是进行时域分解还是频域分解,分解后各级的输入数据或输出数据经常是乱序排列的,即输入数据的调用顺序或输出数据的输出顺序不是按索引标识的顺序,例如,规模值为8的dft进行时域分解后第二级的输入数据的调用顺序为a0、a2、a1、a3、a4、a6、a5、a7,其中,0、2、1、3、4、6、5、7为索引标识。因为,计算机设备在由内存向缓存中复制数据的时候,是以高速缓存块(cacheline)为数据量单位进行复制的,例如,cacheline是64字节,那么计算机每次由内存向缓存中复制数据的时候即使只需要8字节的数据,也会复制连续的64字节的数据,这样,如果计算机设备调用输入数据的顺序是乱序的,就会增加整个计算过程由内存向缓存复制数据的数据量,从而,导致dft处理的效率较为低下。


技术实现要素:

6.本技术实施例提供了一种执行dft的方法、装置和计算机设备和存储介质,可以解决dft处理的效率较为低下的问题。所述技术方案如下:
7.第一方面,提供了一种执行dft的方法,所述方法包括:获取待进行离散傅里叶变换dft的初始输入数据的规模值;基于存储的该规模值对应的执行数据,按预设的执行顺序执行该规模值的dft式对应的多个子变换式,且在每执行完成一个子变换式时,确定当前执行完成的子变换式的输出数据的索引标识,将输出数据,存储至输出数据的索引标识对应的存储地址,其中,多个子变换式分为多级,任意两个数值相邻的索引标识对应的存储地址为相邻存储地址,在执行数据中,对于第一级之外的每级,级内各子变换式之间的执行顺序对应的输入数据调用顺序为输入数据的索引标识由小到大的顺序;将最后一级中的各子变换式的输出数据,确定为对初始输入数据进行dft的结果数据。
8.技术人员可以预先针对不同规模值的dft式进行时域分解或频域分解,得到多级子变换式,然后,对分解得到的子变换式进行执行顺序的调整,并对中间变量进行映射变
换,使得对于第一级之外的每级,级内各子变换式之间的执行顺序对应的输入数据调用顺序为输入数据的索引标识由小到大的顺序,得到最终的多级子变换式,然后基于此多级子变换式,确定规模值对应的执行数据。
9.在进行dft时,技术人员可以操作计算机设备输入需要进行dft的初始输入数据x=x0,

,x
n-1
,或者,技术人员在计算机设备上进行初始设置,获取实时采集的数据,每达到一定周期时长时,将当前周期时长内获取的数据作为初始输入数据。在获取到初始输入数据后,可以获取初始输入数据的规模值,该规模值可以分析初始输入数据的长度而得到,或者也可以是预先由技术人员设置。然后,可以在存储的各规模值对应的执行数据中,初始输入数据的规模值对应的执行数据,然后执行该执行数据,每执行完毕一个子变换式将输出数据存储索引标识对应的存储地址处。连续排列的存储地址对应的索引标识是由小到大排列的。这样,可以保证中间数据在作为输入数据调用时,是按存储地址连续调用的。可以提高dft的处理效率。
10.在一种可能的实现方式中,在执行数据中,每级级内旋转因子相同的子变换式是连续执行的。
11.这样,在执行一个子变换式时,将其旋转因子从内存复制到缓存中,在执行下一个子变换式时,使用的旋转因子很可能是和前一个子变换式相同的旋转因子,这是大概率可以直接从缓存读取旋转因子,从而无需重新由内存向缓存复制旋转因子,可以提高处理效率。
12.在一种可能的实现方式中,在执行数据中,对于每级,级内执行顺序在前的子变换式的旋转因子的上角标小于或等于执行顺序在后的子变换式的旋转因子的上角标。
13.在存储旋转因子的时候,可以在内存中按照旋转因子上角标由小到大的顺序对旋转因子连续存储。而且,基于执行数据的上述特点,每级在执行各子变换式时,对旋转因子的调用顺序是按上角标由小到大的顺序,这样,在执行某子变换式由内存向缓存复制前一个旋转因子时,就会将后一个或多个旋转因子复制的缓存中,这样,在执行后续子变换式需要后一个旋转因子时,可以直接在缓存中读取,无需再次从内存复制旋转因子,可以提高处理效率。
14.在一种可能的实现方式中,在执行数据中,对于任一输入位,第一级内执行顺序在前的子变换式在该任一输入位的输入数据的索引标识小于执行顺序在后的子变换式在该任一输入位的输入数据的索引标识。
15.在一种可能的实现方式中,在执行数据中,对于任一输入位,第一级内在执行顺序上相邻的两个子变换式在该任一输入位的输入数据的索引标识是数值连续的。
16.在规模值确定后,该规模值对应的子变换式中,第一级的不同的子变换式中不同输入位的输入数据的索引标识之间的偏移值是固定的,上述的排列方式可以在保持该特点的情况下,最大化初始输入数据的读缓存命中率,提高处理效率。
17.在一种可能的实现方式中,在执行数据中,对于任一输出位,最后一级内执行顺序在前的子变换式在该任一输出位的输出数据的索引标识小于执行顺序在后的子变换式在该任一输出位的输出数据的索引标识。
18.在一种可能的实现方式中,在执行数据中,对于任一输出位,最后一级内在执行顺序上相邻的两个子变换式在该任一输出位的输出数据的索引标识是数值连续的。
19.在规模值确定后,该规模值对应的子变换式中,最后一级的不同的子变换式中不同输入位的输出数据的索引标识之间的偏移值是固定的,上述的排列方式可以在保持该特点的情况下,最大化提高处理效率。
20.在一种可能的实现方式中,所述获取待进行离散傅里叶变换dft的初始输入数据的规模值,包括:获取待进行滤波处理的时域音频数据的规模值;所述将最后一级中的各子变换式的输出数据,确定为对所述初始输入数据进行dft的结果数据,包括:将最后一级中的各子变换式的输出数据,确定为所述时域音频数据对应的频域音频数据;所述方法还包括:对所述频域音频数据进行滤波处理。
21.对时域音频数据按照上述处理方式进行dft得到频域音频数据,然后对频域音频数据进行滤波处理,例如,可以滤除预设高频频段的数据,以实现降噪处理,或者,对不同频段的数据进行不同比例的衰减或增强,以实现音频特效处理,等等。
22.第二方面,提供了一种执行dft的装置,该装置包括至少一个模块,该至少一个模块用于实现上述第一方面所提供的执行dft的方法。
23.第三方面,提供了一种计算机设备,所述计算机设备包括处理器和存储器,所述存储器中存储有至少一条指令,所述指令由所述处理器加载并执行以实现上述第一方面所提供的方法。
24.第四方面,提供了一种计算机可读存储介质,包括指令,当所述计算机可读存储介质在目的服务器上运行时,使得所述目的服务器执行上述第一方面所提供的方法。
25.第五方面,提供了一种包含指令的计算机程序产品,当所述计算机程序产品在目的服务器上运行时,使得所述目的服务器执行上述第一方面所提供的方法。
26.本技术实施例提供的技术方案带来的有益效果是:
27.本技术实施例中,基于初始输入数据的规模值获取执行数据,基于执行数据,执行相应的子变换式,任意两个数值相邻的索引标识对应的存储地址为相邻存储地址,在执行数据中,对于第一级之外的每级,级内各子变换式之间的执行顺序对应的输入数据调用顺序为输入数据的索引标识由小到大的顺序。这样,输出数据存储时在存储地址上是按照索引标识顺序连续的,而且第一级以后输入数据的调用顺序也是按照索引标识的顺序,这样,第一级以后的每级在执行子变换式时调用输入数据是按照内存地址连续调用的,这样可以有效的减少由内存向缓存复制数据的次数,减少复制的数据量,提高dft处理的效率。
附图说明
28.图1是本技术实施例提供的一种计算机设备内部各处理层的结构示意图;
29.图2是本技术实施例提供的一种计算机设备内部部件的结构示意图;
30.图3是本技术实施例提供的一种调整前的蝶形网络结构图;
31.图4是本技术实施例提供的一种变量映射关系示意图;
32.图5是本技术实施例提供的一种调整后的蝶形网络结构图;
33.图6是本技术实施例提供的一种执行dft的方法的流程示意图;
34.图7是本技术实施例提供的一种执行dft的装置的结构示意图。
具体实施方式
35.本技术实施例提供了执行dft的方法,该方法可以由计算机设备实现,该计算机设备可以是包含通用处理器的硬件平台,如嵌入式设备、通用计算机、服务器。这里说到的服务器可以是一个单独的服务器也可以是一个由多台服务器组成的服务器组。计算机设备可以用来进行高性能计算(high performance computing,hpc),在hpc领域存在大量的dft运算,涉及的具体领域可以是量子物理、光谱分析、石油勘探、地震预报、天气预报、医学断层诊断等。另外,hpc挑战检测(hpc challenge benchmark,hpcc)中也将fft作为了7个banchmark之一,用于检测设备的hpc性能。如图1所示,dft运算涉及的函数会存在编译器使用的acceleration library(加速度库)下的math library(数学库)中,位于底层硬件平台(hardware platforms)和上层应用(application,app)之间。本技术实施例通过改进的fft来实现dft运算过程。
36.计算机设备可以包括处理器210和存储器220,处理器210和存储器220相连接,如图2所示。处理器210,用于获取待进行离散傅里叶变换dft的初始输入数据的规模值;基于存储器220存储的该规模值对应的执行数据,按预设的执行顺序执行该规模值的dft式对应的多个子变换式,且在每执行完成一个子变换式时,确定当前执行完成的子变换式的输出数据的索引标识,将输出数据,存储至该输出数据的索引标识对应的存储地址,其中,多个子变换式分为多级,任意两个数值相邻的索引标识对应的存储地址为相邻存储地址,在执行数据中,对于第一级之外的每级,级内各子变换式之间的执行顺序对应的输入数据调用顺序为输入数据的索引标识由小到大的顺序;将最后一级中的各子变换式的输出数据,确定为对初始输入数据进行dft的结果数据。存储器220可以用于存储不同规模值对应的执行数据,存储每一级中各子变换式的输出数据,作为下一级各子变换式的输入数据,最后一级的输出数据则作为dft最终的结果数据。处理器210可以是中央处理器(central processing unit,cpu)。存储器可以包括内存、缓存或硬盘等。
37.下面结合具体实施方式对本技术实施例中的dft处理过程进行详细说明,首先对本技术实施例的执行原理进行一下说明,并介绍一下在执行dft之前的准备工作。
38.根据离散傅里叶变换的定义,对于长度为n的复数序列x,其中,x=x0,

,x
n-1
,进行dft后得到长度为n的复数序列x,其中x=x0,

,x
n-1
,该长度即为规模值,计算公式为:
[0039][0040]
当输入数据的规模值为2的整数幂时,根据库利-图基算法可以将上述运算分解为一系列输入数据规模值为2的dft运算的组合。
[0041]
为便于理解,这里我们以输入数据的规模值为8的dft运算为例,详细说明如何对库利-图基算法进行改进。
[0042]
首先我们对规模值为8的dft式,按公式展开为:
[0043][0044][0045][0046]
[0047][0048][0049][0050][0051]
而对于规模值为2的dft式,按公式展开为:
[0052][0053][0054]
时域抽取和频域抽取是库利-图基算法中对dft式进行分解的一般方式,本技术实施例以时域抽取为例进行说明,频域抽取的情况与之类似不再赘述。通过库利-图基算法,对规模值为8的dft式进行时域抽取,逐级进行分解,得到一系列子变换式,每个子变换式为规模值为2的dft式与旋转因子的复数乘法,我们将输入数据表示为x
0-x7,输出数据表示为x
0-x7,中间两级的临时变量表示为a
0-a7,b
0-b7,将整个计算过程用蝶形网络表示,如图3所示。图中,每个虚线框表示一个section(部分),每级称作一个stage,section内部包括多个蝶形,例如,第一级,4个section,每个section内部有一个蝶形,第二级,2个section,每个section内有2个蝶形。同一stage内的不同section之间的蝶形分布是完全对称的,相同位置的蝶形的旋转因子也是完全一样的。从图3中可以看出,分解后的计算过程为:
[0055]
第一级:
[0056][0057][0058][0059][0060]
第二级:
[0061][0062][0063][0064][0065]
第三级:
[0066][0067][0068][0069][0070]
可以看出,原始的库利-图基算法在每一级的输入数据调用顺序与内存中的数据存储顺序都是不匹配的(即输入数据需要离散访问),因为,计算机在由内存向缓存中复制数据的时候,是以cacheline为数据量单位进行复制的,例如,cacheline是64字节,那么计算机每次由内存向缓存中复制数据的时候即使只需要8字节的数据,也会复制连续的64字节的数据。这样,如果计算机设备的输入数据调用顺序与内存中的数据存储顺序都是不匹
配的,每次由内存向缓存复制数据时,就会有很多数据被复制而无法被利用,就会增加整个计算过程由内存向缓存复制数据的数据量,从而,导致dft处理的效率较为低下。而如果计算机设备的输入数据调用顺序与内存中的数据存储顺序都是匹配的,那么每次由内存复制到缓存中的所有数据都会不利用上,可以很有效的减小数据复制的次数。
[0071]
举个例子,数据在内存中存储的顺序为a0、a1、a2、a3、a4、a5、a6、a7,而输入数据的调用顺序为a0、a4……
,cacheline的大小是单个数据的4倍,那么当调用a0时,由内存向缓存复制数据,复制的是a0、a1、a2、a3,紧接着会调用a4,复制的是a4、a5、a6、a7,显然第一次复制的a1、a2、a3没有被利用;而如果输入数据的调用顺序为a0、a1……
,那么当调用a0时,由内存向缓存复制数据,复制的是a0、a1、a2、a3,紧接着会调用a1,此时a1已经在缓存中,所以无需再从内存中复制数据,这样,可以大大减少复制的数据量,提高处理效率。
[0072]
计算机访存分为读操作和写操作,读操作是阻塞性的,而写操作通常是非阻塞性的,也就是不会影响后续其他计算操作的正常流水运行。
[0073]
那么,举一个例子:在对多个数据进行加一操作并写回内存的场景下,在读未命中缓存、写命中缓存的情况下,加一操作会因为数据无法及时从内存复制到缓存中,使后面的写操作推迟。解释一下读未命中缓存,处理器在需要a的时候首先会向缓存读a,如果没有,则需要将内存中的a复制到缓存中,此即读未命中,如果缓存中有a,此即读命中,在解释一下写命中,处理器在计算出a的新数值后,会在缓存中查找a,如果缓存中有a,则将缓存中a的数值更新为新数值,此即写命中,如果缓存中没有a,则将a的新数值发送给内存进行更新。那么我们来一步一步看一下这个例子,第一步,读a未命中缓存,此时,需要向内存请求a的数值,第二步,进行a加1的处理则需要等待内存返回a的数值,可见,这步出现延迟,第三步,对a的新数值进行写入,命中缓存,第四步,读b未命中缓存,此时,需要向内存请求a的数值,第五步,进行b加1的处理则需要等待内存返回b的数值,可见,这步出现延迟,第六步,对b的新数值进行写入,命中缓存。
[0074]
在这个例子中,第二步和第五步明显因为读操作未命中缓存而延迟。
[0075]
再举另一个例子:在对多个数据进行加一操作并写回内存的场景下,在读命中缓存、写未命中缓存的情况下,写操作无法及时完成却并不会阻塞后续的读操作。那么我们来一步一步看一下这个例子,第一步,读a命中缓存,第二步,进行a加1的处理,第三步,写a未命中缓存,第四步,读b命中缓存,因为向内存中写入a的新数值并不影响后续对b的读取,所以读b的操作并不会被延迟,第五步,进行b加1的处理,第三步,写b未命中缓存,因为向内存中写入b的新数值并不影响后续对其他数据的读取,所以读后续其他数据的操作并不会被延迟。
[0076]
为了解决数据离散访问导致的dft执行效率低的问题,我们将对每级中子变换式的执行顺序以及数据存储的位置做一定调整,使得中间每一级在读取输入数据时尽可能地连续访问,即输入数据调用顺序与内存中的数据存储顺序相匹配。
[0077]
首先我们对执行顺序做一定调整,使得旋转因子相同的子变换式的执行顺序相邻,如图3所示,调整方式可以是:先计算不同section的相同位置的蝶形对应的子变换式,再按section内部顺序进行遍历。例如,对于图3中的第二级来说,先执行section1的第一位置的蝶形对应的子变换式,再执行section2的第一位置的蝶形对应的子变换式,再执行section1的第二位置的蝶形对应的子变换式,最后执行section2的第二位置的蝶形对应的
子变换式。因为级内各section的蝶形分布是对称的,所以section1的第一位置和section2的第一位置可以认为是相同位置,而且他们的旋转因子相同。可选的,section内部的遍历顺序可以是按照旋转因子上角标由小至大的顺序。另外,对于存在多个section的级,在对多个section中相同位置的蝶形对应的子变换式进行排序时,可以按照相对应的输入位的输入数据的索引标识由小到大顺序排列。
[0078]
调整后的执行顺序如下:
[0079]
第一级:
[0080][0081][0082][0083][0084]
第二级:
[0085][0086][0087][0088][0089]
第三级:
[0090][0091][0092][0093][0094]
接下来我们可以考虑做一些调整,使得在第一级之外的每一级的各子变换式在执行过程中,输入数据调用顺序是按输入数据的索引标识的顺序,这样,我们只要在存储上一级输出数据段的时候将上一级的输出数据按照索引标识的顺序存储,就可以使输入数据调用顺序与上一级输出数据的存储顺序相匹配。根据上述各子变换式的执行顺序,可以看出第二级的输入数据是按[a0,a2],[a4,a6],[a1,a3],[a5,a7]的顺序调用的,为保证计算的连续性,我们将a
0-a7重新映射为c
0-c7,以保证最终按[c0,c1],[c2,c3],[c4,c5],[c6,c7]的顺序调用,第三级的输入也类似地将b
0-b7重新映射为d
0-d7,相应的射关系如图4所示。
[0095]
经过映射调整后的最终的各子变换式和相应的执行顺序如下所示:
[0096]
第一级:
[0097][0098][0099][0100][0101]
第二级:
[0102]
[0103][0104][0105][0106]
第三级:
[0107][0108][0109][0110][0111]
最终调整后的蝶形网络结构图如图5所示。
[0112]
我们可以基于上述每级包括的子变换式及其执行顺序,可以建立每级的执行数据,按级的顺序组成整个dft处理的执行数据,将此执行数据与dft的输入数据的规模值对应存储,这样,在执行某个规模值的dft处理时,就可以调用相应的执行数据,以执行dft处理。这里的执行数据有多种可能的形式,下面例举一些可能的形式:
[0113]
形式一,执行数据为执行程序代码,采用循环的方式执行,每一次循环执行一个子变换式,下一次循环时对输入数据的索引值、输出数据的索引值、旋转因子的上角标等参数进行偏移调整,得到下一个子变换式并执行。
[0114]
形式二,执行数据为执行程序代码,其中包括顺序执行的每个子变换式的执行代码。
[0115]
形式三,执行数据包括执行参数信息和执行代码框架,执行参数信息包括每个子变换式的输入数据的索引值、输出数据的索引值、旋转因子的上角标等,执行时可以按照各子变换式的执行顺序没需要执行一个子变换式时,在执行参数信息中,获取该子变换式对应的输入数据的索引值、输出数据的索引值、旋转因子的上角标等参数,添加到执行代码框架中指定的每个参数对应的位置,得到该子变换式的执行代码,并执行该执行代码。
[0116]
如果我们用二进制来表示各级输入输出数据的索引,上述各子变换式可以表示为:
[0117]
第一级:
[0118][0119][0120][0121][0122]
第二级:
[0123][0124][0125][0126][0127]
第三级:
[0128][0129][0130][0131][0132]
我们把初始输入数据的索引标识用二进制表示为[n2,n1,n0],(n0为最低比特,n2为最高比特),可以看出,第一级每个子变换式中,输出数据的索引标识相对于对应位置的输入数据的索引标识来说交换了最低比特和中间比特,即可以表示为[n2,n0,n1],例如,第一级第二个子变换式的第一位输入数据的索引标识为001,第一位输出数据的索引标识为010,显然后者是将前者的最低比特和中间比特进行交换得到的。同样地,第二级输出数据的索引标识相对本级的输入数据的索引标识来说,循环右移了一个比特,即对[n2,n0,n1]循环右移一个比特,可以表示为[n1,n2,n0]。第三级输出数据的索引标识相对本级的输入数据的索引标识来说,也循环右移了一个比特,即对[n1,n2,n0]循环右移一个比特,可以表示为[n0,n1,n2],刚好是相对初始输入数据的索引标识而言的位元翻转序。基于以上分析,在执行数据为上述形式一的情况时,建立执行数据时,可以通过输入数据的索引标识进行变换得到输出数据的索引标识。
[0133]
针对任意规模值的输入数据,也可以采用上述类似的方式对库利-图基算法分解得到的多级子变换式进行调整,这种情况分解得到的蝶形的基(即蝶形的输入数据的规模值)的大小为任意大小。
[0134]
一般来说,对于一个输入数据的规模值为n的fft运算,将其分解为n个因子f0~f
n-1
,使得f0*f1*f2*

*f
n-1
=n,则对应于n级蝶形网络的计算。
[0135]
基于时域抽取得到混合基的蝶形网络(基蝶形的基大小不固定),我们用sn来表示第x级的section数量,用bn表示第x级单个section内部的蝶形数量,用f
x
表示第x级的蝶形大小(x取值范围0到n-1,x=0对应第一级),则有:
[0136]
sn=f0*f1*f2*

*f
x-1
[0137]
bn=f
x+1
*f
x+2
*f
x+3
*

*f
n-1
[0138]
最终的数据规模为sn*bn*f
x
=n,即输入数据的规模值。
[0139]
这样,按照上述方法,先对任意规模值的dft式进行时域分解或频域分解,然后,按上述实施例内容中的阐述原则对子变换式进行重排,重排的原则是:先计算不同section的相同位置的蝶形对应的子变换式,再按section内部顺序进行遍历。用c代码可以粗略表示为(其中bufferfly(fx)为单个蝶形运算):
[0140][0141]
后续采用变量映射的方式对子变换式进行调整的处理与上面类似,此处不在累述。
[0142]
对于任意规模值的dft,下面介绍一种索引标识的表示方式:
[0143]
我们将输入数据或输出数据的索引标识表示为[a
n-1
,a
n-2


,a1,a0],它相当于一个n维矩阵,a0是最低维,a
n-1
是最高维,数据从低维到高维依次连续存储,对于其中的任一个维度aj,aj的取值范围满足条件0《=aj《fj,例如,对于n=4*5*6=120,输入数据的索引标识可以表示为[a2,a1,a0],其中,任意输入数据的索引标志的数值都要满足0《=a2《4、0《=a1《5、0《=a0《6。
[0144]
对于上面的例子,将输入数据规模n=120的整个蝶形网络分解为3级,由于具体的分解方式不止一种,假设第一级有sn=4*5=20个section,bn=1,f
x
=6;第二级有sn=4个section,bn=6,f
x
=5;第三级有sn=1个section,bn=6*5=30,f
x
=4。于是可以:
[0145]
将第一级的输入数据的索引标识表示为[bi,si,fi],其中0《=bi《bn=1,0《=si《sn=20,0《=fi《f
x
=6;
[0146]
将第二级的输入数据的索引标识表示为[bi,si,fi],其中0《=bi《bn=6,0《=si《sn=4,0《=fi《f
x
=5;
[0147]
将第三级的输入数据的索引标识表示为[bi,si,fi],其中0《=bi《bn=30,0《=si《sn=1,0《=fi《f
x
=4。
[0148]
按上述方式定义的索引标识对数据进行存储时,以第二级为例,在连续的存储地址中存储的各数据的索引标识的顺序可以为:[b0,s0,f1],[b0,s0,f2],
……
,[b0,s0,f5],[b0,s1,f0],[b0,s1,f1],
……
,[b0,s1,f5],
……
,[b0,s3,f5],[b1,s0,f0],
……
,[b4,s3,f5]。
[0149]
存储各级输入数据后,在每一级计算时,由于fi始终在最低位,因此在读取输入数据时每个蝶形的f
x
个输入数据是连续存储的,而输入数据的调用顺序也是按照上述索引标识顺序进行的,刚好能够保证从前往后完全连续地访问数据。
[0150]
上面内容对dft式的分解、子变换式的调整和执行数据的确定,进行了详细阐述,下面将阐述基于存储的不同规模值对应的执行数据执行dft处理的过程,相应的处理可以如图6所示,包括如下步骤:
[0151]
步骤601,获取待进行dft的初始输入数据的规模值。
[0152]
在实施中,技术人员可以操作计算机设备输入需要进行dft的初始输入数据x=x0,

,x
n-1
。或者,技术人员在计算机设备上进行初始设置,获取实时采集的数据,每达到一定周期时长时,将当前周期时长内获取的数据作为初始输入数据。
[0153]
例如,在进行石油勘探的时候,可以在待勘测的区域向地层以下发射探测波,并接收回波,回波为时域数据,该时域数据即可为初始输入数据。又例如,在音频滤波处理的时候,可以获取麦克风检测的音频的时域数据,作为初始输入数据。又例如,在图像滤波处理的时候,可以获取图像的时域数据,作为初始输入数据。
[0154]
在获取到初始输入数据后,可以获取初始输入数据的规模值,该规模值可以分析初始输入数据的长度而得到,或者也可以是预先由技术人员设置。
[0155]
步骤602,基于存储的该规模值对应的执行数据,按预设的执行顺序执行该规模值的dft式对应的多个子变换式,且在每执行完成一个子变换式时,确定当前执行完成的子变换式的输出数据的索引标识,将所述输出数据,存储至所述输出数据的索引标识对应的存储地址。
[0156]
其中,多个子变换式分为多级。任意两个数值相邻的索引标识对应的存储地址为
相邻存储地址,而且可以设置,这两个数值相邻的索引标识中,数值较小的索引标识对应在前的存储地址,数值较大的索引标识对应在后的存储地址。在执行数据中,对于第一级之外的每级,级内各子变换式之间的执行顺序对应的输入数据调用顺序为输入数据的索引标识由小到大的顺序。
[0157]
在实施中,计算机设备可以在存储的各规模值对应的执行数据中,初始输入数据的规模值对应的执行数据,然后执行该执行数据,对于不同形式的执行数据可以采用不同的执行方式,在上面的实施例内容中已经分别介绍了形式一、形式二、形式三对应的执行方式,可以参见上面的相关内容。
[0158]
这里说明一下,在执行dft之前,可以基于初始输入数据的规模值和单个数据的数据量,确定每一级运算需要的内存的容量,申请相应容量的内存空间。在得到输出数据后,可以在此内存空间中,将输出数据存储到其索引标识对应的存储地址,在此存储空间中,从前至后多个存储地址所对应的输出数据的索引标识是从小到大排列的。例如,输出数据包括c0、c4、c2、c6、c1、c5、c3、c7,需要存入存储空间中的8个存储位置,c0对应的存储地址为第一个存储位置的存储地址,c4对应的存储地址为第五个存储位置的存储地址,c2对应的存储地址为第三个存储位置的存储地址,等等。这种存储方式的实现方式可以是在程序代码中对存储地址设置一定的偏移量,例如,c4的存储地址可以是在c0的存储地址上向后偏移4个单位容量得到,一个单位容量为存储一个输出数据的容量。
[0159]
基于上述存储方式,每一级的输出数据在存储时都是按照索引标识由小到大的顺序排列的。而且,基于上述实施例内容中介绍的确定各子变换式的过程可知,第一级之外的每级,级内各子变换式之间的执行顺序对应的输入数据调用顺序为输入数据的索引标识由小到大的顺序。由此可见,对于第一级之外的每级,在调用输入数据时,对于存储的输入数据是按照存储地址连续调用的,这样可以大大减少由内存向缓存复制的无效数据的量,提高处理效率。
[0160]
可选的,在执行数据中,每级级内旋转因子相同的子变换式是连续执行的。
[0161]
前面的实施例内容已经进行了相应说明,在确定各子变换式的执行顺序时,每级级内旋转因子相同的子变换式是连续执行的,可以参见前面内容相应的公式。这样,在执行一个子变换式时,将其旋转因子从内存复制到缓存中,在执行下一个子变换式时,使用的旋转因子很可能是和前一个子变换式相同的旋转因子,这是大概率可以直接从缓存读取旋转因子,从而无需重新由内存向缓存复制旋转因子,可以提高处理效率。
[0162]
可选的,在执行数据中,对于每级,级内执行顺序在前的子变换式的旋转因子的上角标小于或等于执行顺序在后的子变换式的旋转因子的上角标。
[0163]
在存储旋转因子的时候,可以在内存中按照旋转因子上角标由小到大的顺序对旋转因子连续存储。而且,基于执行数据的上述特点,每级在执行各子变换式时,对旋转因子的调用顺序是按上角标由小到大的顺序,这样,在执行某子变换式由内存向缓存复制前一个旋转因子时,就会将后一个或多个旋转因子复制的缓存中,这样,在执行后续子变换式需要后一个旋转因子时,可以直接在缓存中读取,无需再次从内存复制旋转因子,可以提高处理效率。
[0164]
可选的,在执行数据中,对于任一输入位,第一级内执行顺序在前的子变换式在该任一输入位的输入数据的索引标识小于执行顺序在后的子变换式在该任一输入位的输入
数据的索引标识。可选的,对于任一输入位,第一级内在执行顺序上相邻的两个子变换式在该任一输入位的输入数据的索引标识是数值连续的。
[0165]
可以看一下上述实施例内容中最终的各子变换式,第一级的各子变换式中第一个输入位的输入数据按照执行顺序排列为x0、x1、x2、x3,第二个输入位的输入数据按照执行顺序排列为x4、x5、x6、x7。因为初始输入数据具有如下的特点,x0和x4必须在一个子变换式中,x1和x5必须在一个子变换式中,x1和x5必须在一个子变换式中,x2和x6必须在一个子变换式中,x3和x7必须在一个子变换式中。所以,上述的排列方式可以在保持该特点的情况下,最大化初始输入数据的读缓存命中率,提高处理效率。
[0166]
可选的,在执行数据中,对于任一输出位,最后一级内执行顺序在前的子变换式在该任一输出位的输出数据的索引标识小于执行顺序在后的子变换式在该任一输出位的输出数据的索引标识。可选的,对于任一输出位,最后一级内在执行顺序上相邻的两个子变换式在该任一输出位的输出数据的索引标识是数值连续的。
[0167]
可以看一下上述实施例内容中最终的各子变换式,最后一级的各子变换式中第一个输出位的输出数据按照执行顺序排列为x0、x1、x2、x3,第二个输出位的输出数据按照执行顺序排列为x4、x5、x6、x7。因为初始输出数据具有如下的特点,x0和x4必须在一个子变换式中,x1和x5必须在一个子变换式中,x1和x5必须在一个子变换式中,x2和x6必须在一个子变换式中,x3和x7必须在一个子变换式中。所以,上述的排列方式可以在保持该特点的情况下,最大化的提高处理效率。
[0168]
步骤603,将最后一级中的各子变换式的输出数据,确定为对所述初始输入数据进行dft的结果数据。
[0169]
例如,在进行石油勘探的时候,上述回波的时域数据即为初始输入数据,对该时域数据进行上述流程处理得到的结果数据为回波的频域数据,然后可以将此频域数据输入石油埋藏分析模型,得到石油埋藏相关数据,如深度、储量、位置等。又例如,在音频滤波处理的时候,上述音频的时域数据即为初始输入数据,对该时域数据进行上述流程处理得到的结果数据为音频的频域数据,然后可以对此频域数据进行滤波处理,如滤除预设高频频段的噪声数据。又例如,在图像滤波处理的时候,上述图像的时域数据即为初始输入数据,对该时域数据进行上述流程处理得到的结果数据为图像的频域数据,然后可以对此频域数据进行滤波处理,如滤除预设高频频段的数据可以对图像进行模糊化,加强预设高频频段的数据可以对图像进行锐化。
[0170]
本技术实施例中,基于初始输入数据的规模值获取执行数据,基于执行数据,执行相应的子变换式,任意两个数值相邻的索引标识对应的存储地址为相邻存储地址,在执行数据中,对于第一级之外的每级,级内各子变换式之间的执行顺序对应的输入数据调用顺序为输入数据的索引标识由小到大的顺序。这样,输出数据存储时在存储地址上是按照索引标识顺序连续的,而且第一级以后输入数据的调用顺序也是按照索引标识的顺序,这样,第一级以后的每级在执行子变换式时调用输入数据是按照内存地址连续调用的,这样可以有效的减少由内存向缓存复制数据的次数,减少复制的数据量,提高dft处理的效率。
[0171]
基于相同的技术构思,本技术实施例还提供了一种执行dft的装置,该装置可以应用于上述实施例中提供的计算机设备中,如图7所示,该装置包括:
[0172]
获取模块710,用于获取待进行离散傅里叶变换dft的初始输入数据的规模值;具
体可以实现上述提到的获取功能,以及其他隐含步骤。
[0173]
执行模块720,用于基于存储的所述规模值对应的执行数据,按预设的执行顺序执行所述规模值的dft式对应的多个子变换式,且在每执行完成一个子变换式时,确定当前执行完成的子变换式的输出数据的索引标识,将所述输出数据,存储至所述输出数据的索引标识对应的存储地址,其中,所述多个子变换式分为多级,任意两个数值相邻的索引标识对应的存储地址为相邻存储地址,在所述执行数据中,对于第一级之外的每级,级内各子变换式之间的执行顺序对应的输入数据调用顺序为输入数据的索引标识由小到大的顺序;具体可以实现上述提到的执行功能,以及其他隐含步骤。
[0174]
确定模块730,用于将最后一级中的各子变换式的输出数据,确定为对所述初始输入数据进行dft的结果数据;具体可以实现上述提到的确定功能,以及其他隐含步骤。
[0175]
可选的,在所述执行数据中,每级级内旋转因子相同的子变换式是连续执行的。
[0176]
可选的,在所述执行数据中,对于每级,级内执行顺序在前的子变换式的旋转因子的上角标小于或等于执行顺序在后的子变换式的旋转因子的上角标。
[0177]
可选的,在所述执行数据中,对于任一输入位,第一级内执行顺序在前的子变换式在所述任一输入位的输入数据的索引标识小于执行顺序在后的子变换式在所述任一输入位的输入数据的索引标识。
[0178]
可选的,在所述执行数据中,对于任一输入位,第一级内在执行顺序上相邻的两个子变换式在所述任一输入位的输入数据的索引标识是数值连续的。
[0179]
可选的,在所述执行数据中,对于任一输出位,最后一级内执行顺序在前的子变换式在所述任一输出位的输出数据的索引标识小于执行顺序在后的子变换式在所述任一输出位的输出数据的索引标识。
[0180]
可选的,在所述执行数据中,对于任一输出位,最后一级内在执行顺序上相邻的两个子变换式在所述任一输出位的输出数据的索引标识是数值连续的。
[0181]
可选的,所述获取模块,用于:
[0182]
获取待进行滤波处理的时域音频数据的规模值;
[0183]
所述确定模块,用于:
[0184]
将最后一级中的各子变换式的输出数据,确定为所述时域音频数据对应的频域音频数据;
[0185]
所述装置还包括滤波模块,用于:
[0186]
对所述频域音频数据进行滤波处理。
[0187]
需要说明的是,上述获取模块710、执行模块720和确定模块730可以由处理器实现,或者,由处理器配合存储器来实现。
[0188]
本技术实施例中,基于初始输入数据的规模值获取执行数据,基于执行数据,执行相应的子变换式,任意两个数值相邻的索引标识对应的存储地址为相邻存储地址,在执行数据中,对于第一级之外的每级,级内各子变换式之间的执行顺序对应的输入数据调用顺序为输入数据的索引标识由小到大的顺序。这样,输出数据存储时在存储地址上是按照索引标识顺序连续的,而且第一级以后输入数据的调用顺序也是按照索引标识的顺序,这样,第一级以后的每级在执行子变换式时调用输入数据是按照内存地址连续调用的,这样可以有效的减少由内存向缓存复制数据的次数,减少复制的数据量,提高dft处理的效率。
[0189]
需要说明的是:上述实施例提供的执行dft的装置在执行dft时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即执行dft的装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的执行dft的装置与执行dft的方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
[0190]
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现,当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令,在设备上加载和执行所述计算机程序指令时,全部或部分地产生按照本技术实施例所述的流程或功能。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴光缆、光纤、数字用户线)或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是设备能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质(如软盘、硬盘和磁带等),也可以是光介质(如数字视盘(digital video disk,dvd)等),或者半导体介质(如固态硬盘等)。
[0191]
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
[0192]
以上所述仅为本技术一个实施例,并不用以限制本技术,凡在本技术的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本技术的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1