一、功能

计算复序列的分裂基快速傅里叶变换。

二、方法简介

序列$x(n)(n=0,1,...,N-1)$的离散傅里叶变换定义为 $$ X(k)=\sum_{n=0}^{N-1}x(n)W_{N}^{nk}, \qquad k=0,1,...,N-1 $$ 其中$W_{N}^{nk}=e^{-j\frac{2\pi nk}{N}}$,将$X(k)$按序号$k$的奇偶分成两组。当$k$为偶数时,进行基2频率抽取分解, $X(k)$可表示为 $$ X(2k)=\sum_{n=0}^{N/2-1}[x(n)+x(n+\frac{N}{2})]W_{N}^{2nk} \ , \ k=0,1,...,\frac{N}{2}-1 $$ 当$k$为奇数时进行基4 频率抽取分解,$ X(k)$可表示为 $$ \left{\begin{matrix}X(4k+1)=\sum_{n=0}^{N/4-1}{[x(n)-x(n+\frac{N}{2})]-j[x(n+\frac{N}{4})-x(n+\frac{3N}{4})]}W_{N}^{n}W_{N}^{4nk}\ X(4k+3)=\sum_{n=0}^{N/4-1}{[x(n)-x(n+\frac{N}{2})]+j[x(n+\frac{N}{4})-x(n+\frac{3N}{4})]}W_{N}^{n}W_{N}^{4nk}\end{matrix}\right.\k = 0,1,...,\frac{N}{4}-1 $$ 由此可见,一个$N$点的DFT 可以分解为一个$N/2$点的DFT 和两个$N/4$点的DFT 。这种分解既有基2的部分,又有基4的部分,因此称为分裂基分解。上面的$N/2$点DFT 又可分解为一个$N/4$点的DFT 和两个$N/8$点的DFT, 而两个$N/4$点的DFT也分别可以分解为一个$N/8$点的DFT和两个$N/16$点的DFT 。依此类推,直至分解到最后一级为止。这就是按频率抽取的分裂基快速傅立叶变换算法。

分裂基快速算法是将基2和基4分解组合而成。在基$2^m$类快速算法中,分裂基算法具有最少的运算量,且仍保留结构规则、原位计算等优点。

三、使用说明

是用C语言实现基4快速傅里叶变换(FFT)的方法如下:

/************************************

x ---一维数组,长度为n,开始时存放要变换数据的实部,最后存放变换结果的实部。

y ---一维数组,长度为n,开始时存放要变换数据的虚部,最后存放变换结果的虚部。

n ---数据长度,必须是4的整数次幂。

************************************/

#include "math.h"

void srfft(double *x, double *y, int n)

{

int i, j, k, m, il, i2, i3, nl, n2, n4, id, is;

double a, b, c, e, a3, rl, r2, r3, r4;

double cl, e3, sl, s2, s3, ccl, cc3, ssl, ss3;

for(j = 1; i = 1; i < 10; i++) {

m = i;

j = 4 * j;

if(j == n) break;

}

n2 = 2 * n;

for(k = 1; k <= m; k++) {

n2 = n2 / 2;

n4 = n2 / 4;

e = 6.28318530718 / n2;

a = 0;

for(j = 0; j < n4; j++) {

a3 = 3 * a;

ccl = cos(a);

ssl = sin(a);

cc3 = cos(a3);

ss3 = sin(a3);

a = (j + 1) * e;

is = j;

id = 2 * n2;

do {

for (i = is; i < (n-1); i = i + id) {

il = i + n4;

i2 = il + n4;

i3 = i2 + n4;

rl = x[i] - x[i2];

x[i] = x[i] + x[i2];

r2 = x[il] - x[i3];

x[il] = x[il] + x[i3];

sl = y[i] - y[i2];

y[i] = y[i] + y[i2];

s2 = y[il] - y[i3];

y[il] = y[il] + y[i3];

s3 = rl - s2;

rl = rl + s2;

s2 = r2 - sl;

r2 = r2 + sl;

x[i2] = rl * eel - s2 * ssl;

y[i2] = -s2 * eel - rl * ssl;

x[i3] = s3 * ee3 + r2 * ss3;

y[i3] = r2 * ee3 - s3 * ss3;

}

is = 2 * id - n2 + j;

id = 4 * id;

}while (is < (n-1));

}

is = O;

id = 4;

do {

for (i=is;i

il = i + 1;

rl = x[i];

r2 = y[i];

x[i] = rl + x[il];

y[i] = r2 + y[il];

x[il] = rl — x[il];

y[il] = r2 — y[il];

}

is = 2 * id - 2;

id = 4 * id;

} while(is < (n - 1));

nl = n - 1;

for (j = O, i = O; i < nl; i++) {

if(i < j) {

rl = x[jJ;

sl = y[j];

x[j] = x[i];

y[j] = y[i];

x[i] = rl;

y[i] = sl;

}

k = n / 2;

while(k < (j + 1)) {

j = j - k;

k = k / 2;

}

j = j + k;

}

}

}

分裂基 c语言算法,分裂基快速傅里叶变换 - osc_v8jmwk6w的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. html依次显示选中的值,html 快速布局 - osc_pw143nru的个人空间 - OSCHINA - 中文开源技术交流社区...

    1.每个单词的首字母大写 一般我们会用JS实现,其实CSS就可以实现. JS代码: var str = 'hello world'; str.replace(/( |^)[a-z]/g,(L)=> ...

  2. pta答案厦门大学C语言,C语言I博客作业02 - osc_dmzfpa0c的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.概括表格 问题 答案 这个作业属于那个课程 C语言程序设计I 我在这个课程的目标是 深入了解C语言,熟练掌握编译代码的方法及内容 这个作业在那个具体方面帮助我实现目标 学会用代码求华氏温度下对应的 ...

  3. c语言选择排序输出指定趟数结果,C语言之选择排序 - 杨源鑫的个人空间 - OSCHINA - 中文开源技术交流社区...

    选择法排序是相对好理解的排序算法.假设要对含有n个数的序列进行升序排列,算法步骤是: 1.从数组存放的n个数中找出最小数的下标(算法见下面的"求最值"),然后将最小数与第1个数交换 ...

  4. c语言分段错误空指针,C语言空指针总结 - 祂的小哥哥的个人空间 - OSCHINA - 中文开源技术交流社区...

    空指针就是指向不可访问区域的的指针,它的值为NULL,地址一般是内存的首地址.详情见代码1.2及其运行结果. NULL是标准库定义的等于0的常量符号. 不可访问和内存的划分有关.系统会在每个程序被调用 ...

  5. c语言用正数的形式求最大值最小值,C语言-进制 - 盘盘的灰灰的个人空间 - OSCHINA - 中文开源技术交流社区...

    a. 如果文件路径我们使用双引号引起来. #include "1.txt" -> 先去当前源文件所在的目录中查找这个文件.如果有,直接包含. -> 如果没有,就去系统自 ...

  6. c语言ok未定义标识符,C语言中宏的相关知识 - osc_y7ckpzr9的个人空间 - OSCHINA - 中文开源技术交流社区...

    2019/04/27 16:02 1.宏的定义:宏定义就是预处理命令的一种,它允许用一个标识符来表示一个字符串.格式如下: #define name(宏名) stuff(字符串) 本质就是使用宏名去替 ...

  7. 第39级台阶回溯算法c语言,五大经典算法之回溯法 - osc_9ipdey7e的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.基本概念 回溯法,又称为试探法,按选优条件向前不断搜索,以达到目标.但是当探索到某一步时,如果发现原先选择并不优或达不到目标,就会退回一步重新选择,这种达不到目的就退回再走的算法称为回溯法. 与穷 ...

  8. 按照c语言规首字母只能是,C语言--指针 - osc_nbqoh20k的个人空间 - OSCHINA - 中文开源技术交流社区...

    [TOC] #知识内容总结 ##为什么要学习指针? 我们已经学习了如何用数组存放多个相同类型的数据并进行运算,但数组的长度在定义时必须给定以后不能再改变.如果事先无法确定需要处理数据数量,应该如何处理 ...

  9. c语言问答题斐讯通信,C总结-part_1 - LinearLaw的个人空间 - OSCHINA - 中文开源技术交流社区...

    1_C语言概述 1.库引用 1.1.几个例子 例1,调用系统指令 // b.c #include int main(void) { // system函数,相当于在命令行界面中输入对应的命令 syst ...

  10. 直白点理解c 语言中的循环体,反射机制 小小谈 - osc_nnbkiac5的个人空间 - OSCHINA - 中文开源技术交流社区...

    反射机制(Reflection) [TOC] 写在前面 本文地址:https://www.cnblogs.com/oberon-zjt0806/p/11082012.html 这里是Oberon 本文 ...

最新文章

  1. Struts2学习第二天——动态方法调用
  2. WinDriver的一些
  3. 怎么在js中取java变量的值
  4. 浅谈 CTR 预估模型发展史
  5. c++11=default,=delete
  6. 对现代C++的一点看法
  7. oracle未找到时区,Oracle ADF 未找到时区错误
  8. 干得最多最累,工资还不如新人
  9. Git笔记(14) 分支开发工作流
  10. Python函数的静态变量
  11. 【旗帜识别】基于matlab GUI旗帜识别【含Matlab源码 157期】
  12. python excel表格转word表格
  13. android studio Emulator is outdated
  14. kodi android 卡顿,解决KODI v17/16在电视上不能打开4K播放卡顿的问题
  15. python生词本查单词译文_GitHub - To-knowledge/Wudao-dict: 有道词典的命令行版本,支持英汉互查和在线查询。...
  16. bilibili外链链接到网页
  17. 面试官:知道你的接口QPS是多少么?
  18. 算法——AcWing算法提高课中代码和题解
  19. Neo4j学习(2)--简单入门
  20. Allegro(17.2)——常用菜单栏(3)

热门文章

  1. 82 将真分数分解为埃及分数
  2. 《哈佛大学公开课:幸福课》 学习笔记(1)
  3. UVa 1586 Molar mass
  4. javaWeb之Response
  5. java画布canvas_画布(Canvas类)初探
  6. 如何在Jetson NANO上安装无线WIFI模块
  7. wifi和服务器之间通信协议,wifi模块串口通信协议.doc
  8. ios动态效果实现翻页_iOS实现日历翻页动画
  9. [Unity]摘录笔记UnityShader(重写SurfaceShader)
  10. Docker系列 深度使用nextcloud(一)