要进行维纳滤波,首先就是要将图像矩阵通过二维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_fe
、void dummy_proc_middle
和void 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