当前位置:文档之家› 关于DSP中fft函数调用方法

关于DSP中fft函数调用方法

k += 6;
}
}
}
注释:此函数中的N为此行的点数,而不是行列的总数,在在fft2d中出现了错误,就是由这个N导致的。
2、通过matlab代码来验证fft和fft2d的关系。
clc;
close all;
clear all;
方法一:
%生成一个16x16的单位矩阵
%a = eye(16);
%[m,n]= size(a);
其中函数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)
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)
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);
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)。‘)。’;
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)
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);
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
至此,完美解决dsp平台下的fft2d的内联函数调用问题
{
#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);
关于DSP中fft函数调用方法
以下主要是通过代码调用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);
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);
相关主题