现在有一个wav文件,需要用算法,可以让它有低音,高音等声音特效。
哪位可以提供此算法呀?

解决方案 »

  1.   

    FFT?然后对进行处理,处理后再反向FFT?
      

  2.   

    FFT?然后对进行处理,处理后再反向FFT?
    什么意思???
      

  3.   

    FFT还能干这事?
    前段时间编了个FFT程序,进行科学计算,觉得效率还不错,贴出来分享一下
    ///////////////快速傅立叶变换程序/////////////////////
    #include "stdafx.h"
    #include <math.h>
    #define pi 3.14159265359
    #define M  8
    ////////////////取反函数//////////////////////////
    int rebit(int num,int p)
    {
     int i,rb=0,rb1,k,num1=num;
     for(i=1;i<=p;i++)
     {
      k=num&1;
      num=num1>>1;
      num1=num;
      rb=rb+k;
      rb1=rb<<1;
      rb=rb1;
     }
     return rb>>1;
    }
    ///////////////2的次方函数/////////////////////
    inline int pow2(int n)
    {
     return 1<<n;
    }
    ///////////////快速傅立叶变换/////////////////////
    /*
    ir---输入实部指针
    ii---输入虚部指针
    or---输出实部指针
    oi---输出虚部指针
    l----数组长度=2的l次方
    */
    void FFT(double *ir,double *ii,double or[],double oi[],int l)
    {
     int i,j,r,s,N,s0,m;
        double *kr,*ki,u,v,cc,cs,t;
     N=pow2(l);
     kr=new double[N];
     ki=new double[N];
     for(i=0;i<N;i++)
     {
      kr[i]=ir[rebit(i,l)];
            ki[i]=ii[rebit(i,l)];
     }
     for(i=1;i<=l;i++)
     {
      m=pow2(i);
      for(j=0;j<pow2(l-i);j++)
      {
       for(r=0;r<pow2(i-1);r++)
       {
        s=j*pow2(i)+r;
        s0=s+pow2(i-1);
        t=2*pi*r/m;
        cc=cos(t);
        cs=sin(t);
                    u=kr[s0]*cc+ki[s0]*cs;
        v=ki[s0]*cc-kr[s0]*cs;
                    kr[s0]=kr[s]-u;
        ki[s0]=ki[s]-v;
                    kr[s]=kr[s]+u;
        ki[s]=ki[s]+v;
       }
      }
     }
        for(i=0;i<N;i++)
     {
      or[i]=kr[i];
            oi[i]=ki[i];
     }
     delete []kr;
        delete []ki;
    }
    ///////////////快速傅立叶反变换程序/////////////////////
    #include "stdafx.h"
    #include <math.h>
    #define pi 3.14159265359
    #define M  8
    ////////////////取反函数//////////////////////////
    int rebit(int num,int p)
    {
     int i,rb=0,rb1,k,num1=num;
     for(i=1;i<=p;i++)
     {
      k=num&1;
      num=num1>>1;
      num1=num;
      rb=rb+k;
      rb1=rb<<1;
      rb=rb1;
     }
     return rb>>1;
    }
    ///////////////2的次方函数/////////////////////
    inline int pow2(int n)
    {
     return 1<<n;
    }
     ///////////////快速傅立叶反变换/////////////////////
    /*
    ir---输入实部指针
    ii---输入虚部指针
    or---输出实部指针
    oi---输出虚部指针
    l----数组长度=2的l次方
    */
    void RFFT(double *ir,double *ii,double or[],double oi[],int l)
    {
     int i,j,r,s,N,s0,m;
        double *kr,*ki,u,v,cc,cs,t;
     N=pow2(l);
     kr=new double[N];
     ki=new double[N];
     for(i=0;i<N;i++)
     {
      kr[i]=ir[rebit(i,l)];
            ki[i]=ii[rebit(i,l)];
     }
     for(i=1;i<=l;i++)
     {
      m=pow2(i);
      for(j=0;j<pow2(l-i);j++)
      {
       for(r=0;r<pow2(i-1);r++)
       {
        s=j*pow2(i)+r;
        s0=s+pow2(i-1);
        t=2*pi*r/m;
        cc=cos(-t);
        cs=sin(-t);
                    u=kr[s0]*cc+ki[s0]*cs;
        v=ki[s0]*cc-kr[s0]*cs;
                    kr[s0]=kr[s]-u;
        ki[s0]=ki[s]-v;
                    kr[s]=kr[s]+u;
        ki[s]=ki[s]+v;
       }
      }
     }
        for(i=0;i<N;i++)
     {
      or[i]=kr[i]/N;
            oi[i]=ki[i]/N;
     }
     delete []kr;
        delete []ki;
    }
    /////////////////////////////////////////
    int main(int argc, char* argv[])
    {
     double f1[M],f2[M],g1[M],g2[M];
     int i;
     for(i=0;i<M;i++)
     {
            f1[i]=i;
      f2[i]=0;
     }
        RFFT(f1,f2,g1,g2,3);
     for(i=0;i<M;i++)
     {
            printf("%f+(%f)i\n",g1[i],g2[i]);
     }
     return 0;
    }
      

  4.   

    fft  ---  快速傅立叶变换
      

  5.   

    Fast Fourier Transform Algorithm (method)快速傅氏变换算法我要的不是这个,而是低音,高音等声音特效的算法!