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

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

 

 

 

 

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值