快速傅里叶c语言
❶ 基于cuda的一维快速傅里叶(fft)算法
CUFFT库说明有,很清楚的,下面代码赋值给data就可以了
#define NX 256
#define BATCH 10
cufftHandle plan;
cufftComplex *data;
cudaMalloc((void**)&data, sizeof(cufftComplex)*NX*BATCH);
if (cudaGetLastError() != cudaSuccess){
fprintf(stderr, "Cuda error: Failed to allocate\n");
return;
}
if (cufftPlan1d(&plan, NX, CUFFT_C2C, BATCH) != CUFFT_SUCCESS){
fprintf(stderr, "CUFFT error: Plan creation failed");
return;
}
...
/* Note:
* Identical pointers to input and output arrays implies in-place
transformation
*/
if (cufftExecC2C(plan, data, data, CUFFT_FORWARD) != CUFFT_SUCCESS){
fprintf(stderr, "CUFFT error: ExecC2C Forward failed");
return;
}
if (cufftExecC2C(plan, data, data, CUFFT_INVERSE) != CUFFT_SUCCESS){
fprintf(stderr, "CUFFT error: ExecC2C Inverse failed");
return;
}
❷ 傅里叶快速变换(FFT)中音频信号的频谱分析
关于对称是由于傅里叶变换的性质决定的。至于每个峰值所对应的实际频率需要转换一下。
FFT应用举例
例1:x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t)。采样频率fs=100Hz,分别绘制N=128、1024点幅频图。
clf;
fs=100;N=128;
%采样频率和数据点数
n=0:N-1;t=n/fs; %时间序列
x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t);
%信号
y=fft(x,N); %对信号进行快速Fourier变换
mag=abs(y);
%求得Fourier变换后的振幅
f=n*fs/N; %频率序列
subplot(2,2,1),plot(f,mag);
%绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=128');grid
on;
subplot(2,2,2),plot(f(1:N/2),mag(1:N/2));
%绘出Nyquist频率之前随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=128');grid
on;
%对信号采样数据为1024点的处理
fs=100;N=1024;n=0:N-1;t=n/fs;
x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t);
%信号
y=fft(x,N); %对信号进行快速Fourier变换
mag=abs(y);
%求取Fourier变换的振幅
f=n*fs/N;
subplot(2,2,3),plot(f,mag);
%绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=1024');grid
on;
subplot(2,2,4)
plot(f(1:N/2),mag(1:N/2));
%绘出Nyquist频率之前随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=1024');grid
on;
根据这个例子套用一下就可以了
❸ 傅里叶级数系数 C语言
http://hi..com/echo8404/item/190ee96a86906233ac3e83ef
❹ 利用C语言设计傅里叶程序, 求出给定信号的主频和该频率的相位。
请问有解决么,我也有这方面的需要,万分感谢
❺ 跪求用VC语言编写信号傅里叶转换程序的源代码!
一维的:
void FFT1(float a_r1[],float a_im[],int ex,bool inv)
{
int i,length=1;
float *sin_tbl;
float *cos_tbl;
float *buf;
for(i=0;i<ex;i++)
{
length*=2;
}
sin_tbl=(float *)malloc(length*sizeof(float));
cos_tbl=(float *)malloc(length*sizeof(float));
buf=(float *)malloc(length*sizeof(float));
cstb(length,inv,sin_tbl,cos_tbl);
fft1core(a_r1,a_im,length,ex,sin_tbl,cos_tbl,buf);
free(sin_tbl);
free(cos_tbl);
free(buf);
}
二维的:
void FFT2(float *a_rl,float *a_im,bool inv,int xsize,int ysize)
{
float *b_rl,*b_im;
float *hsin_tbl,*hcos_tbl,*vsin_tbl,*vcos_tbl;
float *buf_x,*buf_y;
int i;
b_rl=(float *)calloc(xsize*ysize,sizeof(float));
b_im=(float *)calloc(xsize*ysize,sizeof(float));
hsin_tbl=(float *)calloc(xsize,sizeof(float));
hcos_tbl=(float *)calloc(xsize,sizeof(float));
vsin_tbl=(float *)calloc(ysize,sizeof(float));
vcos_tbl=(float *)calloc(ysize,sizeof(float));
buf_x=(float *)malloc(xsize*sizeof(float));
buf_y=(float *)malloc(ysize*sizeof(float));
cstb(xsize,inv,hsin_tbl,hcos_tbl);
cstb(ysize,inv,vsin_tbl,vcos_tbl);
int x_exp=(int)(log(double(xsize))/log(2.0));
for(i=0;i<ysize;i++)
{
fft1core(&(*(a_rl+i*xsize)),&(*(a_im+i*xsize)),xsize,x_exp,hsin_tbl,hcos_tbl,buf_x);
}
rvmtx1(a_rl,b_rl,xsize,ysize);
rvmtx1(a_im,b_im,xsize,ysize);
int y_exp=(int)(log(double(ysize))/log(2.0));
for(i=0;i<xsize;i++)
{
fft1core(&(*(b_rl+i*ysize)),&(*(b_im+i*ysize)),ysize,y_exp,vsin_tbl,vcos_tbl,buf_y);
}
rvmtx2(b_rl,a_rl,xsize,ysize);
rvmtx2(b_im,a_im,xsize,ysize);
free(b_rl);
free(b_im);
free(hsin_tbl);
free(hcos_tbl);
free(vsin_tbl);
free(vcos_tbl);
free(buf_x);
free(buf_y);
}
用到的函数:
void fft1core(float a_rl[],float a_im[],int length,int ex,float sin_tbl[],float cos_tbl[],float buf[])
{
int i,j,k,w,j1,j2;
int numb,lenb,timb;
float xr,xi,yr,yi,nrml;
for(i=1;i<length;i+=2)
{
a_rl[i]=-a_rl[i];
a_im[i]=-a_im[i];
}
numb=1;
lenb=length;
for(i=0;i<ex;i++)
{
lenb/=2;
timb=0;
for(j=0;j<numb;j++)
{
w=0;
for(k=0;k<lenb;k++)
{
j1=timb+k;
j2=j1+lenb;
xr=a_rl[j1];
xi=a_im[j1];
yr=a_rl[j2];
yi=a_im[j2];
a_rl[j1]=xr+yr;
a_im[j1]=xi+yi;
xr=xr-yr;
xi=xi-yi;
a_rl[j2]=xr*cos_tbl[w]-xi*sin_tbl[w];
a_im[j2]=xr*sin_tbl[w]+xi*cos_tbl[w];
w+=numb;
}
timb+=(2*lenb);
}
numb*=2;
}
birv(a_rl,length,ex,buf);
birv(a_im,length,ex,buf);
for(i=1;i<length;i+=2)
{
a_rl[i]=-a_rl[i];
a_im[i]=-a_im[i];
}
nrml=1/sqrt(float(length));
for(i=0;i<length;i++)
{
a_rl[i]*=nrml;
a_im[i]*=nrml;
}
}
void cstb(int length,bool inv,float sin_tbl[],float cos_tbl[])
{
int i;
float xx,arg;
xx=float((-PI)*2/length);
if(!inv)
{
xx=-xx;
}
for(i=0;i<length;i++)
{
arg=i*xx;
sin_tbl[i]=sin(arg);
cos_tbl[i]=cos(arg);
}
}
void birv(float a[],int length,int ex,float b[])
{
int i,ii,k,bit;
for(i=0;i<length;i++)
{
for(k=0,ii=i,bit=0;;bit<<=1,ii>>=1)
{
bit=(ii&1)|bit;
if(++k==ex)
{
break;
}
}
b[i]=a[bit];
}
for(i=0;i<length;i++)
{
a[i]=b[i];
}
}
void rvmtx1(float *a,float *b,int xsize,int ysize)
{
int i,j;
for(j=0;j<ysize;j++)
{
for(i=0;i<xsize;i++)
{
*(b+i*ysize+j)=*(a+j*xsize+i);
}
}
}
void rvmtx2(float *a,float *b,int xsize,int ysize)
{
int i,j;
for(j=0;j<ysize;j++)
{
for(i=0;i<xsize;i++)
{
*(b+j*xsize+i)=*(a+i*ysize+j);
}
}
}