快速傅里葉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);
}
}
}