试验Visual DSP
试验Visual DSP++中给ADSP-TS用的FFT函数
技术 2009-02-23 16:57:30 阅读95 评论0 字号:大中小 订阅
昨天BOSS说:“试着在ADSP上做个FFT什么的试试。”我说:“是自己写算法
吗?”BOSS说:“用现成的就行。”
我去年自己用C写过FFT的程序,感觉并不难。可是自从看了清华大学出版社,胡广
书
关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf
的《数字信号处理,理论、算法不实现,第二版,》的4.4~4.6这些章节后,发现想要写
出一个优化的FFT程序真不容易,如果还要使用汇编,那真是……。
所以我很乐意使用现成的FFT代码。
看手册50_TS_cc_man.pdf的Run-Time Library Reference,找到了名为cfft的凼数,
用于计算复信号的FFT。值得庆幸的是雷达中的IQ数据都是复数据,要不然还得使用上面
提到的那本书的 4.3.3“实输入数据时的FFT算法”。
文档中有一个例子说明如何使用这个凼数,我仿照例子写了一个:
/*****************************************************************************
* test1_fft.c
*****************************************************************************/
#include
//FFT点数
#define NDataLen 256
/* Place program arguments in the following string, or delete the definition
if arguments will be passed from the command line. */
const char __argv_string[] = "-abc -xyz";
int main( int argc, char *argv[] )
{
/* Begin adding your custom code here */
//256点时域数据存储区
complex_float in_buf[256];
//256点频域数据存储区
complex_float out_buf[256];
//旋转因子存储区
static complex_float W[3*NDataLen/4];
//临时缓冲区
complex_float temp[256];
//计算旋转因子
twidfft(W,NDataLen);
//FFT运算
cfft(in_buf,temp,out_buf,W,1,NDataLen);
return 0;
}
程序写好了,我想测试测试,想到Visual DSP++有图形输出的功能,试验应该不麻烦,
但是后来发现还是没有使用Matlab来得方便。
所以决定用Matlab生成测试数据,并将计算结果用Matlab来呈现。虽然Matlab有
Embedded IDE Link VS可以直接连接Visual DSP++和Matlab,但我不太会用,所以使
用比较原始的
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
,文件。
由于cfft用到一种结构体类型complex_float,如果不查明这种类型的具体定义,那么
就无法在Visual DSP++和Matlab间正确传递数据。
我在complex.h中找到了定义:
…
#define complex_float _complex_float
…
typedef struct
{
float re; /*{Real}*/
float im;/*{Imaginary}*/
}_complex_float;
一个complex_float变量,就是将两个float变量拼在一起,一个
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示实部,一个表示
虚部。
现在可以做传递数据的相关工作了:
首先编写了两个用于从二进制文件读取数据的凼数和将数据写入二进制文件的凼数:
function value=readBinFile(filename,type)
f=fopen(filename);
if (-1==f)
error('Cannot open file!');
end
switch (type)
case 'complex_float',
value=fread(f,'float');
value=value(1:2:end)+j*value(2:2:end);
otherwise,
value=fread(f,type);
end
fclose(f);
function writeBinFile(filename,nums,type) f=fopen(filename,'w');
if (-1==f)
error('Can not open file!');
end
switch (type)
case 'complex_float',
temp=zeros(1,2*numel(nums));
temp(1:2:end)=real(nums);
temp(2:2:end)=imag(nums);
nums=temp;
fwrite(f,nums,'float');
otherwise,
fwrite(f,nums,type);
end
fclose(f);
简单的操作流程是这样的:
首先,开始调试C程序,设置好断点:
运行到第一个断点时,用Matlab计算测试用的时域数据,在Command Window输
入以下代码:
>> t=0:255;
>> fs=1/64;
>> s=exp(j*2*pi*fs*t);
>> writeBinFile('c:\sour.dat',s,'complex_float');
一个复正弦信号就被写入c:\sour.dat了。
切换到Visual DSP++,将c:\sour.dat的数据填充到DSP的存储器中:
单击OK按钮,导入成功。
让程序继续run,知道运行到下一个断点,此时FFT已经计算完毕,需将计算结果导出到数据文件中:
单击OK导出成功。
切换至Matlab,输入以下代码:
>> v=readBinFile('c:\dest.dat','complex_float');
>> plot(abs(v));
就得到了DSP计算的频谱幅度的图形了:
下图是Matlab自己计算的频谱的幅度,比较一下:
>> figure;plot(abs(fft(s)));