×
FPGA/DSP > DSP系统 > 详情

关于DSP中fft函数调用方法

发布时间:2020-05-14 发布时间:
|

以下主要是通过代码调用fft函数



1、通过dsplib库调用DSPF_sp_ifftSPxSP函数来实现fft

//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中进行实验如下:

//fft

tw_gen_fft (w_array, col);

//如果图像的行列不同的话在第一次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);

tw_gen_fft (w_array, row); //对每一列(翻转后变为行)进行FFT for(j = 0; j 《 width; j++) { DSPF_sp_fftSPxSP(16, (float *)x_array + 2*j*width, w_array, (float *)y_array + 2*j*width, brev, 4, 0, 16); } //行列翻转 DSPF_dp_mat_trans((double *)y_array, height, width, (double *)x_array);

至此,完美解决dsp平台下的fft2d的内联函数调用问题


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
DSP的数码望远相机的研究与设计