FFT 的C 语言
FFT 的C 语言
说好的C 语言实现。必须搞定它!
理论介绍:
http://blog.csdn.net/cinmyheart/article/details/39052739
这里有之前matlab & Octave 的实现
http://blog.csdn.net/cinmyheart/article/details/39042623
先介绍一下整体的实现文件
最基本的是fft.c这个文件是算法实现的核心
fft.h
/***************************************************************
code writer : EOF
code file : fft.h
code date : 2014.09.17
e-mail : jasonleaster@gmail.com ****************************************************************/
#ifndef _FFT_IN_C_H
#define _FFT_IN_C_H #include <stdio.h>
#include <stdlib.h>
#include <math.h> #define PI 3.1415926
#define DEBUG struct complex_number
{
double real;
double imagine;
}; struct signal
{
int size;//how many points in this domain.
struct complex_number points[0];
}; int reverse_bits(int num,int bits);
int get_r_in_Wn(int k, int m, int bits); void init_signal(struct signal* p_signal,double* array,int size); struct signal* fft(struct signal* p_signal); struct complex_number complex_mul(struct complex_number* x,struct complex_number* y); struct complex_number complex_add(struct complex_number* x, struct complex_number *y); struct complex_number complex_sub(struct complex_number* x, struct complex_number *y); void show_signal(struct signal* const signal); void show_complex_number(struct complex_number * x);
#endif
complex_add.c
/***************************************************************
code writer : EOF
code file : complex_add.c
code date : 2014.09.17
e-mail : jasonleaster@gmail.com code purpose :
We need add operation between complex number, so here is
my method. If you find something wrong with my code, please touch
me by e-mail. Thank you :) ****************************************************************/
#include "fft.h"
#include "fft.h" struct complex_number complex_add(struct complex_number* x, struct complex_number *y)
{
struct complex_number ret; if(!x || !y)
{
printf("You passed NULL into %s()\n",__FUNCTION__);
goto out ;
} ret.real = x->real + y->real;
ret.imagine = x->imagine + y->imagine;
out:
return ret;
}
complex_mul.c
/***************************************************************
code writer : EOF
code file : complex_mul.c
code date : 2014.09.17
e-mail : jasonleaster@gmail.com code purpose :
We need multiple(*) operation between complex number, so here is
my method. If you find something wrong with my code, please touch
me by e-mail. Thank you :) ****************************************************************/
#include "fft.h" struct complex_number complex_mul(struct complex_number* x,struct complex_number *y)
{
struct complex_number ret;
if(!x || !y)
{
printf("You passed NULL into %s()\n",__FUNCTION__);
goto out ;
} ret.real = (x->real) * (y->real) - (x->imagine)*(y->imagine);
ret.imagine = (x->real) * (y->imagine) + (x->imagine)* (y->real); out:
return ret;
}
complex_sub.c
#include "fft.h" struct complex_number complex_sub(struct complex_number* x, struct complex_number *y)
{
struct complex_number ret; if(!x || !y)
{
printf("You passed NULL into %s()\n",__FUNCTION__);
goto out ;
} ret.real = x->real - y->real;
ret.imagine = x->imagine - y->imagine;
out:
return ret;
}
get_r_in_Wn.c
/******************************************************************************
code writer : EOF
code file : get_r_in_Wn.c
code date : 2014.09.17
e-mail : jasonleaster@gmail.com Input Parameter : @k, the location of input signal
@m, the current layyer
@N, the total number of inputed signal
@bits, how many bits should be used to represent 'N' Output Parameter: @ret , the value of 'r'
*******************************************************************************/
int get_r_in_Wn(int k, int m, int bits)
{
int tmp = k<<(bits-m); return tmp&((1<<m) -1);
}
reverse_bits.c
/***************************************************************
code writer : EOF
code file : reverse_bits.c
code date : 2014.09.17
e-mail : jasonleaster@gmail.com code purpose : Reverse the bits of input number If you find something wrong with my code, please touch
me by e-mail. Thank you :) ****************************************************************/ int reverse_bits(int num,int bits)
{
int ret = 0;
int copy_num = 0; for(ret = 0,copy_num = num; bits > 0; bits--)
{
ret += (copy_num % 2) * (1<<(bits-1)); copy_num >>= 1;
} return ret;
}
show_complex_number.c
/***************************************************************
code writer : EOF
code file : show_complex_number.c
code date : 2014.09.17
e-mail : jasonleaster@gmail.com If you find something wrong with my code, please touch
me by e-mail. Thank you :) ****************************************************************/
#include "fft.h" void show_complex_number(struct complex_number * x)
{
printf("real:%lf imagine:%lf\n",x->real,x->imagine);
}
show_signal.c
/***************************************************************
code writer : EOF
code file : show_signal.c
code date : 2014.09.17
e-mail : jasonleaster@gmail.com code purpose :
If you want to see the detail about signal that @p_signal point to, just call this API. If you find something wrong with my code, please touch
me by e-mail. Thank you :) ****************************************************************/
#include "fft.h" void show_signal(struct signal* const p_signal)
{
if(!p_signal)
{
printf("You passed NULL into function %s line:%d\n",__FUNCTION__,__LINE__); return ;
} int tmp = 0; for(tmp = 0; tmp < p_signal->size;tmp++)
{
printf("point %d real : %lf imagine %lf\n",\
tmp,\
p_signal->points[tmp].real,\
p_signal->points[tmp].imagine);
}
printf("\n\n");
}
fft.c
/***************************************************************
code writer : EOF
code file : fft.c
code date : 2014.09.17
e-mail : jasonleaster@gmail.com code purpose : This code core-part of fft in my implementation.
If you find something wrong with my code, please touch
me by e-mail. Thank you :) ****************************************************************/
#include "fft.h" struct signal* fft(struct signal* p_signal)
{
struct signal* p_input_signal = \
(struct signal*) malloc(sizeof(struct complex_number)*(p_signal->size) + sizeof(p_signal->size)); struct signal* p_out_put_signal = \
(struct signal*)malloc(sizeof(struct complex_number)*(p_signal->size) + sizeof(p_signal->size)); *p_input_signal = *p_signal;
*p_out_put_signal = *p_signal; int tmp = 0;
int index = 0;
int bits = 0; int layyer= 0;
int selected_point = 0;
int pre_half = 0; int r = 0;
double x = 0;
struct complex_number W_rN ;
struct complex_number complex_tmp ; /*
** We caculate how many bits should be used to
** represent the size of the number of input signal.
*/
for(tmp = p_signal->size-1;tmp > 0;tmp>>=1)
{
bits++;
} /*
** We should re-sequence the input signal
** by bit-reverse.
*/
for(tmp = 0;tmp < p_signal->size;tmp++)
{
index = reverse_bits(tmp,bits);
p_input_signal->points[tmp] = p_signal->points[index];
#ifdef DEBUG
printf(" tmp:%5d index:%5d ",tmp,index);
show_complex_number(&p_signal->points[index]);
#endif
} for(layyer = 1;layyer <= bits;layyer++)
{ #ifdef DEBUG
printf("layyer %d input\n",layyer);
show_signal(p_input_signal);
#endif for(selected_point = 0;selected_point < p_signal->size;selected_point += 1<<(layyer))
{
for(pre_half = selected_point,r = 0,x = 0;
pre_half < (selected_point + (1<<(layyer-1)));
pre_half++)
{
r = get_r_in_Wn(pre_half,layyer,bits); #ifdef DEBUG
printf("r: %d\n",r);
#endif x = -2*PI*r/((double)(p_input_signal->size));
W_rN.real = cos(x);
W_rN.imagine = sin(x); complex_tmp = complex_mul(&W_rN , &(p_input_signal->points[pre_half + (1<<(layyer-1))]) ); #ifdef DEBUG
show_complex_number(&complex_tmp);
#endif p_out_put_signal->points[pre_half] = \
complex_add(&p_input_signal->points[pre_half],&complex_tmp); p_out_put_signal->points[pre_half + (1<<(layyer-1))] = \
complex_sub(&p_input_signal->points[pre_half],&complex_tmp); } } #ifdef DEBUG
printf("layyer%d output\n",layyer);
show_signal(p_out_put_signal);
#endif for(tmp = 0;tmp < p_out_put_signal->size;tmp++)
{
p_input_signal->points[tmp] = p_out_put_signal->points[tmp];
} } free(p_input_signal);
return p_out_put_signal;
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。
FFT 的C 语言的更多相关文章
- 关于一个通俗易懂的FFT的C语言实现教程
找到一个通俗易懂并且神奇并且有趣的FFT算法C语言实现教程:http://www.katjaas.nl/FFTimplement/FFTimplement.html 只要对矩阵比较熟悉就能在教程的辅助 ...
- FFT算法的完整DSP实现(转)
源:FFT算法的完整DSP实现 傅里叶变换或者FFT的理论参考: [1] http://www.dspguide.com/ch12/2.htm The Scientist and Engineer's ...
- Other-Website-Contents.md
title: 本站目录 categories: Other sticky: 10 toc: true keywords: 机器学习基础 深度学习基础 人工智能数学知识 机器学习入门 date: 999 ...
- 灰度图像--图像分割 阈值处理之OTSU阈值
学习DIP第55天 转载请标明本文出处:***http://blog.csdn.net/tonyshengtan ***,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:http ...
- 用于ARM上的FFT与IFFT源代码(C语言,不依赖特定平台)(转)
源:用于ARM上的FFT与IFFT源代码(C语言,不依赖特定平台) 代码在2011年全国电子大赛结束后(2011年9月3日)发布,多个版本,注释详细. /*********************** ...
- FFT算法理解与c语言的实现
完整内容迁移至 http://www.face2ai.com/DIP-2-3-FFT算法理解与c语言的实现/ http://www.tony4ai.com/DIP-2-3-FFT算法理解与c语言的实现 ...
- 用于ARM上的FFT与IFFT源代码-C语言
/********************************************************************************* 程序名称:快速傅里叶变换(FFT) ...
- 【转】用C语言实现FFT算法
傅里叶变换 快速傅里叶变换(Fast Fourier Transform,FFT)是一种可在 时间内完成的离散傅里叶变换(Discrete Fourier transform,DFT)算法. 在算法 ...
- 二维FFT,IFFT,c语言实现
学习DIP第6天 完整内容迁移至http://www.face2ai.com/DIP-2-4-二维FFT-IFFT-c语言实现/ http://www.tony4ai.com/DIP-2-4-二维FF ...
随机推荐
- UVA662- Fast Food
题意:在一条公路上,有n个酒店,要建造k个供给站(建造在酒店所在的位置),给出酒店的位置,求怎么样建造供给站才干使得每一个酒店都能得到服务且所要走的路程最短. 思路:在i到j酒店建立一个供给站,要使得 ...
- NSIS:卸载时选择组件
原文 NSIS:卸载时选择组件 有时候,我们想要在卸载时也可以选择组件,进行定制性的卸载,那么,以下文字将简略讨论这个问题: 题外:我们想要卸载时选择组件,当然是在安装时要有组件选择页面的前提下,也就 ...
- 在InstallShield中发布单一的Setup.exe文件
原文:在InstallShield中发布单一的Setup.exe文件 InstallShield默认的Release模式下,生成了一个setup.exe文件,一个msi文件,以及一些其它的杂项文件. ...
- java多线程学习(两)——创建一个线程
一个.java创建两个线程的方法 1.从java.lang.Thread派生一个新类线程类,其覆盖run()方法 2.实现Runnable接口.重载Runnable接口中的run()方法. 使用Thr ...
- 汉高澳大利亚sinox接口捆绑经典winxp,全面支持unicode跨语言处理
用qtconfig(或者qtconfig-qt4)设置字体后,汉澳sinox视窗界面以跟winxp媲美的界面出现,爽心悦目. 并且视窗使用非常稳定.非常少出现死机无响应现象,堪称完美. 引入unico ...
- [Mac] Mac book pro互换SSD硬盘、生产启动U菜、TimeMachine恢复 小记
Mac book pro 硬盘故障.互换SSD硬盘.启动U磁盘生产 小记 2012新年买Mbp了.尽管各种功能都能用,但常常频繁的出现鼠标风火轮,已经下好的电影在本地播放时都会隔个几分钟卡一下. 拿到 ...
- MyEclipse2014 设备 checkstyle、PMD、findbugs 最简单的方法 详细说明
最近的实验需要的代码审查和应用程序性能优化.在需求MyEclipse安装某些插件,由于如今的MyEclipse版本号和大多数教程的不一样了,一些安装选项也已经改变,所以安装起来非常费事,通过不断的尝试 ...
- Windows移动开发(一)——登堂入室
開始本博客之前先分享一个自己的好消息吧,2014年3月31日起,正式就职于北京****集团Win8project师.主要负责将IOS和Android应用移植到Win8.1平板上,目标客户是银行,闲话不 ...
- 编程算法 - 区间调度问题 代码(C)
区间调度问题 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有n项工作, 每项工作分别在s时间開始, 在t时间结束. 对于每项工作能够选择參与 ...
- 用css2属性clip实现网页进度条
前言 看了网上一些关于网页进度条样式的资料,有很多方式实现,针对其展现形式,有用图片的,有用css2属性clip,有用flash的,本人就学会了一种,下面就简单来介绍一下. css2的属性clip 如 ...