具体实施方式
在根据相关技术的基4FFT运算过程中,由于每级处理的数可能会从存储地址中相隔很远的地址中取数据,同时各级蝶形运算计算的结果在存取时可能与原数据地址产生冲突,从而会增大处理延迟,并且会浪费存储空间。考虑到该问题,本发明提出,在进行FFT运算过程中,根据在时频域转换地址维度来控制各个维度上的运算顺序,通过蝶形运算结果转置存储的方式避免地址冲,省去了中间的存储,使各级之间蝶形运算数据的转换精简快捷,同时减小了时序资源的消耗,降低了处理延迟。
下面将结合附图,详细描述本发明的实施例。
方法实施例
在本实施例中,提供了一种傅里叶变换的实现方法,用于通过多级蝶形运算单元实现流水傅里叶变换。
如图1所示,根据本实施例的傅里叶变换的实现方法包括:
步骤S102,多级蝶形运算单元中的其中一级蝶形运算单元对向该蝶形计算单元输入的数据计算完成后,按照预定顺序对计算得到的计算结果(例如,4个4输出)分组并对每组计算结果进行转置操作,其中,该蝶形运算单元为多级蝶形运算单元中第一级蝶形运算单元和最后一级蝶形运算单元之外的蝶形运算单元,可称为中间级蝶形运算单元,其中,本步骤中的分组是指在转置之前需要将计算结果中的数据以一定顺序或方式进行组合,得到多个分组,之后需要对每个分组内的数据进行转置,这种分组的过程是逻辑上的分组,并不是物理上的分组;
步骤S104,将转置操作后的计算结果存储至随机存储器中,以供本级蝶形运算单元的下一级蝶形计算单元对转置操作后的计算结果进行计算;其中,在转置操作后的计算结果中,由下一级蝶形运算单元在一个周期内计算的数据在随机存储器中的存储位置相同,并且转置操作后的计算结果中归属于同一蝶形计算单位的数据分布在随机存储器的预定位置处;也就是说,对于大小为4*4的计算单位,在下一级蝶形运算单元每一个周期读取4个数据的情况下,同一周期内需要读取的4个数据应当位于随机存储器相同地址处;
通常,随机存储器的数量可以为多个,假设有四个随机存储器,此时,这四个数据在四个随机存储器中各存储一个,不重复存储,并且均存储在相同的地址处,通过四个周期,下一级蝶形运算单元会将该计算单位的16个数据全部读取出来。
步骤S106,以蝶形计算单位为单位,下一级蝶形运算单元在每个周期内从随机存储器(各个随机存储器)中的预定位置处(同一预定位置处,例如,4个存储器的第n个存储位置处)读取当前周期需要进行计算的数据并对读取的数据进行计算。
并且,对于每一级蝶形运算单元,在对全部数据计算完成后,可以用计算的结果全部覆盖随机存储器中原先存储的数据。
具体地,中间级蝶形运算单元对计算结果进行转置的处理具体包括:
以预定间隔从未转置的计算结果中抽取数据,得到多个蝶形计算单位;
对于多个蝶形计算单位中的每一个,对蝶形计算单位进行矩阵转置,并将转置后的蝶形运算单位存储至随机存储器中蝶形计算单位对应的预定位置处,即,该蝶形计算单位转置后的存储位置不会发生改变,但是该计算单位的存储位置上的数据是按照转置后的数据排序。
上述随机存储器的数量通常可以为四个,并且该方法可以进一步包括:
预先将待计算数据(未输入至多级蝶形运算单元进行计算的数据)划分为四部分,对这四个部分中每个部分的待计算数据进行位倒序,交换第二与第三个随机存储器编号,并将位倒序后的待计算数据存储至随机存储器。
具体地,根据以下公式对待计算数据进行划分:
其中,其中,n为所述写入随机存储器中的待计算数据的序号,且
c
n为所述待计算数据,
为写入的随机存储器的数据地址,
为写入的随机存储器的编号,划分后的数据通过以下公式表示:
其中,m为随机存储器编号,且m=0、1、2、3。
并且,对于编号为m的随机存储器,存储的数据为
所表示的数据,其中,通过将
所表示的数据与
所表示的数据所在的存储位置交换来对四个部分的待计算数据进行位倒序。
每个蝶形运算单元所对应的预定位置在随机存储器中可以以上述预定间隔分布,也可以连续分布,下面将详细描述这两种分布情况下的处理过程。
方式一,在每个蝶形运算单元所对应的预定位置在随机存储器中以预定间隔分布的情况下,根据以下公式对中间级蝶形运算单元的计算结果进行转置,并将转置后的结果存入该蝶形运算单位转置前的存储位置,也就是说,将转置后的结果存入原转置前取该组数据的存储空间:
其中,em表示中间级蝶形运算单元进行计算前编号为m的随机存储器中地址编号n处写入的数据的列向量,fm表示中间级蝶形运算单元进行计算和转置后编号为m的随机存储器中地址编号n处存储的数据的列向量,r表示当前蝶形运算的级数(即,r表示是做第几级蝶形运算)。
方式二,在每个蝶形计算单位所对应的预定位置在随机存储器中连续分布的情况下,对中间级蝶形运算单元的计算结果进行转置的操作具体包括:。将随机存储器中存储的中间级蝶形运算单元计算前的数据en m列为:
根据以下公式对计算后存储至随机存储器中的数据进行转置:
其中,[e4·i m e4·i+1 m e4·i+2 m e4·i+3 m]为随机存储器中存储的未经中间级蝶形运算单元计算的数据,[f4·i m f4·i+1 m f4·i+2 m f4·i+3 m]表示由中间级蝶形运算单元对[e4·i m e4·i+1 m e4·i+2 m e4·i+3 m]进行蝶形计算后得到的结果;
根据以下公式对计算后得到的结果进行重组:
将对经过转置的数据进行重组后的结果写入随机存储器中,以供下一级蝶形运算单元读取。
最后,在最后一级蝶形运算单元输出的计算结果为位倒序的情况下,对最后一级蝶形运算单元输出的计算结果进行位倒序操作,从而保证最终输出的数据是顺序输出的。
为了解决存储每级(第m级)蝶形运算结果以及以最快速度在下级(第m+1级)蝶形运算时取所需的蝶形运算输入数据,并且前后两级之间的数据读写不能冲突,消耗延迟最小。采用了下述办法,在发明方案中具体详述,严格的步骤见具体实施方式:
下面将对上述的方式一和方式二下的处理过程分别进行详细描述。
方式一
1.假设,对输入的N点的数据{a
n}进行FFT运算,先将此数据前补
个0,在此数据后补
个0,得到长度为4的整数次幂的{b
n},然后对{b
n}进行
级的基4 FFT运算。
2.其中,如果是计算IFFT,则还需要将{bn}的实部和虚部交换,若计算FFT,则{bn}维持原样,得到{cn},即:
初始化FFT蝶形运算级序号r,令r=0;
令r=r+1;
之后,将划分的数据存储至RAM中,具体地,将
存储进第一个RAM,将
存入第二个RAM,将
存储进第三个RAM,将
存入第四个RAM。
在每个RAM的写入中,若输入数据是顺序的,则以位倒序的顺序写入(即,对顺序的数据进行位倒序后写入,保证写入的数据为位倒序后的数据);若输入数据是位倒序的,则直接以位倒序的顺序写入,得到写入的数据:
其中,m是RAM标号,n为RAM中的地址序号,若是以位倒序写入RAM,则有:
其中,若将n在二进制下表示为N位的n=(bN-1bN-2…b0)N,则bitrev(n)=(b0b1…bN-1)N
4.假设当前为第r级FFT/IFFT,按一定顺序取出每个RAM相同地址的四个数,即n固定的en m(m=0,1,2,3),并送入蝶形单元进行蝶形运算,得到
其中,蝶形运算(butterfly)的计算规则如下:
其中Xr为第r+1级蝶形运算数据。
5.每四组蝶形运算的结果先用寄存器寄存,再经过转置(且转置数据在每个RAM中并不一定在相邻地址)存入原来取这四组蝶形运算输入数据对应的存储区域。假设对于每个n,e
n m(m=0,1,2,3)与f
n m(m=0,1,2,3)都表示成列向量,即分别表示为
与
可以得到:
其中,等式两边都是方阵,[]T为矩阵转置运算;通过转置处理,使得后续的蝶形运算单元可以方便地读取随机存储器中存储的数据,从而有效节省存储资源并降低处理延迟。
6.判断,假如
转到步骤4继续执行,否则转到步骤7。
7.若是计算IFFT,则将{bn}的实部和虚部交换,若计算FFT,则{bn}维持原样,得到{cn}:
8.按第1~4个RAM的顺序,每个RAM以顺序依次将最后的数据读出,就得到最终计算的IFT/IFFT结果。
下面将以64点基4FFT运算为例进行说明方式一的处理方式。
64点的基4FFT有三级运算,构造一个流水的基4运算单元一共需要3*16=48次运算,假设输入蝶形运算的数据顺序如表1所示:
表1输入FFT蝶形运算单元的逻辑顺序
如表1所示,表格中内容为输入FFT运算的数据的输入顺序的序号,n2为表格的行索引,(n1,n0)为表格的列索引,其组合(n2,n1,n0)为该组FFT输入数据的序号的四进制表示(该序号的十进制表示为表中按照顺序排列的的0~63):n2位于输入数据四进制序号的最高维,即0~3,可用R0到R3表示,其表示该组输入序列存入的四个RAM的序号(即,能够唯一标识是哪个RAM);(n1,n0)位于输入数据四进制序号的低维,其二进制表示为A[3:0],正好是输入数据在每个RAM中的二进制存储地址;而且假设数据是按照上表的顺序输入蝶形运算的四个输入口(对应于上表的各行,行标为n2),为了方便同址运算(可以复用中间的乘法结果,节省资源),应交换R1和R2(实际是位倒序的高维操作,把n2的二进制表示进行位倒序排列),即R0、R1、R2、R3变为R0,R2,R1,R3,以位倒序地址对RAM写入,按表2所示的顺序读出:
表2第一级蝶形运算单元的输入信号顺序
此时,总的二进制地址高2位(即RAM序号n2)为位倒序,低位(四进制(n1,n0))为顺序,必须按照位倒序将各个蝶形运算结果输出才能进行下一级蝶形运算)。实际的做法是将上表各列数据输入最小蝶形单元进行运算,再将各列的运算结果按照位倒序输出,这样RAM标号和RAM内地址都做了位倒序排列,相当于整个序列作了位倒序排列。等效于或者直接按照以下顺序输入计算蝶形后直接读出(表3中的内容是存储在RAM中相应位置的数据与表2中原始数据的映射关系):
表3第一级蝶形运算单元等效输入信号(根据顺序如表3按位倒序写入,以顺序地址从RAM读取)
然后按照第一级迭代公式进行蝶形运算:
公式(1)
需要迭代的基4 FFT运算的每一级蝶形每组输入数都需要四个数(四进制下其他位不变,当前级数下当前维度序号以0,2,1,3顺序变化,输出当前维度的当前序号则以0,1,2,3变化,即,最小蝶形单元也是输入位倒序输出顺序),因此位倒序操作需要首先将R1,R2交换,然后在每个RAM内部完成地址的位倒序操作,得到位倒序后地址为B[3:0]=A[0:3],下一级蝶形运算的输入数据地址读取以B地址操作。
在公式(1)中,对FFT运算,n2,n1,n0表示时域各四进制位,即时域各维度,k2,k1,k0表示频域各四进制位,即频域各维度,X(n0,n1,n2 )为位倒序排列的FFT输入数据,W4为第一级蝶形运算的蝶形因子,X0(k2,n1,n2 )为第一级蝶形运算输出结果,可以看到经过第一级蝶形运算后,第一级蝶形计算的输入数据n2维度已经变为了输出数据k0维度,其等效RAM数据的序号如下表所示(表3中的指标n0表示当前的时间维n0待计算,其相应存储位置将变成频率维;表4中上半部分前4列(下文中简称为前4列)的指标k2表示蝶形运算已将当前时间维数据计算完毕,计算前当前时间维n2已转化为当前频率维k0):
表4第一级蝶形运算单元输出结果(中间数据)
如表3所示数据流依次以{0,16,32,48},{8,40,24,56},...{15,47,31,63}输入到FFT的基4基本蝶形运算单元,可以顺利进行计算,如表4输出中间结果。但是当第一级运算完成后,第二级运算开始时,需要输入第二级蝶形单元数据是{0,8,4,12}等等(如表4中上半部分的前4列数据所示),但是这四个数据出现在同一个RAM中,无法在一拍将4个数据从一个RAM中读出,因此需要进行转置操作。
具体的转置过程如下:考虑第二级蝶形运算的输入数据如{0,8,4,12}等数据,所以在将第一级蝶形运算输出到各个RAM的同一地址的数据流方式从原来的{0,32,16,48},{8,40,24,56},{4,36,20.52},{12,44,28,60}(用于转置的第一组蝶形输出)改为{0,8,4,12},{32,40,36,44},{16,24,20,28},{48,56,52,60}等(如表4中前4列部分蝶形运算输出数据,按照表6中箭头所指的部分数据顺序写入),即,数据读取方式如表4所示,写入顺序如表5所示:
从第一列开始,每4列为一个第二级运算的16元素的基本蝶形单位,也就是说,表4所示数据流中的前4*4格就是第二级运算的第一组数据,将第一级的FFT的结果延迟4拍,获得4组输出{0,32,16,48},{8,40,24,56},{4,36,20.52},{12,44,28,60}通过数据交换,即,通过矩阵转置,前四列部分反映了这种转置,其他数据的转置与此类似,之后将本级蝶形运算输出存到{0,8,4,12},{32,40,36,44},{16,24,20,28},{48,56,52.60}等等,获得第二级输入数据,这里需要说明的是,因为每个RAM内地址是位倒序,所以指标变化是n1先与n2,所以指标n1和k2交换是表4所示的前4列数据表示的矩阵的转置,转置结果如表5所示:
表5从第二级蝶形运算单元输入数据(转置后对RAM写入)
表5中前4列数据为一组4^2=16个元素的第二级基本蝶形单位,它包含4个最小的4输入蝶形运算,其最小蝶形运算的输入数据为这16个一组的蝶形运算的模4标号的四组4输入数据。在整个第二级运算中,这个第二级基本蝶形单元进行了4次,中间时域元素只与n0有关而与n2无关,重复的是n0的四次(n2已经累加完毕)。
然后同时按同一地址并行读出四个RAM的相同地址下的数据,送入蝶形单元,进行第二级FFT蝶形运算:
得到表7所示的输出数据:
表7从第二级蝶形运算单元输出数据(需要寄存的中间结果)
如表7所示,上述数据按照n0维度的顺序计算k2(表7中(0,0)、(0,2)、(0,1)、(0,3)所对应的指标,即,(0,0)、(0,2)、(0,1)、(0,3)所在位置就是当前计算的计算单位在存储器中的预定位置,该位置以4为间隔分布,在计算时也应当以4为间隔抽取),即,先(0,0)、(0,2)、(0,1)、(0,3)的数据的蝶形,计算完{0,8,4,12},{32,40,36,44},{16,24,20,28},{48,56,52,60}后再转置存入相应位置,之后计算(1,0)、(1,2)、(1,1)、(1,3),再计算(2,0)、(2,2)、(2,1)、(2,3),最后计算(3,0)、(3,2)、(3,1)、(13,3),因为各RAM内部数据是位倒序排列,且这次要交换到fft蝶形单元的计算指标位于(k2,n2)的低位n2,低位n2在每个RAM地址内部是比k2后变的,所以计算完毕后存入在上表(k1,n2)的维度转置成为(n2,k1),所以根据上述计算的分组进行转置,存储到原存储空间),存储得到表7所示的结果:
表7对第三级蝶形运算单元输入数据(转置后对RAM写入)
如表7中(0,0)、(0,2)、(0,1)、(0,3)所对应的数据,在每个RAM中各组地址并不相邻(即,(0,0)、(0,2)、(0,1)、(0,3)所属的计算单位在存储器中存储的预定位置是不连续的),当n2=0时的转置方式如下:
接下来,每一拍读出同一地址的四个蝶形输入数据,再按照第三级蝶形运算计算公式计算:
之后得到的四个输出同样写入四个RAM相同的地址处,当前维数如下:
表8从第三级蝶形运算单元输出数据(需要寄存的中间结果寄存)
之后,将最后一级结果如前进行k1和k2的转置变(k1,k0,k2)为(k2,k0,k1)在每个RAM内按照位倒序读出(即(k0,k1)变为(k1,k0)),继续操作,则得到最后的FFT数据流,最后输出数据的维度如表9所示:
表9从第三级蝶形运算单元输出的数据(调整顺序后读出)
上表的指标顺序和输入时的位倒序是一致的,但是各维已经转换到了时域,且时域为顺序,从各个RAM依次轮流读出数据即为最后顺序输出的FFT处理。
方式二
1.与方式一类似,首先,对输入的N点的数据{a
n}进行FFT运算,先将此数据前补
个0,在此数据后补
个0,得到{b
n},然后对{b
n}进行
级的基4 FFT运算。
2.如果是计算IFFT,则将{bn}的实部和虚部交换,若计算FFT,则{bn}维持原样,得到{cn}:
初始化FFT蝶形运算级序号r,令r=0;
令r=r+1;
3.以为规则将{cn}按顺序分成四份,即:
具体地,将
存储进第一个RAM,将
存入第二个RAM,将
存储进第三个RAM,将
存入第四个RAM。
在每个RAM的写入中,若输入数据是顺序的,则以位倒序顺序写入;若输入数据是位倒序的,则以位倒序顺序写入,得到写入的数据:
其中m是RAM标号,n为RAM中的地址序号,若是以位倒序写入RAM,则有:
其中若将n在二进制下表示为N位的n=(bN-1bN-2…b0)N,则bitrev(n)=(b0b1…bN-1)N
4.假设当前为第r级FFT/IFFT,按一定顺序取出每个RAM相同地址的四个数,即n固定的en m(m=0,1,2,3),送入蝶形单元进行蝶形运算,得到
蝶形运算的计算规则如下:
其中Xr为第r+1级蝶形运算数据。
5.每四组蝶形运算的结果先用寄存器寄存,再经过转置(与之前描述的方式一不同,在方式二中,转置后的数据在每个RAM中一定在相邻地址)存入原来取这四组蝶形运算输入数据的存储区域。
假设对每个n,e
n m(m=0,1,2,3)与f
n m(m=0,1,2,3)都表示成列向量,即
与
之后,将e
n m(m=0,1,2,3)拍列成为:
然后计算将由[e4·i m e4·i+1 m e4·i+2 m e4·i+3 m]蝶形运算得到的[f4·i m f4·i+1 m f4·i+2 m f4·i+3 m]进行转置存取,即:
其中,等式的两边都是方阵,[]T为矩阵转置运算,右下级指标表示各级运算之间的递推关系。
6.对之前转置后的结果进行地址重组,即,重新排列步骤5中计算得到的数据的位置,之后,根据计算得到的位置将数据存入RAM,具体地,可以按地址模4抽取RAM排列的内容,先排列地址模0的数据,再依次排列地址模1、模2、模3的数据,具体参照以下公式:
从而便于后续蝶形运算单元读取数据,避免复杂的中间存储以及所产生的地址冲突。
8.若是计算IFFT,则将{bn}的实部和虚部交换,若计算FFT,则{bn}维持原样,得到{cn}:
9.按第1~4个RAM的顺序,每个RAM以顺序依次将最后的数据读出,就得到最终计算的IFT/IFFT结果。
本发明的技术方案:
方案二
下面将以64点基4FFT运算为例进行说明方式二的处理方式。
64点的基4FFT有三级运算,构造一个流水的基4运算单元一共需要3*16=48次运算,假设输入蝶形运算的数据顺序如表10所示:
表10输入FFT蝶形运算单元的逻辑顺序
如表10中所示,R0到R3表示四个RAM中存储的数据,0~63表示的是RAM中存取的64点FFT数据,设定RAM地址A[3:0];而且假设数据是按照上表的顺序输入蝶形运算的四个输入口(对应于表10的各个行),为了方便同址运算(可以复用中间的乘法结果以节省资源),应交换R1和R2(执行位倒序的高维操作),基本的运算顺序如表11所示:
表11第一级蝶形运算单元的输入信号(以位倒序地址对RAM写入,按表11所示的顺序读出)
其中,总地址高2位(即RAM序号n2)进行了位倒序,而低位(n1,n0)为顺序,需要按照位倒序将各个蝶形运算结果输出之后再进行下一级蝶形运算。实际的做法是将上表各列计算最小蝶形,再按照位倒序输出,等效于按照表12所示的顺序输入计算蝶形后直接读出(表中的内容是存储在RAM中相应位置的数与表10中原始数据的映射关系):
表12第一级蝶形运算单元的等效输入信号(各蝶形顺序按位倒序写入,以顺序地址从RAM读取)
然后按照第一级迭代公式进行蝶形运算:
需要进行迭代的基4 FFT运算的每一级每组数都需要四个数(四进制下其他位不变,当前级数下当前维度序号以0、2、1、3顺序变化,输出当前维度的当前序号则以0、1、2、3变化,即最小蝶形单元也是输入位倒序输出顺序),位倒序操作需要首先将R1,R2交换,然后将RAM内部完成地址反序操作,舍得位倒序后地址为B[3:0]=A[0:3],后续地址读取以B地址操作。
对FFT,n2、n1、n0表示时域各四进制位,即,时域各维度,k2、k1、n0表示频域各四进制位,即频域各维度。第一级蝶形计算的n2维度已经变为了k0维度,其等效RAM数据的序号如下表所示(前4列表示当前维度已经计算完毕,已转化为频率维):
表13第一级蝶形运算单元的输出结果(中间数据)
如上表数据流依次以{0,16,32,48},{8,40,24,56},...{15,47,31,63}输入到FFT的基4基本蝶形运算单元进行计算。但是当第一级运算完成后,第二级运算开始时,需要输入第二级蝶形单元数据是{0,8,4,12}等等,但是这四个数据出现在同一个RAM中,无法在一拍将4个数据从一个RAM中读出,有鉴于此,需要进行转置操作。
首先考虑第二级的数据{0,8,4,12}等数据,所以在将第一级的数据流方式改为{0,32,16,48},{8,40,24,56},{4,36,20.52},{12,44,28,60}...数据读取方式如表13所示(从第1列起按列读取)。
上面所示数据流中的前4*4格就是第二级运算的第一组数据,将第一级的FFT的结果延迟4拍,获得4组输出{0,32,16,48}、{8,40,24,56}、{4,36,20.52}、{12,44,28,60}通过数据交换,即矩阵转置,例如,如表14中的前4列所对应的数据所示,将{0,8,4,12}存到{0,32,16,48}中,以此类推,获得第二级输入数据,如表14所示:
表14从第一级蝶形运算单元的输出数据(转置后对RAM写入)
表14中前4列为一组4^2=16个元素的第二级基本蝶形单位,其他基本计算单位依此类推,每个基本的计算单位包含4个最小的4输入蝶形运算,其最小蝶形运算的输入数据为这16个一组的蝶形运算的模4标号的四组4输入数据。在整个第二级运算中每组这个第二级基本蝶形单元进行了4次,因为中间时域元素只与n1有关而与n0无关,重复的是n0的四次可能,即,重复四次(n2已经累加完毕)。
在这一级,数据流需要变换,四组输出{0,8,4,12},{2,10,6,14},{1,9,5,13},{3,11,7,15},数据读取变为了每个RAM中的数据为隔4抽取,送入蝶形单元,即,抽取(0,0)、(0,2)、(0,1)、(0,3)所对应的数据,之后抽取(1,0)、(1,2)、(1,1)、(1,3)所对应的数据,再抽取(2,0)、(2,2)、(2,1)、(2,3)所对应的数据,最后抽取(3,0)、(3,2)、(3,1)、(3,3)所对应的数据(即,对于同一计算单位的数据,例如,(0,0)、(0,2)、(0,1)、(0,3)的列索引所属的计算单对应的数据位在存储器中的预定位置为连续分布),得到表15所示的数据:
表15第二级蝶形运算单元的输入数据顺序(按4抽取后的数据)然后进行第二级FFT蝶形运算:
得到的中间结果如表16所示,需要转置存入相应空间:
表16第二级蝶形运算单元的计算结果(中间结果)
将第二级的FFT结果延迟4拍,通过数据交换(先寄存下来再转置送入相应单元),获得第三级的输入数据,即将表15中的(k2,n1)指标转换成了表16中的(n1,k2)指标后进行存储,如表17所示:
表17第二级蝶形运算单元输出数据顺序(转置写入)
之后,继续进行隔4读取,得到数据如下:
表18第三级蝶形输入数据顺序(隔4读取后)
接下来再按照第三级蝶形运算计算公式计算:
对于最后一级蝶形运算,数据流方式不变换,数据也不进行交换,运算完成以后,下一个FFT进行上面的反向过程,本级将数据存成如下格式:
表19第三级蝶形运算单元输出的数据顺序
然后将表19所示结果的各个RAM内数据按照位倒序排列,这得到最终结果:
表20第三级蝶形运算单元输出排列后的数据
表20所示的指标顺序和输入时的位倒序是一致的,但是各维已经转换到了时域,且时域为顺序,从各个RAM依次轮流读出数据即为最后顺序输出的FFT处理。
下面将以1024点基4 FFT运算为例描述方式二的处理过程:
类似64点运算,第一级读地址采用顺序地址反序产生,即B[7:0]=A[0:7],如{0,128,64,192}对应{0,4,8,12},{0,256,512,768}对应{0,2,1,3},但是为了进行同址运算,实际上进行第一级蝶形进行操作的时候是FFT输入R1进第一级蝶形R2,R2与R1交换,得到表21所示的数据:
R0 |
0 |
128 |
64 |
192 |
32 |
160 |
96 |
224 |
16 |
144 |
R1 |
256 |
384 |
320 |
448 |
288 |
416 |
352 |
480 |
272 |
400 |
R2 |
512 |
640 |
576 |
704 |
544 |
672 |
608 |
736 |
528 |
656 |
R3 |
768 |
896 |
832 |
960 |
800 |
928 |
864 |
992 |
784 |
912 |
R0 |
80 |
208 |
48 |
176 |
112 |
240 |
8 |
136 |
72 |
... |
R1 |
336 |
464 |
304 |
432 |
368 |
496 |
264 |
392 |
328 |
... |
R2 |
592 |
720 |
560 |
688 |
624 |
752 |
520 |
648 |
584 |
... |
R3 |
848 |
976 |
816 |
944 |
880 |
1008 |
776 |
904 |
840 |
... |
表21第一级蝶形运算单元的输入数据,每个RAM位倒序后的数据(维度(n0,n1,n2,n3,n4))
等效数据如表25所示(RAM序号和地址联合的维度序号应该是(n0,n1,n2,n3,n4)),其中n本身内部是位倒序的:
R0 |
0 |
128 |
64 |
192 |
32 |
160 |
96 |
224 |
16 |
144 |
R2 |
512 |
640 |
576 |
704 |
544 |
672 |
608 |
736 |
528 |
656 |
R1 |
256 |
384 |
320 |
448 |
288 |
416 |
352 |
480 |
272 |
400 |
R3 |
768 |
896 |
832 |
960 |
800 |
928 |
864 |
992 |
784 |
912 |
R0 |
80 |
208 |
48 |
176 |
112 |
240 |
8 |
136 |
72 |
... |
R2 |
592 |
720 |
560 |
688 |
624 |
752 |
520 |
648 |
584 |
... |
R1 |
336 |
464 |
304 |
432 |
368 |
496 |
264 |
392 |
328 |
... |
R3 |
848 |
976 |
816 |
944 |
880 |
1008 |
776 |
904 |
840 |
... |
表22第一级蝶形运算输入,从RAM读取(维度(n0,n1,n2,n3,n4))
从表22可以看出,第一级FFT运算数据从写入RAM地址中以位倒序方式读出,同时R1与R2交换,然后读出四个RAM相同地址的数据送到蝶形运算单元,算完蝶形运算后(维度变为(k0,n3,n2,n1,n0))类似64点时的做法转置写入原RAM单元中(维度变为(n3,k0,n2,n1,n0)),下一级蝶形只需如下读出下表每列:
R0 |
0 |
512 |
256 |
768 |
32 |
544 |
288 |
800 |
16 |
528 |
R1 |
128 |
640 |
384 |
896 |
160 |
672 |
416 |
928 |
144 |
656 |
R2 |
64 |
576 |
320 |
832 |
96 |
608 |
352 |
864 |
80 |
592 |
R3 |
192 |
704 |
448 |
960 |
224 |
736 |
480 |
992 |
208 |
720 |
R0 |
272 |
784 |
48 |
560 |
304 |
816 |
8 |
520 |
264 |
... |
R1 |
400 |
912 |
176 |
688 |
432 |
944 |
136 |
648 |
392 |
... |
R2 |
336 |
848 |
112 |
624 |
368 |
880 |
72 |
584 |
328 |
... |
R3 |
464 |
976 |
240 |
752 |
496 |
1008 |
200 |
712 |
456 |
... |
表22第一级蝶形运算单元的输出数据,对RAM写入(维度(n1,k4,n2,n3,n4))
然后送入蝶形单元进行运算,维度即变为(k1,k0,n2,n1,n0),这时由于RAM序号所在的最高维度由于已经转换到频域,所以无法读出四个RAM相同地址进行蝶形运算,所以需要将维度(n2,n1,n0)循环左移1位,将k0在每个RAM中循环右移一位,即将表22的每个RAM的数按照地址隔4抽取,即得到(k1,n2,n1,n0,k0),再将其转置存储,得到(n2,k1,n1,n0,k0),存入相应空间中,得到:
R0 |
0 |
32 |
16 |
48 |
8 |
40 |
24 |
56 |
4 |
36 |
R2 |
128 |
160 |
144 |
176 |
136 |
168 |
152 |
184 |
132 |
164 |
R1 |
64 |
96 |
80 |
112 |
72 |
104 |
88 |
120 |
68 |
100 |
R3 |
192 |
224 |
208 |
240 |
200 |
232 |
216 |
248 |
196 |
228 |
R0 |
20 |
52 |
12 |
44 |
28 |
60 |
2 |
0 |
32 |
... |
R2 |
148 |
180 |
140 |
172 |
156 |
188 |
130 |
128 |
160 |
... |
R1 |
84 |
116 |
76 |
108 |
92 |
124 |
66 |
64 |
96 |
... |
R3 |
212 |
244 |
204 |
236 |
220 |
252 |
194 |
192 |
224 |
... |
表23第二级蝶形运算单元的输入数据,从RAM读取(维度(n1,n2,n3,n4,k4))
将其数据按地址顺序读出,同时并行读出四个RAM的同一地址的数送入蝶形运算单元,计算第二级蝶形运算后将结果,转置后(维度变为(k2,k1,n1,n0,k0))得到:
R0 |
0 |
128 |
64 |
192 |
8 |
136 |
72 |
200 |
4 |
132 |
R2 |
32 |
160 |
96 |
224 |
40 |
168 |
104 |
232 |
36 |
164 |
R1 |
16 |
144 |
80 |
208 |
24 |
152 |
88 |
216 |
20 |
148 |
R3 |
48 |
176 |
112 |
240 |
56 |
184 |
120 |
248 |
52 |
180 |
R0 |
68 |
196 |
12 |
140 |
76 |
204 |
2 |
130 |
66 |
... |
R2 |
100 |
228 |
44 |
172 |
108 |
236 |
34 |
162 |
98 |
... |
R1 |
84 |
212 |
28 |
156 |
92 |
220 |
18 |
146 |
82 |
... |
R3 |
116 |
244 |
60 |
188 |
124 |
252 |
50 |
178 |
114 |
... |
表24第二级蝶形运算单元输出的数据,对RAM写入(维度(n2,k3,n3,n4,k4))
同理,将上表24中每个RAM的数按4抽取重新排列,得到维度为(k2,n1,n0,k0,k1)的数据,进入第三级蝶形运算单元的数据如表25所示:
R0 |
0 |
8 |
4 |
12 |
2 |
10 |
6 |
14 |
1 |
9 |
R2 |
32 |
40 |
36 |
44 |
34 |
42 |
38 |
46 |
33 |
41 |
R1 |
16 |
24 |
20 |
28 |
18 |
26 |
22 |
30 |
17 |
25 |
R3 |
48 |
56 |
52 |
60 |
50 |
58 |
54 |
62 |
49 |
57 |
R0 |
5 |
13 |
3 |
11 |
7 |
15 |
512 |
520 |
516 |
... |
R2 |
37 |
45 |
35 |
43 |
39 |
47 |
544 |
552 |
548 |
... |
R1 |
21 |
29 |
19 |
27 |
23 |
31 |
528 |
536 |
532 |
... |
R3 |
53 |
61 |
51 |
59 |
55 |
63 |
560 |
568 |
564 |
... |
表25第三级蝶形运算单元的输入数据,从RAM读取(维度(n2,n3,n4,k4,k3))
将其数据按地址顺序读出,同时并行读出四个RAM的同一地址的数送入蝶形运算单元,计算第二级蝶形运算后将结果转置(维度变为(k3,k2,n1,n0,k0)),得到表26所示的数据:
R0 |
0 |
32 |
16 |
48 |
2 |
34 |
18 |
50 |
1 |
33 |
R2 |
8 |
40 |
24 |
56 |
10 |
42 |
26 |
58 |
9 |
41 |
R1 |
4 |
36 |
20 |
52 |
6 |
38 |
22 |
54 |
5 |
37 |
R3 |
12 |
44 |
28 |
60 |
14 |
46 |
30 |
62 |
13 |
45 |
R0 |
17 |
49 |
3 |
35 |
19 |
51 |
512 |
544 |
528 |
... |
R2 |
25 |
57 |
11 |
43 |
27 |
59 |
520 |
552 |
536 |
... |
R1 |
21 |
53 |
7 |
39 |
23 |
55 |
516 |
548 |
532 |
... |
R3 |
29 |
61 |
15 |
47 |
31 |
63 |
524 |
556 |
540 |
... |
表26第三级蝶形运算单元输出的数据,对RAM写入(维度(n3,k2,n4,k4,k3))
同理,将表26中每个RAM的数按4抽取重新排列,得到维度为(k3,n1,n0,k0,k2)的数据,进入第四级蝶形运算,如表27所示:
R0 |
0 |
2 |
1 |
3 |
512 |
514 |
513 |
515 |
256 |
258 |
R2 |
8 |
10 |
9 |
11 |
520 |
522 |
521 |
523 |
264 |
266 |
R1 |
4 |
6 |
5 |
7 |
516 |
518 |
517 |
519 |
260 |
262 |
R3 |
12 |
14 |
13 |
15 |
524 |
526 |
525 |
527 |
268 |
270 |
R0 |
257 |
259 |
768 |
770 |
769 |
771 |
128 |
130 |
129 |
... |
R2 |
265 |
267 |
776 |
778 |
777 |
779 |
136 |
138 |
137 |
... |
R1 |
261 |
263 |
772 |
774 |
773 |
775 |
132 |
134 |
133 |
... |
R3 |
269 |
271 |
780 |
782 |
781 |
783 |
140 |
142 |
141 |
... |
表27第四级蝶形运算单元的输入数据,从RAM读取(维度(n3,n4,k4,k3,k2))
将其数据按地址顺序读出,同时并行读出四个RAM的同一地址的数送入蝶形运算单元,计算第二级蝶形运算后将结果转置(维度变为(k3,k2,n1,n0,k0)),得到表28所示的数据:
R0 |
0 |
8 |
4 |
12 |
512 |
520 |
516 |
524 |
256 |
264 |
R2 |
2 |
10 |
6 |
14 |
514 |
522 |
518 |
526 |
258 |
266 |
R1 |
1 |
9 |
5 |
13 |
513 |
521 |
517 |
525 |
257 |
265 |
R3 |
3 |
11 |
7 |
15 |
515 |
523 |
519 |
527 |
259 |
267 |
R0 |
260 |
268 |
768 |
776 |
772 |
780 |
128 |
136 |
132 |
... |
R2 |
262 |
270 |
770 |
778 |
774 |
782 |
130 |
138 |
134 |
... |
R1 |
261 |
269 |
769 |
777 |
773 |
781 |
129 |
137 |
133 |
... |
R3 |
263 |
271 |
771 |
779 |
775 |
783 |
131 |
139 |
135 |
... |
表28第四级蝶形运算输出,对RAM写入(维度(n4,k1,k4,k3,k2))
同理,将表28中每个RAM的数按4抽取重新排列,得到维度为(k3,n1,n0,k0,k2)的数据,进入第五级蝶形运算,如表29所示:
R0 |
0 |
512 |
256 |
768 |
128 |
640 |
384 |
896 |
64 |
576 |
R2 |
2 |
514 |
258 |
770 |
130 |
642 |
386 |
898 |
66 |
578 |
R1 |
1 |
513 |
257 |
769 |
129 |
641 |
385 |
897 |
65 |
577 |
R3 |
3 |
515 |
259 |
771 |
131 |
643 |
387 |
899 |
67 |
579 |
R0 |
320 |
832 |
192 |
704 |
448 |
960 |
32 |
544 |
288 |
... |
R2 |
322 |
834 |
194 |
706 |
450 |
962 |
34 |
546 |
290 |
... |
R1 |
321 |
833 |
193 |
705 |
449 |
961 |
33 |
545 |
289 |
... |
R3 |
323 |
835 |
195 |
707 |
451 |
963 |
35 |
547 |
291 |
... |
表29第五级蝶形运算单元的输入数据,从RAM读取(维度(n4,k4,k3,k2,k1))
将其数据按地址顺序读出,同时并行读出四个RAM的同一地址的数送入蝶形运算单元,计算第五级蝶形运算后,维度变为(k0,k4,k3,k2,k1)),可以按一定规则直接输出,也可以进行上述的转置写入这四个RAM,维度变为得到(k4,k0,k3,k2,k1),再按4抽取得到维度为(k4,k3,k2,k1,k0)的数据,得到的指标顺序与第一次输入时是一样的,但是已经在时域上变为顺序输出了,如表30所示:
R0 |
0 |
128 |
64 |
192 |
32 |
160 |
96 |
224 |
16 |
144 |
R2 |
512 |
640 |
576 |
704 |
544 |
672 |
608 |
736 |
528 |
656 |
R1 |
256 |
384 |
320 |
448 |
288 |
416 |
352 |
480 |
272 |
400 |
R3 |
768 |
896 |
832 |
960 |
800 |
928 |
864 |
992 |
784 |
912 |
R0 |
80 |
208 |
48 |
176 |
112 |
240 |
8 |
136 |
72 |
... |
R2 |
592 |
720 |
560 |
688 |
624 |
752 |
520 |
648 |
584 |
... |
R1 |
336 |
464 |
304 |
432 |
368 |
496 |
264 |
392 |
328 |
... |
R3 |
848 |
976 |
816 |
944 |
880 |
1008 |
776 |
904 |
840 |
... |
表30第五级蝶形运算单元输出的数据,可用RAM变换顺序后输出(维度(k4,k3,k2,k1,k0))
应当注意,以上结合表1至表30所描述的转置方式仅仅是具体的实例,本发明并不限于此,在实际应用中可以采用其他的转置方式,从而方便下一级蝶形运算单元读取数据进行计算,本文不再一一列举。
通过上述处理,由于上一级蝶形运算单元计算后经过转置的数据,下一级蝶形运算单元能够很方便地读出,因此能够避免占用大量存储空间来避免地址冲突,并且能够降低傅里叶变换的时延。
装置实施例
在本实施例中,提供了一种傅里叶变换的实现装置,用于通过多级蝶形运算单元实现流水傅里叶变换。
根据本实施例的装置包括:多级蝶形运算单元,用于进行蝶形计算;随机存储器,用于存储计算结果;转置模块,在多级蝶形运算单元中的其中一级蝶形运算单元对向该蝶形计算单元输入的数据计算完成后,以预定顺序对计算得到的计算结果进行分组,并对每组计算结果进行转置操作,并将转置操作后的计算结果存储至随机存储器中,以供蝶形计算单元的下一级蝶形计算单元对转置操作后的计算结果进行计算;其中,在转置操作后的计算结果中,由下一级蝶形运算单元在一个周期内计算的数据在随机存储器中的存储位置相同,并且转置操作后的计算结果中归属于同一蝶形计算单位的数据分布在随机存储器的预定位置处;其中,上述进行转置操作的蝶形运算单元为多级蝶形运算单元中第一级蝶形运算单元和最后一级蝶形运算单元之外的蝶形运算单元。
该装置可用于实现上述方法,其同样可以采用上述公式,得到以上结合表1至30所示的中间结果和最终结果,该装置内具体的处理过程与之前描述的相同,这里不再重复。
通过上述处理,由于上一级蝶形运算单元计算后经过转置的数据,下一级蝶形运算单元能够很方便地读出,因此能够避免占用大量存储空间来避免地址冲突,并且能够降低傅里叶变换的时延。
综上所述,借助于本发明的上述技术方案,通过将蝶形运算单元的中间结果进行转置,使得下一级蝶形计算单元能够方便地读取所需数据并进行计算,能够有效降低处理延迟,节省存储空间,避免读写冲突的出现,有效改进傅里叶变换的效率和性能,适用于基2、基4等多种FFT/IFFT运算。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。