#include "string.h" #include "stdio.h" #include "arm_math.h" #include "stm32f4xx.h" #include "mymem.h" #include "fft2d.h" int FFT2D_Init (FFT2D_Struct *fft2d,int len) { fft2d->fftLen=len; if (arm_rfft_fast_init_f32 (&fft2d->fftStruct,len)==0) { fft2d->imgBuff=mymalloc (len*len*sizeof (float32_t)); fft2d->columnOutBuff=mymalloc (len*sizeof (float32_t)); fft2d->rowInBuff=mymalloc (len*sizeof (float32_t)); if ((fft2d->imgBuff!=0) &&(fft2d->columnOutBuff!=0) && (fft2d->rowInBuff!=0)) return 0; else { myfree(fft2d->imgBuff); myfree(fft2d->columnOutBuff); myfree(fft2d->rowInBuff); } } return -1; } //傅里叶变换指定图像 void FFT2D_Rfft (FFT2D_Struct *fft2d,float32_t *img,int xsize,int ysize) { //变换512行 for (int i=0;ifftLen;i++) { //变换一行 if (ifftLen;j++) { if (jrowInBuff[j]=img[i*xsize+j]; } else { fft2d->rowInBuff[j]=0; } } } else { for (int j=0;jfftLen;j++) { fft2d->rowInBuff[j]=0; } } arm_rfft_fast_f32 (&fft2d->fftStruct,fft2d->rowInBuff,fft2d->imgBuff+i*fft2d->fftLen,0); } //变换512列 for (int i=0;ifftLen;i++) { //变换一列 for (int j=0;jfftLen;j++) { fft2d->rowInBuff[j]=fft2d->imgBuff[j*fft2d->fftLen+i]; } arm_rfft_fast_f32 (&fft2d->fftStruct,fft2d->rowInBuff,fft2d->columnOutBuff,0); for (int j=0;jfftLen;j++) { fft2d->imgBuff[j*fft2d->fftLen+i]=fft2d->columnOutBuff[j]; } } } //傅里叶逆变换,如果没有输入图像,则变换FFT2D_Struct.imgBuff 中存储的图像 void FFT2D_Rifft (FFT2D_Struct *fft2d,float32_t *img) { float32_t *inImg=0; if (img) inImg=img; else inImg=fft2d->imgBuff; //逆变换512列 for (int i=0;ifftLen;i++) { //逆变换一列 for (int j=0;jfftLen;j++) { fft2d->rowInBuff[j]=inImg[j*fft2d->fftLen+i]; } arm_rfft_fast_f32 (&fft2d->fftStruct,fft2d->rowInBuff,fft2d->columnOutBuff,1); for (int j=0;jfftLen;j++) { fft2d->imgBuff[j*fft2d->fftLen+i]=fft2d->columnOutBuff[j]; } } //逆变换512行 for (int i=0;ifftLen;i++) { //逆变换一行 for (int j=0;jfftLen;j++) { fft2d->rowInBuff[j]=fft2d->imgBuff[i*fft2d->fftLen+j]; } arm_rfft_fast_f32 (&fft2d->fftStruct,fft2d->rowInBuff,fft2d->imgBuff+i*fft2d->fftLen,1); } } void FFT2D_Delete (FFT2D_Struct *fft2d) { myfree(fft2d->imgBuff); myfree(fft2d->columnOutBuff); myfree(fft2d->rowInBuff); }