DSP

DSP中如何使用fft2函数库进行优化

2019-07-13 10:34发布

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的内联函数调用问题。