1、通过dsplib库调用DSPF_sp_ifftSPxSP函数来实现ff
//fft
tw_gen_fft (w_array, N);
DSPF_sp_fftSPxSP (N, x_array, w_array, y_array, brev, rad, 0, N);
其中函数tw_gen_fft()为旋转因子,计算大码为:
void tw_gen_ifft (float *w, int n)
{
int i, j, k;
const double PI = 3.141592654;
for (j = 1, k = 0; j <= n >> 2; j = j << 2)
{
for (i = 0; i < n >> 2; i += j)
{
#ifdef _LITTLE_ENDIAN
w[k] = (float) -sin (2 * PI * i / n);//为负数的时候是进行IFFT,为正数的时候是进行FFT
w[k + 1] = (float) cos (2 * PI * i / n);
w[k + 2] = (float) -sin (4 * PI * i / n);
w[k + 3] = (float) cos (4 * PI * i / n);
w[k + 4] = (float) -sin (6 * PI * i / n);
w[k + 5] = (float) cos (6 * PI * i / n);
#else
w[k] = (float) cos (2 * PI * i / n);
w[k + 1] = (float) -sin (2 * PI * i / n);
w[k + 2] = (float) cos (4 * PI * i / n);
w[k + 3] = (float) -sin (4 * PI * i / n);
w[k + 4] = (float) cos (6 * PI * i / n);
w[k + 5] = (float) -sin (6 * PI * i / n);
#endif
k += 6;
}
}
}
注释:此函数中的N为此行的点数,而不是行列的总数,在在fft2d中出现了错误,就是由这个N导致的。
2、通过matlab代码来验证fft和fft2d的关系。
clc;
close all;
clear all;
方法一:
%生成一个16x16的单位矩阵
%a = eye(16);
%[m, n] = size(a);
a1 = [0:15];
height = 16;
width = 16;
%[m, n] = size(a);
a = a1(ones(1,16), :);
%每一行分别做一维FFT
for i = 1:height
b(i,:) = fft(a(i,:));
end
%行列翻转
c = transpose(b);
%每一行分别做一维FFT(由于翻转了,此时相当于每一列分别做一维FFT)
for i = 1:width
d(i,:) = fft(c(i,:));
end
%行列翻转
e = transpose(d);
%每一行分别做一维IFFT
for i = 1:height
ib(i,:) = ifft(e(i,:));
end
%行列翻转
ic = transpose(ib);
%每一行分别做一维IFFT(由于翻转了,此时相当于每一列分别做一维FFT)
for i = 1:width
id(i,:) = ifft(ic(i,:));
end
%行列翻转
ie = transpose(id);
方法二:
afft = fft2(a);
aifft = ifft2(afft);
方法三:
f = fft(fft(a).').';
ift = ifft(ifft(f).').';
3、通过上述matlab的验证可以确定fft和fft2d的关系,针对16*16的数据在DSP中进行实验如下
//fft2d
tw_gen_fft (w_array, col);
tw_gen_fft (h_array, row);
//如果图像的行列不同的话在第一次fft之前n应为对应行的点数,则应在行列翻转后再次调用tw_gen_fft函数,并将n改为对应的列的点数
//对每一行做一次FFT
for(i = 0; i < height; i++)
{
DSPF_sp_fftSPxSP(16, (float *)x_array + 2*i*width , w_array, (float *)y_array + 2*i*width, brev, 4, 0, 16);
}
//行列翻转
DSPF_dp_mat_trans((double *)y_array, height, width, (double *)x_array);
//对每一列(翻转后变为行)进行FFT
for(j = 0; j < width; j++)
{
DSPF_sp_fftSPxSP(16, (float *)x_array + 2*j*height, h_array, (float *)y_array + 2*j*height, brev, 4, 0, 16);
}
//行列翻转
DSPF_dp_mat_trans((double *)y_array, width, height, (double *)x_array);
至此,完美解决dsp平台下的fft2d的内联函数调用问题。