lvhaow
驱动小牛
驱动小牛
  • 注册日期2001-10-31
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分44分
  • 威望35点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:2787回复:5

关于傅立叶变换算法的问题,100分求助。

楼主#
更多 发布于:2004-10-09 12:10
一直搞硬件,现在总算遇到算法问题了,想躲也躲不开,只好硬着头皮搞。

这是一个数字滤波的项目,硬件核心使用定点DSP-VC5402,设计思路是通过DSP把采样到的数字音频信号,按帧进行频谱分析,使用傅立叶变换把时域信号转为频域信号,再对频域数据中的特定频段进行衰减或提升,再使用傅立叶逆变换把处理过的频域信号转回为时域信号,最后通过DA输出。
问题有三:
1、傅立叶变换要用到复数运算,第一步就是把要处理的数据,由实数组转为复数组,谁能告诉我转换的规则?就是复数的实部和虚部与转换前的实数是什么关系?

2、傅立叶变换后得到的频域信号数据,也是复数表示的,数组大小与转换前一样,这个数组的数据表示的就是低频到高频的能量分布吗?怎么使用这组数据?

3、谁能给个傅立叶逆变换的算法?后面附上正变换的PC算法程序,其中有浮点运算,因为我还没有把它移到定点DSP上。


void CFOURIERDlg::OnOK()
{
 Complex U,W,T;
 int LE,LE1,I,J,IP;
 int M=10;
 int N=(int)pow(2,M);
 float PI;
 PI=3.142e+0;
//由于采用时间抽选奇偶分解方式,所以在参加运算前首先要对时间序列进行倒序
 Complex * A=new Complex[N];
 ReverseOrder(A,N);
 int L=1;
 while(L<=M)
 {
   LE=(int)pow(2,L); //2的L次方
   LE1=LE/2;
   U.Re=1.0f;
   U.Im=0.0f;
   //计算W算子的值
   W.Re=(float)cos(PI/(1.0*LE1));
   W.Im=(float)-1.0*sin(PI/(1.0*LE1));
   if(abs(W.Re)<1.0e-12)
     W.Re=0.0f;
   if(abs(W.Im)<1.0e-12)
     W.Im=0.0f;
   J=1;
   while(J<=LE1)
   {
     I=J;
     while(I<=N)
     {
      IP=I+LE1;
      //复数运算A×U
      T.Re=(float)A[IP-1].Re*U.Re-A[IP-1].Im*U.Im;
      T.Im=(float)A[IP-1].Re*U.Im+A[IP-1].Im*U.Re;
      //复数运算A-T
      A[IP-1].Re=(float)A[I-1].Re-T.Re;
      A[IP-1].Im=(float)A[I-1].Im-T.Im;
      //复数运算A+T
      A[I-1].Re+=T.Re;
      A[I-1].Im+=T.Im;
      I+=LE;
     }
     float temp=U.Re;
     //复数运算U×W
     U.Re=(float)U.Re*W.Re-U.Im*W.Im;
     U.Im=(float)temp*W.Im+U.Im*W.Re;
     J++;
    }
    L++;
   }
   delete A;
}

void CFOURIERDlg::ReverseOrder(Complex * A,int N)
{
  int NV2=N/2;
  int NM1=N-1;
  int I,J,K=0;
  //用于中介的复数变量T
  Complex T;
  I=J=1;
  while(I<=NM1)
  {
    if(I<J)
    {//借助于中间变量T,将A[J-1]的内容和A[I-1]的内容互换
     T=A[J-1];
     A[J-1]=A[I-1];
     A[I-1]=T;
    }
    K=NV2;
    while(K<J)
    {
     J-=K;
     K/=2;
     }
    J+=K;
    I++;
  }
}
lvhaow
lrm101
驱动牛犊
驱动牛犊
  • 注册日期2004-09-14
  • 最后登录2005-04-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-10-10 10:25
经过A/D采样后的数据是实数组,转化成复数组时,是不可以把复数组定义成结构体变量,即让复数组的实部等于原来数组的实数,虚部定义为0,这样就可以转化了。
2.经过fft处理后的频域数据与复数组的大小相同,在Y(k)中的k值就代表第k次谐波了。
lvhaow
驱动小牛
驱动小牛
  • 注册日期2001-10-31
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分44分
  • 威望35点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2004-10-10 19:44
lrm101兄:
这句话我没看懂:"经过A/D采样后的数据是实数组,转化成复数组时,是不可以把复数组定义成结构体变量,即让复数组的实部等于原来数组的实数,虚部定义为0,这样就可以转化了。"
您的意思是不是定义一个有两个浮点数成员的结构变量数组,将其实部值取AD后的实数值,虚部为0?

2、转换后的频域数据是复数,有实部和虚部,如果我想把某次谐波进行衰减,该如何处理呢?是保持幅角不变,减少向量值;还是其它什么算法?

另,我找到逆运算的算法了。

多谢多谢!!!!
lvhaow
lrm101
驱动牛犊
驱动牛犊
  • 注册日期2004-09-14
  • 最后登录2005-04-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-10-11 10:01
我就是那个意思,您找到的逆运算算法是指位码倒序算法吗?采用什么语言编写的,是用C语言编写的还是汇编语言编写的,我是用C编写的,能把您的程序传给我一份吗?我也look look,希望能与您多交流
多谢了!
lvhaow
驱动小牛
驱动小牛
  • 注册日期2001-10-31
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分44分
  • 威望35点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2004-10-18 10:01
呵呵,找到的那个逆运算程序不能用,但是原来那个正变换的程序是可以用的,于是就把它的运算过程完全颠倒过来,竟然试通了。其实傅立叶变换本来就是可逆的。
lvhaow
lrm101
驱动牛犊
驱动牛犊
  • 注册日期2004-09-14
  • 最后登录2005-04-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-10-19 08:45
请问你经常在那个网站上搜程序呀,
游客

返回顶部