关于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);
其中函数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的内联函数调用问题

美国发布对华芯片设限最终规则
发展RFID技术的时候需要注意哪一些问题
韩国公布半导体大型集群计划
安泰电压放大器在水下主动电场中的应用
锂电池充电芯片优晶YS4054BSC可用于便携式媒体播放器
关于DSP中fft函数调用方法
大龄程序员的出路
电磁波的干涉、衍射原理
美国运营商US Cellular宣布将在明年第一季度推出5G服务
无功补偿怎么升级自动投切?
应用于对讲机的防水透气解决方案是如何做的
智能家居进口品牌大比拼,美系和欧系的差别在哪?
压力变送器根据被测介质的压力不同分为哪些变送器?
骁龙855已进入量产阶段,将成为2019年高通最受关注的产品之一
国六关于二次空气系统检测解决方案
看IBM如何助力企业实现数字化重塑实现认知转型
连接器指南
Highest Linearity, Dual Downco
人工智能有哪些“偏门”的科技应用
水力发电的知识分享