用CCS画出信号时域图&在对信号进行傅里叶变换时遇到的问题
时间:10-02
整理:3721RD
点击:
本帖分为两个部分,一个是用CCS的图形工具,画出仿真信号的时域图,另一部分是相对这个信号进行傅里叶变换的时候遇到的问题。(当然这里面的算法中的命名规则、C的书写方式都不符合C标准,而且现在刚开始还只是考虑算法的实现问题,还没来得及考虑效率的问题) 最近一直在尝试用C编写几个简单的算法,可是一到动手才发现,自己原有的那点C语言基础知识完全不够用,然后去看了看指针,发现还是不行,所以本想自己获得一个信号,然后对其进行傅里叶变换,结果只进行了前面简单的一步,后面的傅里叶变换的算法实在调试通不过。在这里,就让我班门弄下斧,和大家说一下这前面的工作,再来向大家求教一下后面傅里叶变换程序的解决方法,并附上该傅里叶变换的matlab程序(摘自《数字信号处理的MATLAB实现》,科学出版社)。
1、获得一个x=sin(2*pi*t)+0.5*sin(2*pi*5*t)的信号
①为了使得程序能够顺利运行,应设置堆栈(stack)的大小,这里设置为0x100000,如图1所示
图 1
②图2为获得x=sin(2*pi*t)+0.5*sin(2*pi*5*t),并且在主函数中调用(图3),其中n为采样点数,dt为采样间隔
图 2 图3
③在调试后,先查找函数(信号sin_Endd)的指针值,如图4,图形属性设置界面如图5
图 4 图5
④画出图形如图6
图 6
2、傅里叶变换算法,贴上a[k],b[k],c[k]的代码,注意以下代码并不能实现需要的傅里叶变换,主要问题是:为什么得到的a[k]和b[k]均为0,贴出来是希望哪位能够指正以下。
#define N 256
#defin #define PF(x) ((x)*(x))
double *compute_ak()
{
int n=256;
float dt=0.02;
double *a=(double *)malloc(128*sizeof(double));
int k,j;
int h;
for(h=0;h<128;h++)
{
a[h]=0.0;
}
double *sin_ak=(sin_fun(n,dt));
for(k=0;k<128;k++)
{
for(j=0;j<256;j++)
{
a[k]=a[k]+(sin_ak[j])*(2/N)*cos(2*pi*k*j/N);
}
}
return a;
}
double *compute_bk()
{
int n=256;
float dt=0.02;
double *b=(double *)malloc(128*sizeof(double));
int k,j;
double *sin_bk=(sin_fun(n,dt));
int h;
for(h=0;h<128;h++)
{
b[h]=0.0;
}
for(k=0;k<128;k++)
{
for(j=0;j<N;j++)
{
b[k]=b[k]+(sin_bk[j])*(2/N)*sin(2*pi*k*j/N);
}
}
return b;
}
double *compute_ck()
{
double *c=(double *)malloc(128*sizeof(double));
double *a=compute_ak();
double *b=compute_bk();
int k;
for(k=0;k<m;k++)
{
c[k]=sqrt(PF(a[k])+PF(b[k]));
}
return c;
}
3、上述希望得到的c即为经傅里叶变换后所得到的谱值(由于a和b均为0,得到的c也为0)。
附MATLAB的傅里叶变换程序以及效果图
1、获得一个x=sin(2*pi*t)+0.5*sin(2*pi*5*t)的信号
①为了使得程序能够顺利运行,应设置堆栈(stack)的大小,这里设置为0x100000,如图1所示
图 1
②图2为获得x=sin(2*pi*t)+0.5*sin(2*pi*5*t),并且在主函数中调用(图3),其中n为采样点数,dt为采样间隔
图 2 图3
③在调试后,先查找函数(信号sin_Endd)的指针值,如图4,图形属性设置界面如图5
图 4 图5
④画出图形如图6
图 6
2、傅里叶变换算法,贴上a[k],b[k],c[k]的代码,注意以下代码并不能实现需要的傅里叶变换,主要问题是:为什么得到的a[k]和b[k]均为0,贴出来是希望哪位能够指正以下。
#define N 256
#defin #define PF(x) ((x)*(x))
double *compute_ak()
{
int n=256;
float dt=0.02;
double *a=(double *)malloc(128*sizeof(double));
int k,j;
int h;
for(h=0;h<128;h++)
{
a[h]=0.0;
}
double *sin_ak=(sin_fun(n,dt));
for(k=0;k<128;k++)
{
for(j=0;j<256;j++)
{
a[k]=a[k]+(sin_ak[j])*(2/N)*cos(2*pi*k*j/N);
}
}
return a;
}
double *compute_bk()
{
int n=256;
float dt=0.02;
double *b=(double *)malloc(128*sizeof(double));
int k,j;
double *sin_bk=(sin_fun(n,dt));
int h;
for(h=0;h<128;h++)
{
b[h]=0.0;
}
for(k=0;k<128;k++)
{
for(j=0;j<N;j++)
{
b[k]=b[k]+(sin_bk[j])*(2/N)*sin(2*pi*k*j/N);
}
}
return b;
}
double *compute_ck()
{
double *c=(double *)malloc(128*sizeof(double));
double *a=compute_ak();
double *b=compute_bk();
int k;
for(k=0;k<m;k++)
{
c[k]=sqrt(PF(a[k])+PF(b[k]));
}
return c;
}
3、上述希望得到的c即为经傅里叶变换后所得到的谱值(由于a和b均为0,得到的c也为0)。
附MATLAB的傅里叶变换程序以及效果图
你可以在Ti官网下载DSPLIB库,里面有两个FFT的库函数。
DSPF_sp_fftSPxSP和DSPF_sp_fftSPxSP_cn 一个是经过优化的库函数,一个是没有经过优化的C程序两个输出是一样的,运行时间不一样。
恩,那个我知道,我就想看看我用的指针出了什么问题,一直不得其解