xilinx 暑期学校项目(二) 通过HLS实现二维傅里叶变换(2Dfft)及图像数据读入读出方法

要进行维纳滤波,首先就是要将图像矩阵通过二维fft变换到频域。

但是hls_fft.h中只有一维fft的函数,因此我们采用对行逐行进行一维fft,再对列逐行进行一维fft来实现二维fft的效果。

自带的fft例程

自带的fft例程中包括有如下四个函数

void dummy_proc_fe(
    bool direction,
    config_t* config,
    cmpxData in[FFT_LENGTH],
    cmpxData out[FFT_LENGTH])

void dummy_proc_middle(
    config_t* config_in,
    config_t* config_out,
    status_t* st_in,
    cmpxData in[FFT_LENGTH],
    cmpxData out[FFT_LENGTH])

void dummy_proc_be(
    status_t* status_in,
    bool* ovflo,
    cmpxData in[FFT_LENGTH],
    cmpxData out[FFT_LENGTH])

void fft_top(
    bool direction,
    cmpxData in[FFT_LENGTH],	//xn1 -> in
    cmpxData out[FFT_LENGTH],	//out -> xk1
    bool* ovflo)

其中void dummy_proc_fevoid dummy_proc_middlevoid dummy_proc_be是对fft的前后处理,我们大可不必管他,照搬就是
唯一需要主要的就是在void dummy_proc_middle中有一句bool ovflw= st_in->getOvflo();

这个ovflw顾名思义就是overflow,是溢出,而void dummy_proc_fe中有一个config->setSch(0x2AB);是设置系数,我们需要调整好这个系数来防止计算的溢出,可以参考一位大佬的文章

接下来还有一个问题,就是我们想用这个fft函数来进行fft计算,而不是单独做一个模块,所以需要去除函数开头的一些硬件接口的预定义,接下来就可以放到我们的主程序来调用了。

#pragma HLS interface ap_hs port=direction
#pragma HLS interface ap_fifo depth=1 port=ovflo
#pragma HLS interface ap_fifo depth=1024 port=in,out
#pragma HLS data_pack variable=in
#pragma HLS data_pack variable=out

二维fft的实现

接下来要在主程序中调用这个fft函数来实现二维fft。
首先来看下函数接口,我们需要复数类型的数据输入和输出。

typedef std::complex<float> cmpxData;

因此我们定义二维复数数组来获取图像矩阵数值。
这个复数是使用的c++标准库complex,所以其赋值方法是

cmpx x;
cmpx y;
x = y;
/******************or********************/
x.real(1);
x.imag(1);
/******************or**********************/
x = (1,1);

接下来进行fft2d,此处需要主要的是我们的数组要用静态数组,static

/***********get FFT_array(2D FFT)**************/
	bool ovflo;
	//傅里叶正变换(行)
	for(int r = 0; r < rows; r++)
	{
   
	#pragma HLS pipeline
		for(int c = 0; c < cols; c++)
		{
   
			in1[c].real(xn1[r][c].real());
			in1[c].imag(xn1[r][c].imag());
			//in[c] = xn1[r][c];
			//printf("in %d num %f \n",c,in[c].real());
		}
		fft_top(direction,in1,out1,&ovflo);
		for(int c = 0; c < cols; c++)
		{
   
			middle[r][c].real(out1[c].real()/256);
			middle[r][c].imag(out1[c].imag()/256);
			//middle[r][c] = out[c];
			//printf("in	%d	real: %f	image: %f \n",r,out[c].real(),out[c].imag());
		}
	}
	//傅里叶正变换(列)
	for(int c = 0; c < col; c++)
	{
   
	#pragma HLS pipeline
		for(int r = 0; r < row; r++)
		{
   
			in1[r].real(middle[r][c].real());
			in1[r].imag
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆沙粽子好吃嘛!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值