概述
代码改编自vivado hls自带的fft教程
fft_top.h
// 67d7842dbbe25473c3c32b93c0da8047785f30d78e8a024de1b57352245f9689
/*******************************************************************************
Vendor: Xilinx
Associated Filename: fft_top.h
Purpose: Xilinx FFT IP-XACT IP in Vivado HLS
Revision History: September 26, 2013 - initial release
*******************************************************************************
#- (c) Copyright 2011-2019 Xilinx, Inc. All rights reserved.
#-
#- This file contains confidential and proprietary information
#- of Xilinx, Inc. and is protected under U.S. and
#- international copyright and other intellectual property
#- laws.
#-
#- DISCLAIMER
#- This disclaimer is not a license and does not grant any
#- rights to the materials distributed herewith. Except as
#- otherwise provided in a valid license issued to you by
#- Xilinx, and to the maximum extent permitted by applicable
#- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
#- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
#- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
#- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
#- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
#- (2) Xilinx shall not be liable (whether in contract or tort,
#- including negligence, or under any other theory of
#- liability) for any loss or damage of any kind or nature
#- related to, arising under or in connection with these
#- materials, including for any direct, or any indirect,
#- special, incidental, or consequential loss or damage
#- (including loss of data, profits, goodwill, or any type of
#- loss or damage suffered as a result of any action brought
#- by a third party) even if such damage or loss was
#- reasonably foreseeable or Xilinx had been advised of the
#- possibility of the same.
#-
#- CRITICAL APPLICATIONS
#- Xilinx products are not designed or intended to be fail-
#- safe, or for use in any application requiring fail-safe
#- performance, such as life-support or safety devices or
#- systems, Class III medical devices, nuclear facilities,
#- applications related to the deployment of airbags, or any
#- other applications that could lead to death, personal
#- injury, or severe property or environmental damage
#- (individually and collectively, "Critical
#- Applications"). Customer assumes the sole risk and
#- liability of any use of Xilinx products in Critical
#- Applications, subject only to applicable laws and
#- regulations governing limitations on product liability.
#-
#- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
#- PART OF THIS FILE AT ALL TIMES.
#- ************************************************************************
This file contains confidential and proprietary information of Xilinx, Inc. and
is protected under U.S. and international copyright and other intellectual
property laws.
DISCLAIMER
This disclaimer is not a license and does not grant any rights to the materials
distributed herewith. Except as otherwise provided in a valid license issued to
you by Xilinx, and to the maximum extent permitted by applicable law:
(1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL FAULTS, AND XILINX
HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY,
INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-INFRINGEMENT, OR
FITNESS FOR ANY PARTICULAR PURPOSE; and (2) Xilinx shall not be liable (whether
in contract or tort, including negligence, or under any other theory of
liability) for any loss or damage of any kind or nature related to, arising under
or in connection with these materials, including for any direct, or any indirect,
special, incidental, or consequential loss or damage (including loss of data,
profits, goodwill, or any type of loss or damage suffered as a result of any
action brought by a third party) even if such damage or loss was reasonably
foreseeable or Xilinx had been advised of the possibility of the same.
CRITICAL APPLICATIONS
Xilinx products are not designed or intended to be fail-safe, or for use in any
application requiring fail-safe performance, such as life-support or safety
devices or systems, Class III medical devices, nuclear facilities, applications
related to the deployment of airbags, or any other applications that could lead
to death, personal injury, or severe property or environmental damage
(individually and collectively, "Critical Applications"). Customer assumes the
sole risk and liability of any use of Xilinx products in Critical Applications,
subject only to applicable laws and regulations governing limitations on product
liability.
THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE AT
ALL TIMES.
*******************************************************************************/
#include "ap_fixed.h"
#include "hls_fft.h"
// configurable params
const char FFT_INPUT_WIDTH = 16;
const char FFT_OUTPUT_WIDTH = FFT_INPUT_WIDTH;
const char FFT_CONFIG_WIDTH = 8;
const char FFT_NFFT_MAX = 4;
const int FFT_LENGTH = 1 << FFT_NFFT_MAX;
#include <complex>
using namespace std;
struct config1 : hls::ip_fft::params_t {
static const unsigned ordering_opt = hls::ip_fft::natural_order;
static const unsigned config_width = FFT_CONFIG_WIDTH;
static const unsigned max_nfft=4;
};
typedef hls::ip_fft::config_t<config1> config_t;
typedef hls::ip_fft::status_t<config1> status_t;
typedef ap_fixed<FFT_INPUT_WIDTH,1> data_in_t;
typedef ap_fixed<FFT_OUTPUT_WIDTH,FFT_OUTPUT_WIDTH-FFT_INPUT_WIDTH+1> data_out_t;
typedef std::complex<data_in_t> cmpxDataIn;
typedef std::complex<data_out_t> cmpxDataOut;
void dummy_proc_fe(
bool direction,
config_t* config,
cmpxDataIn in[FFT_LENGTH],
cmpxDataIn out[FFT_LENGTH]);
void dummy_proc_be(
status_t* status_in,
bool* ovflo,
cmpxDataOut in[FFT_LENGTH],
cmpxDataOut out[FFT_LENGTH]);
void fft_top(
bool direction,
cmpxDataIn in[FFT_LENGTH],
cmpxDataOut out[FFT_LENGTH],
bool* ovflo);
FFT_INPUT_WIDTH和FFT_OUTPUT_WIDTH分别是输入输出数据的位宽,FFT_NFFT_MAX为FFT_LENGTH以2为底的对数,而FFT_LENGTH则是FFT变换的点数(即输入序列的长度),需要注意的是,更改了FFT_NFFT_MAX的值后,还需要在config1中加入**static const unsigned max_nfft=4
**,这样才能真正生效,同时还需要修改FFT_CONFIG_WIDTH的值
fft_top.cpp
// 67d7842dbbe25473c3c32b93c0da8047785f30d78e8a024de1b57352245f9689
/*******************************************************************************
Vendor: Xilinx
Associated Filename: fft_top.cpp
Purpose: Xilinx FFT IP-XACT IP in Vivado HLS
Revision History: September 26, 2013 - initial release
*******************************************************************************
#- (c) Copyright 2011-2019 Xilinx, Inc. All rights reserved.
#-
#- This file contains confidential and proprietary information
#- of Xilinx, Inc. and is protected under U.S. and
#- international copyright and other intellectual property
#- laws.
#-
#- DISCLAIMER
#- This disclaimer is not a license and does not grant any
#- rights to the materials distributed herewith. Except as
#- otherwise provided in a valid license issued to you by
#- Xilinx, and to the maximum extent permitted by applicable
#- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
#- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
#- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
#- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
#- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
#- (2) Xilinx shall not be liable (whether in contract or tort,
#- including negligence, or under any other theory of
#- liability) for any loss or damage of any kind or nature
#- related to, arising under or in connection with these
#- materials, including for any direct, or any indirect,
#- special, incidental, or consequential loss or damage
#- (including loss of data, profits, goodwill, or any type of
#- loss or damage suffered as a result of any action brought
#- by a third party) even if such damage or loss was
#- reasonably foreseeable or Xilinx had been advised of the
#- possibility of the same.
#-
#- CRITICAL APPLICATIONS
#- Xilinx products are not designed or intended to be fail-
#- safe, or for use in any application requiring fail-safe
#- performance, such as life-support or safety devices or
#- systems, Class III medical devices, nuclear facilities,
#- applications related to the deployment of airbags, or any
#- other applications that could lead to death, personal
#- injury, or severe property or environmental damage
#- (individually and collectively, "Critical
#- Applications"). Customer assumes the sole risk and
#- liability of any use of Xilinx products in Critical
#- Applications, subject only to applicable laws and
#- regulations governing limitations on product liability.
#-
#- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
#- PART OF THIS FILE AT ALL TIMES.
#- ************************************************************************
This file contains confidential and proprietary information of Xilinx, Inc. and
is protected under U.S. and international copyright and other intellectual
property laws.
DISCLAIMER
This disclaimer is not a license and does not grant any rights to the materials
distributed herewith. Except as otherwise provided in a valid license issued to
you by Xilinx, and to the maximum extent permitted by applicable law:
(1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL FAULTS, AND XILINX
HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY,
INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-INFRINGEMENT, OR
FITNESS FOR ANY PARTICULAR PURPOSE; and (2) Xilinx shall not be liable (whether
in contract or tort, including negligence, or under any other theory of
liability) for any loss or damage of any kind or nature related to, arising under
or in connection with these materials, including for any direct, or any indirect,
special, incidental, or consequential loss or damage (including loss of data,
profits, goodwill, or any type of loss or damage suffered as a result of any
action brought by a third party) even if such damage or loss was reasonably
foreseeable or Xilinx had been advised of the possibility of the same.
CRITICAL APPLICATIONS
Xilinx products are not designed or intended to be fail-safe, or for use in any
application requiring fail-safe performance, such as life-support or safety
devices or systems, Class III medical devices, nuclear facilities, applications
related to the deployment of airbags, or any other applications that could lead
to death, personal injury, or severe property or environmental damage
(individually and collectively, "Critical Applications"). Customer assumes the
sole risk and liability of any use of Xilinx products in Critical Applications,
subject only to applicable laws and regulations governing limitations on product
liability.
THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE AT
ALL TIMES.
*******************************************************************************/
#include "fft_top.h"
void dummy_proc_fe(
bool direction,
config_t* config,
cmpxDataIn in[FFT_LENGTH],
cmpxDataIn out[FFT_LENGTH])
{
int i;
config->setDir(direction);
config->setSch(0xA);
for (i=0; i< FFT_LENGTH; i++)
out[i] = in[i];
}
void dummy_proc_be(
status_t* status_in,
bool* ovflo,
cmpxDataOut in[FFT_LENGTH],
cmpxDataOut out[FFT_LENGTH])
{
int i;
for (i=0; i< FFT_LENGTH; i++)
out[i] = in[i];
*ovflo = status_in->getOvflo() & 0x1;
}
void fft_top(
bool direction,
complex<data_in_t> in[FFT_LENGTH],
complex<data_out_t> out[FFT_LENGTH],
bool* ovflo)
{
#pragma HLS interface ap_hs port=direction
#pragma HLS interface ap_fifo depth=1 port=ovflo
#pragma HLS interface ap_fifo depth=FFT_LENGTH port=in,out
#pragma HLS data_pack variable=in
#pragma HLS data_pack variable=out
#pragma HLS dataflow
complex<data_in_t> xn[FFT_LENGTH];
complex<data_out_t> xk[FFT_LENGTH];
config_t fft_config;
status_t fft_status;
dummy_proc_fe(direction, &fft_config, in, xn);
// FFT IP
hls::fft<config1>(xn, xk, &fft_status, &fft_config);
dummy_proc_be(&fft_status, ovflo, xk, out);
}
这里,config->setDir(direction)为设置FFT的方向,即FFT还是IFFT,direction为1时,为正向FFT,否则为IFFT。ovflo则是溢出信号,若计算过程发生溢出,则为1.
config->setSch(0xA)语句设置FFT计算单元每一级的右移位数,以防止计算过程中发生溢出,一般,右移的总的位数等于FFT计算的点数。
测试平台文件
fft_tb.cpp
// 67d7842dbbe25473c3c32b93c0da8047785f30d78e8a024de1b57352245f9689
/*******************************************************************************
Vendor: Xilinx
Associated Filename: fft_tb.cpp
Purpose: Xilinx FFT IP-XACT IP in Vivado HLS
Revision History: September 26, 2013 - initial release
*******************************************************************************
#- (c) Copyright 2011-2019 Xilinx, Inc. All rights reserved.
#-
#- This file contains confidential and proprietary information
#- of Xilinx, Inc. and is protected under U.S. and
#- international copyright and other intellectual property
#- laws.
#-
#- DISCLAIMER
#- This disclaimer is not a license and does not grant any
#- rights to the materials distributed herewith. Except as
#- otherwise provided in a valid license issued to you by
#- Xilinx, and to the maximum extent permitted by applicable
#- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
#- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
#- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
#- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
#- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
#- (2) Xilinx shall not be liable (whether in contract or tort,
#- including negligence, or under any other theory of
#- liability) for any loss or damage of any kind or nature
#- related to, arising under or in connection with these
#- materials, including for any direct, or any indirect,
#- special, incidental, or consequential loss or damage
#- (including loss of data, profits, goodwill, or any type of
#- loss or damage suffered as a result of any action brought
#- by a third party) even if such damage or loss was
#- reasonably foreseeable or Xilinx had been advised of the
#- possibility of the same.
#-
#- CRITICAL APPLICATIONS
#- Xilinx products are not designed or intended to be fail-
#- safe, or for use in any application requiring fail-safe
#- performance, such as life-support or safety devices or
#- systems, Class III medical devices, nuclear facilities,
#- applications related to the deployment of airbags, or any
#- other applications that could lead to death, personal
#- injury, or severe property or environmental damage
#- (individually and collectively, "Critical
#- Applications"). Customer assumes the sole risk and
#- liability of any use of Xilinx products in Critical
#- Applications, subject only to applicable laws and
#- regulations governing limitations on product liability.
#-
#- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
#- PART OF THIS FILE AT ALL TIMES.
#- ************************************************************************
This file contains confidential and proprietary information of Xilinx, Inc. and
is protected under U.S. and international copyright and other intellectual
property laws.
DISCLAIMER
This disclaimer is not a license and does not grant any rights to the materials
distributed herewith. Except as otherwise provided in a valid license issued to
you by Xilinx, and to the maximum extent permitted by applicable law:
(1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL FAULTS, AND XILINX
HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY,
INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-INFRINGEMENT, OR
FITNESS FOR ANY PARTICULAR PURPOSE; and (2) Xilinx shall not be liable (whether
in contract or tort, including negligence, or under any other theory of
liability) for any loss or damage of any kind or nature related to, arising under
or in connection with these materials, including for any direct, or any indirect,
special, incidental, or consequential loss or damage (including loss of data,
profits, goodwill, or any type of loss or damage suffered as a result of any
action brought by a third party) even if such damage or loss was reasonably
foreseeable or Xilinx had been advised of the possibility of the same.
CRITICAL APPLICATIONS
Xilinx products are not designed or intended to be fail-safe, or for use in any
application requiring fail-safe performance, such as life-support or safety
devices or systems, Class III medical devices, nuclear facilities, applications
related to the deployment of airbags, or any other applications that could lead
to death, personal injury, or severe property or environmental damage
(individually and collectively, "Critical Applications"). Customer assumes the
sole risk and liability of any use of Xilinx products in Critical Applications,
subject only to applicable laws and regulations governing limitations on product
liability.
THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE AT
ALL TIMES.
*******************************************************************************/
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include "fft_top.h"
#include <stdio.h>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
cmpxDataIn xn_input[FFT_LENGTH];
cmpxDataOut xk_output[FFT_LENGTH];
for(int i=0;i<FFT_LENGTH;i++){
//cout<<i/FFT_LENGTH<<endl;
xn_input[i].real((data_in_t)((float)i/(float)FFT_LENGTH));
xn_input[i].imag((data_in_t)((float)(-i)/(float)FFT_LENGTH));
}
bool ovflo;
int FWD_INV=1;
fft_top(FWD_INV, xn_input, xk_output, &ovflo);
for(int i=0;i<FFT_LENGTH;i++)
cout<<"i="<<i<<": "<<xk_output[i].real()<<"+"<<xk_output[i].imag()<<"j"<<endl;
cout<<ovflo<<endl;
return 0;
}
HLS仿真结果如下:
python程序的运行结果如下,可以看出,误差允许范围内,该代码无误(已经除以16)
16点FFT蝶形单元设计
fft16.h
#include<ap_fixed.h>
#include<ap_int.h>
#include<complex>
#include<cmath>
#include<iostream>
#define N 16
#define STAGE 4
#define PI 3.14159
using namespace std;
//typedef float data_t;
typedef ap_fixed<16,6,AP_RND, AP_SAT> data_t;
typedef complex<data_t> complexType;
void fft16_opt(complexType x[N],complexType X[N]);
void bit_reverse(complexType X[N],complexType Y[N]);
fft16.cpp
#include"fft16.h"
/*
W[0]=(1,-0)
W[1]=(0.92388,-0.382683)
W[2]=(0.707107,-0.707106)
W[3]=(0.382684,-0.923879)
W[4]=(1.32679e-06,-1)
W[5]=(-0.382682,-0.92388)
W[6]=(-0.707105,-0.707108)
W[7]=(-0.923879,-0.382686)
*/
const complexType W[N/2]={complexType(1,0),complexType(0.92388,-0.382683),complexType(0.707107,-0.707106),complexType(0.382684,-0.923879),
complexType(0,-1),complexType(-0.382682,-0.92388),complexType(-0.707105,-0.707108),complexType(-0.923879,-0.382686)
};
void bit_reverse(complexType X[N],complexType Y[N]){
const int idx[16]={0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15};
//
for(int i=0;i<16;i++){
#pragma HLS UNROLL
Y[i]=X[idx[i]];
}
}
void stage1(complexType x[N],complexType y[N]){
y[0]=x[0]+x[1];
y[1]=x[0]-x[1];
//
y[2]=x[2]+x[3];
y[3]=x[2]-x[3];
//
y[4]=x[4]+x[5];
y[5]=x[4]-x[5];
//
y[6]=x[6]+x[7];
y[7]=x[6]-x[7];
//
y[8]=x[8]+x[9];
y[9]=x[8]-x[9];
//
y[10]=x[10]+x[11];
y[11]=x[10]-x[11];
//
y[12]=x[12]+x[13];
y[13]=x[12]-x[13];
//
y[14]=x[14]+x[15];
y[15]=x[14]-x[15];
}
void stage2(complexType x[N],complexType y[N]){
complexType tmp[4];
tmp[0]=complexType(x[3].imag(),-x[3].real());
tmp[1]=complexType(x[7].imag(),-x[7].real());
tmp[2]=complexType(x[11].imag(),-x[11].real());
tmp[3]=complexType(x[15].imag(),-x[15].real());
//
y[0]=x[0]+x[2];
y[2]=x[0]-x[2];
//
y[1]=x[1]+tmp[0];
y[3]=x[1]-tmp[0];
//
y[4]=x[4]+x[6];
y[6]=x[4]-x[6];
//
y[5]=x[5]+tmp[1];
y[7]=x[5]-tmp[1];
//
y[8]=x[8]+x[10];
y[10]=x[8]-x[10];
//
y[9]=x[9]+tmp[2];
y[11]=x[9]-tmp[2];
//
y[12]=x[12]+x[14];
y[14]=x[12]-x[14];
//
y[13]=x[13]+tmp[3];
y[15]=x[13]-tmp[3];
}
void stage3(complexType x[N],complexType y[N]){
complexType tmp[6];
tmp[0]=W[2]*x[5];
tmp[1]=complexType(x[6].imag(),-x[6].real());
tmp[2]=W[6]*x[7];
tmp[3]=W[2]*x[13];
tmp[4]=complexType(x[14].imag(),-x[14].real());
tmp[5]=W[6]*x[15];
//
y[0]=x[0]+x[4];
y[4]=x[0]-x[4];
//
y[1]=x[1]+tmp[0];
y[5]=x[1]-tmp[0];
//
y[2]=x[2]+tmp[1];
y[6]=x[2]-tmp[1];
//
y[3]=x[3]+tmp[2];
y[7]=x[3]-tmp[2];
//
y[8]=x[8]+x[12];
y[12]=x[8]-x[12];
//
y[9]=x[9]+tmp[3];
y[13]=x[9]-tmp[3];
//
y[10]=x[10]+tmp[4];
y[14]=x[10]-tmp[4];
//
y[11]=x[11]+tmp[5];
y[15]=x[11]-tmp[5];
}
void stage4(complexType x[N],complexType y[N]){
complexType tmp[7];
tmp[0]=W[1]*x[9];
tmp[1]=W[2]*x[10];
tmp[2]=W[3]*x[11];
tmp[3]=complexType(x[12].imag(),-x[12].real());
tmp[4]=W[5]*x[13];
tmp[5]=W[6]*x[14];
tmp[6]=W[7]*x[15];
//
y[0]=x[0]+x[8];
y[8]=x[0]-x[8];
//
y[1]=x[1]+tmp[0];
y[9]=x[1]-tmp[0];
//
y[2]=x[2]+tmp[1];
y[10]=x[2]-tmp[1];
//
y[3]=x[3]+tmp[2];
y[11]=x[3]-tmp[2];
//
y[4]=x[4]+tmp[3];
y[12]=x[4]-tmp[3];
//
y[5]=x[5]+tmp[4];
y[13]=x[5]-tmp[4];
//
y[6]=x[6]+tmp[5];
y[14]=x[6]-tmp[5];
//
y[7]=x[7]+tmp[6];
y[15]=x[7]-tmp[6];
}
void fft16_opt(complexType x[N],complexType X[N]){
//中间变量
complexType Xtmp[STAGE+1][N];
bit_reverse(x,Xtmp[0]);
stage1(Xtmp[0],Xtmp[1]);
stage2(Xtmp[1],Xtmp[2]);
stage3(Xtmp[2],Xtmp[3]);
stage4(Xtmp[3],X);
}
test_tb.cpp
#include"fft16.h"
const complexType W[N/2]=
{ complexType(1,0),complexType(0.92388,-0.382683),complexType(0.707107,-0.707106),complexType(0.382684,-0.923879),
complexType(0,-1),complexType(-0.382682,-0.92388),complexType(-0.707105,-0.707108),complexType(-0.923879,-0.382686)
};
void FFT_Baseline(complexType Xin[N],complexType Xout[N]){
//中间变量
complexType Xtmp[STAGE+1][N];
//for(int i=0;i<N;i++)
//{
//Xtmp[0][i]=Xin[i];
//}
bit_reverse(Xin,Xtmp[0]);
//计算
for(int i=0;i<STAGE;i++) //共i个stage
{
//第i个stage,根据Xtmp[i]计算Xtmp[i+1]
int span=1<<i; //跨度=蝶形单元大小的一半
int group_num=(int)N/(2*span); //蝶形单元数目
int group_size=(int)N/group_num; //蝶形单元大小
for(int k=0;k<group_num;k++){
for(int t=0;t<group_size/2;t++){ //需要group_size次单位根的t次方
//
int idx=(int)(t*N/(1<<(i+1)));
complexType w=W[idx];
Xtmp[i+1][k*group_size+t] = Xtmp[i][k*group_size+t]+w*Xtmp[i][k*group_size+t+span];
Xtmp[i+1][k*group_size+t+group_size/2] = Xtmp[i][k*group_size+t]-w*Xtmp[i][k*group_size+t+span];
}
}
}
for(int i=0;i<N;i++){
Xout[i]=Xtmp[STAGE][i];
}
}
int main(){
//支持8,16,32点FFT
complexType X[N];
complexType Y[N];
complexType Z[N];
complexType W[N];
for(int i=0;i<N;i++){
X[i].real((data_t)((N-i)/16.0));
X[i].imag((data_t)(i/32.0));
}
//bit_reverse(X,Z);
FFT_Baseline(X,Y);
fft16_opt(X,W);
for(int i=0;i<N;i++){
cout<<Y[i]<<","<<Y[i]-W[i]<<endl;
}
return 0;
}
综合后资源消耗:
仿真结果如下:
最后
以上就是唠叨鸡翅为你收集整理的HLS FFT的使用16点FFT蝶形单元设计的全部内容,希望文章能够帮你解决HLS FFT的使用16点FFT蝶形单元设计所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复