现在有一个wav文件,需要用算法,可以让它有低音,高音等声音特效。
哪位可以提供此算法呀?
哪位可以提供此算法呀?
解决方案 »
- 谁能给我个软件设计文档,要有UML之类的图的
- 问个问题,有关VS2005搜索框内容在代码区的黄色背景
- 网络攻防007——奇虎360软件安全大赛即将开战!
- 我要把两个CString合并为一个,再把这个CString转换为byte[]数组应该怎么做?
- 有关CComVariant的错误!大虾进来看看!!
- 我为什么学不会MFC,我是不是很低能呀
- 散分!来早的多给,晚了少给,不来谁给你!
- sizeof(类名)是vtbl的size吗?
- 如果解决此问题,如果有缘分,我请大家吃饭
- 上次问问题忘记给分了,请回答了的人来拿分
- 用过InstallShield的朋友请进:当我改变安装目录时怎么在选择的目录下面自动新建一个目录?
- 按下按钮,按钮上的文字就改变,这个怎么实现啊?
什么意思???
前段时间编了个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;
}