FFT算法的C语言实现

:数字信号处理


需要注意的几个点

#mermaid-svg-Q0Cv61uzu3GVxhM0 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-Q0Cv61uzu3GVxhM0 .label text{fill:#333}#mermaid-svg-Q0Cv61uzu3GVxhM0 .node rect,#mermaid-svg-Q0Cv61uzu3GVxhM0 .node circle,#mermaid-svg-Q0Cv61uzu3GVxhM0 .node ellipse,#mermaid-svg-Q0Cv61uzu3GVxhM0 .node polygon,#mermaid-svg-Q0Cv61uzu3GVxhM0 .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-Q0Cv61uzu3GVxhM0 .node .label{text-align:center;fill:#333}#mermaid-svg-Q0Cv61uzu3GVxhM0 .node.clickable{cursor:pointer}#mermaid-svg-Q0Cv61uzu3GVxhM0 .arrowheadPath{fill:#333}#mermaid-svg-Q0Cv61uzu3GVxhM0 .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-Q0Cv61uzu3GVxhM0 .flowchart-link{stroke:#333;fill:none}#mermaid-svg-Q0Cv61uzu3GVxhM0 .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-Q0Cv61uzu3GVxhM0 .edgeLabel rect{opacity:0.9}#mermaid-svg-Q0Cv61uzu3GVxhM0 .edgeLabel span{color:#333}#mermaid-svg-Q0Cv61uzu3GVxhM0 .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-Q0Cv61uzu3GVxhM0 .cluster text{fill:#333}#mermaid-svg-Q0Cv61uzu3GVxhM0 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-Q0Cv61uzu3GVxhM0 .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-Q0Cv61uzu3GVxhM0 text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-Q0Cv61uzu3GVxhM0 .actor-line{stroke:grey}#mermaid-svg-Q0Cv61uzu3GVxhM0 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-Q0Cv61uzu3GVxhM0 .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-Q0Cv61uzu3GVxhM0 #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-Q0Cv61uzu3GVxhM0 .sequenceNumber{fill:#fff}#mermaid-svg-Q0Cv61uzu3GVxhM0 #sequencenumber{fill:#333}#mermaid-svg-Q0Cv61uzu3GVxhM0 #crosshead path{fill:#333;stroke:#333}#mermaid-svg-Q0Cv61uzu3GVxhM0 .messageText{fill:#333;stroke:#333}#mermaid-svg-Q0Cv61uzu3GVxhM0 .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-Q0Cv61uzu3GVxhM0 .labelText,#mermaid-svg-Q0Cv61uzu3GVxhM0 .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-Q0Cv61uzu3GVxhM0 .loopText,#mermaid-svg-Q0Cv61uzu3GVxhM0 .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-Q0Cv61uzu3GVxhM0 .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-Q0Cv61uzu3GVxhM0 .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-Q0Cv61uzu3GVxhM0 .noteText,#mermaid-svg-Q0Cv61uzu3GVxhM0 .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-Q0Cv61uzu3GVxhM0 .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-Q0Cv61uzu3GVxhM0 .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-Q0Cv61uzu3GVxhM0 .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-Q0Cv61uzu3GVxhM0 .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Q0Cv61uzu3GVxhM0 .section{stroke:none;opacity:0.2}#mermaid-svg-Q0Cv61uzu3GVxhM0 .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-Q0Cv61uzu3GVxhM0 .section2{fill:#fff400}#mermaid-svg-Q0Cv61uzu3GVxhM0 .section1,#mermaid-svg-Q0Cv61uzu3GVxhM0 .section3{fill:#fff;opacity:0.2}#mermaid-svg-Q0Cv61uzu3GVxhM0 .sectionTitle0{fill:#333}#mermaid-svg-Q0Cv61uzu3GVxhM0 .sectionTitle1{fill:#333}#mermaid-svg-Q0Cv61uzu3GVxhM0 .sectionTitle2{fill:#333}#mermaid-svg-Q0Cv61uzu3GVxhM0 .sectionTitle3{fill:#333}#mermaid-svg-Q0Cv61uzu3GVxhM0 .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Q0Cv61uzu3GVxhM0 .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-Q0Cv61uzu3GVxhM0 .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Q0Cv61uzu3GVxhM0 .grid path{stroke-width:0}#mermaid-svg-Q0Cv61uzu3GVxhM0 .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-Q0Cv61uzu3GVxhM0 .task{stroke-width:2}#mermaid-svg-Q0Cv61uzu3GVxhM0 .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Q0Cv61uzu3GVxhM0 .taskText:not([font-size]){font-size:11px}#mermaid-svg-Q0Cv61uzu3GVxhM0 .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Q0Cv61uzu3GVxhM0 .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-Q0Cv61uzu3GVxhM0 .task.clickable{cursor:pointer}#mermaid-svg-Q0Cv61uzu3GVxhM0 .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-Q0Cv61uzu3GVxhM0 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-Q0Cv61uzu3GVxhM0 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-Q0Cv61uzu3GVxhM0 .taskText0,#mermaid-svg-Q0Cv61uzu3GVxhM0 .taskText1,#mermaid-svg-Q0Cv61uzu3GVxhM0 .taskText2,#mermaid-svg-Q0Cv61uzu3GVxhM0 .taskText3{fill:#fff}#mermaid-svg-Q0Cv61uzu3GVxhM0 .task0,#mermaid-svg-Q0Cv61uzu3GVxhM0 .task1,#mermaid-svg-Q0Cv61uzu3GVxhM0 .task2,#mermaid-svg-Q0Cv61uzu3GVxhM0 .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-Q0Cv61uzu3GVxhM0 .taskTextOutside0,#mermaid-svg-Q0Cv61uzu3GVxhM0 .taskTextOutside2{fill:#000}#mermaid-svg-Q0Cv61uzu3GVxhM0 .taskTextOutside1,#mermaid-svg-Q0Cv61uzu3GVxhM0 .taskTextOutside3{fill:#000}#mermaid-svg-Q0Cv61uzu3GVxhM0 .active0,#mermaid-svg-Q0Cv61uzu3GVxhM0 .active1,#mermaid-svg-Q0Cv61uzu3GVxhM0 .active2,#mermaid-svg-Q0Cv61uzu3GVxhM0 .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-Q0Cv61uzu3GVxhM0 .activeText0,#mermaid-svg-Q0Cv61uzu3GVxhM0 .activeText1,#mermaid-svg-Q0Cv61uzu3GVxhM0 .activeText2,#mermaid-svg-Q0Cv61uzu3GVxhM0 .activeText3{fill:#000 !important}#mermaid-svg-Q0Cv61uzu3GVxhM0 .done0,#mermaid-svg-Q0Cv61uzu3GVxhM0 .done1,#mermaid-svg-Q0Cv61uzu3GVxhM0 .done2,#mermaid-svg-Q0Cv61uzu3GVxhM0 .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-Q0Cv61uzu3GVxhM0 .doneText0,#mermaid-svg-Q0Cv61uzu3GVxhM0 .doneText1,#mermaid-svg-Q0Cv61uzu3GVxhM0 .doneText2,#mermaid-svg-Q0Cv61uzu3GVxhM0 .doneText3{fill:#000 !important}#mermaid-svg-Q0Cv61uzu3GVxhM0 .crit0,#mermaid-svg-Q0Cv61uzu3GVxhM0 .crit1,#mermaid-svg-Q0Cv61uzu3GVxhM0 .crit2,#mermaid-svg-Q0Cv61uzu3GVxhM0 .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-Q0Cv61uzu3GVxhM0 .activeCrit0,#mermaid-svg-Q0Cv61uzu3GVxhM0 .activeCrit1,#mermaid-svg-Q0Cv61uzu3GVxhM0 .activeCrit2,#mermaid-svg-Q0Cv61uzu3GVxhM0 .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-Q0Cv61uzu3GVxhM0 .doneCrit0,#mermaid-svg-Q0Cv61uzu3GVxhM0 .doneCrit1,#mermaid-svg-Q0Cv61uzu3GVxhM0 .doneCrit2,#mermaid-svg-Q0Cv61uzu3GVxhM0 .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-Q0Cv61uzu3GVxhM0 .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-Q0Cv61uzu3GVxhM0 .milestoneText{font-style:italic}#mermaid-svg-Q0Cv61uzu3GVxhM0 .doneCritText0,#mermaid-svg-Q0Cv61uzu3GVxhM0 .doneCritText1,#mermaid-svg-Q0Cv61uzu3GVxhM0 .doneCritText2,#mermaid-svg-Q0Cv61uzu3GVxhM0 .doneCritText3{fill:#000 !important}#mermaid-svg-Q0Cv61uzu3GVxhM0 .activeCritText0,#mermaid-svg-Q0Cv61uzu3GVxhM0 .activeCritText1,#mermaid-svg-Q0Cv61uzu3GVxhM0 .activeCritText2,#mermaid-svg-Q0Cv61uzu3GVxhM0 .activeCritText3{fill:#000 !important}#mermaid-svg-Q0Cv61uzu3GVxhM0 .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Q0Cv61uzu3GVxhM0 g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-Q0Cv61uzu3GVxhM0 g.classGroup text .title{font-weight:bolder}#mermaid-svg-Q0Cv61uzu3GVxhM0 g.clickable{cursor:pointer}#mermaid-svg-Q0Cv61uzu3GVxhM0 g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-Q0Cv61uzu3GVxhM0 g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-Q0Cv61uzu3GVxhM0 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-Q0Cv61uzu3GVxhM0 .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-Q0Cv61uzu3GVxhM0 .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-Q0Cv61uzu3GVxhM0 .dashed-line{stroke-dasharray:3}#mermaid-svg-Q0Cv61uzu3GVxhM0 #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Q0Cv61uzu3GVxhM0 #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Q0Cv61uzu3GVxhM0 #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-Q0Cv61uzu3GVxhM0 #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-Q0Cv61uzu3GVxhM0 #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Q0Cv61uzu3GVxhM0 #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Q0Cv61uzu3GVxhM0 #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Q0Cv61uzu3GVxhM0 #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Q0Cv61uzu3GVxhM0 .commit-id,#mermaid-svg-Q0Cv61uzu3GVxhM0 .commit-msg,#mermaid-svg-Q0Cv61uzu3GVxhM0 .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Q0Cv61uzu3GVxhM0 .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Q0Cv61uzu3GVxhM0 .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Q0Cv61uzu3GVxhM0 g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Q0Cv61uzu3GVxhM0 g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-Q0Cv61uzu3GVxhM0 g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-Q0Cv61uzu3GVxhM0 g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-Q0Cv61uzu3GVxhM0 g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-Q0Cv61uzu3GVxhM0 g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-Q0Cv61uzu3GVxhM0 .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-Q0Cv61uzu3GVxhM0 .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-Q0Cv61uzu3GVxhM0 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-Q0Cv61uzu3GVxhM0 .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-Q0Cv61uzu3GVxhM0 .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-Q0Cv61uzu3GVxhM0 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-Q0Cv61uzu3GVxhM0 .edgeLabel text{fill:#333}#mermaid-svg-Q0Cv61uzu3GVxhM0 .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Q0Cv61uzu3GVxhM0 .node circle.state-start{fill:black;stroke:black}#mermaid-svg-Q0Cv61uzu3GVxhM0 .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-Q0Cv61uzu3GVxhM0 #statediagram-barbEnd{fill:#9370db}#mermaid-svg-Q0Cv61uzu3GVxhM0 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-Q0Cv61uzu3GVxhM0 .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-Q0Cv61uzu3GVxhM0 .statediagram-state .divider{stroke:#9370db}#mermaid-svg-Q0Cv61uzu3GVxhM0 .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-Q0Cv61uzu3GVxhM0 .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-Q0Cv61uzu3GVxhM0 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-Q0Cv61uzu3GVxhM0 .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-Q0Cv61uzu3GVxhM0 .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-Q0Cv61uzu3GVxhM0 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-Q0Cv61uzu3GVxhM0 .note-edge{stroke-dasharray:5}#mermaid-svg-Q0Cv61uzu3GVxhM0 .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-Q0Cv61uzu3GVxhM0 .error-icon{fill:#522}#mermaid-svg-Q0Cv61uzu3GVxhM0 .error-text{fill:#522;stroke:#522}#mermaid-svg-Q0Cv61uzu3GVxhM0 .edge-thickness-normal{stroke-width:2px}#mermaid-svg-Q0Cv61uzu3GVxhM0 .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-Q0Cv61uzu3GVxhM0 .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-Q0Cv61uzu3GVxhM0 .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-Q0Cv61uzu3GVxhM0 .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-Q0Cv61uzu3GVxhM0 .marker{fill:#333}#mermaid-svg-Q0Cv61uzu3GVxhM0 .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-Q0Cv61uzu3GVxhM0 {color: rgba(0, 0, 0, 0.75);font: ;}

整体实现
比特逆序
旋转因子
三大循环

算法原理

X(k)=∑n=0N−1x(n)×e−j2πNknX(k) = \sum_{n=0}^{N-1} x(n)\times e^{-j\frac{2\pi}{N}kn} \\ X(k)=n=0∑N−1​x(n)×e−jN2π​kn
在将信号进行补零,变为偶数序列的时候
0<=k<=N/2X(k)=X1(k)+Wnk×X2(k)0<=k<=N/2 \\ X(k) = X_1(k) + W_n^k\times X_2(k) 0<=k<=N/2X(k)=X1​(k)+Wnk​×X2​(k)
再利用WNkW_N^kWNk​的可约性质,可以得到
0<=k<=N/2X(k+N2)=X1(k)−Wnk×X2(k)0<=k<=N/2 \\ X(k+\frac{N}{2}) = X_1(k) - W_n^k\times X_2(k) 0<=k<=N/2X(k+2N​)=X1​(k)−Wnk​×X2​(k)

一些重要的关系

关于蝶群和蝶形运算

对于图中表的红色方框的就是一个蝶群,可以看到一个蝶群中可能包含有多个蝶形,左边第一个蝶群中就是包含了一个蝶形,而右边包含了两个蝶形。
经过分析可以知道,如果以左边的输入序列为第0级,而最右边为第M级(假设序列的长度为2的M次幂),则可以知道第M级只有一个蝶群,这个蝶群中含有2(m−1)2^(m-1)2(m−1)个蝶形和旋转因子。
经过分析可以看到第i级,有2M−i2^{M-i}2M−i个蝶群,比如以上图为例,第一级有23−1=42^{3-1}=423−1=4个蝶群。

关于旋转因子的分析

我们知道对于每一级分解之后,关于$W_N^k$中的N的值是不断变化的,从最后一级来分析。

N=2MWNk=e−j2π2MnkN = 2^M \\ W_N^k = e^{-j\frac{2\pi}{2^M}nk} N=2MWNk​=e−j2M2π​nk
对于倒数第二级
N=2(M−1)WNk=e−j2π2(M−1)nkN = 2^(M-1) \\ W_N^k = e^{-j\frac{2\pi}{2^(M-1)}nk} N=2(M−1)WNk​=e−j2(M−1)2π​nk

对于第i级
N=2(M−(M−i))WNk=e−j2π2(M(M−i))nk=e−j2π2iN = 2^(M-(M-i)) \\ W_N^k = e^{-j\frac{2\pi}{2^(M(M-i))}nk} \\ = e^{-j\frac{2\pi}{2^i}} N=2(M−(M−i))WNk​=e−j2(M(M−i))2π​nk=e−j2i2π​

于是可以得到一个普遍的规律,对于第i级的旋转因子为
WNk=e−j2π2iW_N^k = e^{-j\frac{2\pi}{2^i}} WNk​=e−j2i2π​

编程主要使用到了三大循环

最外层的循环:级数的循环
中间的循环:旋转因子的个数(也是每一个蝶群中,蝶形的个数)
最内层的循环:一个旋转因子需要给多少个蝶群使用。

void fft(complexNumber* sequence, int order, int length, complexNumber * result)
{
int i, j, k;
copyComplex(sequence, length, result);
//THE FIRST LOOP
for(i=0; i<order; i++)
{int total_factors;complexNumber u = {1, 0};total_factors = pow(2, i);factor = getFactor(i+1);//printf("The %d's level loop\n", i);//THE NUMBER OF DIFFERENT FACTORS = THE LENGTH OF TWO GROUPSfor(j=0; j<total_factors; j++){int total_groups, index;total_groups = pow(2, order-i-1);  //THE NUMBER OF DIFFERENT GROUPSfor(index=0, k=j; index<total_groups;k+=total_factors*2, index++) {//COMPUTER THE DFTresult[k] = complex_add(*(sequence+k) ,complex_mul(u, *(sequence+k+total_factors)));result[k+total_factors] = complex_add(*(sequence+k) , reverse_complex(complex_mul(u, *(sequence+k+total_factors))));}//printf("The value of u is: \n");//showComplex(u);u = complex_mul(u, factor);}copyComplex(result, length, sequence);
}

}

这里仍然有很多需要注意的细节,比如关于逆序的时候,我们需要首先判断需要使用多少位宽的空间来存放数据,然后才能进行逆序,如果直接使用一个固定的位宽来进行逆序,那么除非你将所有的输入的序列继续补零到固定的值,然后再对这个整体的数据进行逆序,否则就是错误的,但是如果补零到固定的个数,那么就对造成浪费,而且fft的点数也就确定了。
**还有一个需要注意的点是,相邻两个蝶群的距离是多少,为什么需要这个参数呢?因为只有得到这个参数之后,我们才能知道同一个旋转因子,下一次需要的位置, 2i2^i2i,就是总共旋转因子个数(一个蝶群中蝶形的个数)的二倍。

结果展示

使用matlab的标准结果

源码,在上传的资源中。有任何问题欢迎交流。
源码地址

FFT算法的C语言实现相关推荐

  1. c代码实现 ifft运算_fft算法c语言_matlab fft算法_ifft c语言

    FFT快速算法C程序_工学_高等教育_教育专区.电子信息工程综合课程设计报告书 DSP 课程设计 报告 题学 目: 院: FFT 快速算法 C 程序 计算机与信息工程学院 09 ... fft算法代码 ...

  2. [Matlab科学计算] 频谱分析和FFT算法总结

    频谱分析是一种非常重要的信号处理方法,在机械设备故障诊断.振动系统分析.电力系统.无线电通信.信息图像处理和自动控制等学科中都有重要应用.频谱分析的核心是1965年Cooely-Tukey发表的快速傅 ...

  3. dsp实现快速傅里叶的C语言程序,DSP-快速傅立叶变换(FFT)算法实验

    <DSP-快速傅立叶变换(FFT)算法实验>由会员分享,可在线阅读,更多相关<DSP-快速傅立叶变换(FFT)算法实验(10页珍藏版)>请在人人文库网上搜索. 1.中 南 大 ...

  4. czt算法c语言实现,基--2按频率抽取的FFT算法Decimation-in-Frequency(DIF).ppt

    基--2按频率抽取的FFT算法Decimation-in-Frequency(DIF) 第四节基--2按频率抽取的FFT算法Decimation-in-Frequency(DIF)(Sander-Tu ...

  5. c代码实现 ifft运算_C语言系列之FFT算法实现

    0x10 序言 长文预警,详细介绍FFT算法的编程原理和C实现,并在文章的最后附上了本文的所有源代码. 0x11 速览 1)FFT背后的数学原理 2)码位倒序 3)蝶形运算设计 4)利用复数FFT编写 ...

  6. FFT算法的完整DSP实现

    傅里叶变换或者FFT的理论参考: [1] http://www.dspguide.com/ch12/2.htm The Scientist and Engineer's Guide to Digita ...

  7. FFT算法的完整DSP实现(转)

    源:FFT算法的完整DSP实现 傅里叶变换或者FFT的理论参考: [1] http://www.dspguide.com/ch12/2.htm The Scientist and Engineer's ...

  8. FFT快速傅里叶变换C语言实现信号处理 对振动信号进行实现时域到频域的转换

    FFT快速傅里叶变换C语言实现信号处理 对振动信号进行实现时域到频域的转换,可实现FFT8192个点或改成其他FFT1024.4096等等,可以直接运行,运行结果与matlab运行的一致,写好了注释, ...

  9. 深入浅出理解FFT算法。通俗易懂,xilinxIP核仿真

    深入浅出理解FFT算法,通俗易懂,用xilinxIP核心仿真 1.前言:傅里叶变换:时域到频域的转换 FS连续时间周期傅里叶级数->DFS离散傅里叶级数->FT连续时间非周期信号的傅里叶变 ...

  10. 离散傅里叶变换及matlab实现(按时间抽选(DIT)的基-2 FFT算法(库利-图基算法))

    转,傅里叶变换,很好的解释 很好的文章,可惜水平太差,还没有完全理解. 快速傅里叶的matlab实现 按时间抽选(DIT)的基-2 FFT算法(库利-图基算法) 傅里叶要用到的nn个复数,不是随机找的 ...

最新文章

  1. Windows 10 周年更新后TPM的一个bug?
  2. mysql 用drop和delete方法删除用户的区别
  3. android 按键kl文件,Android添加新按键
  4. 基于高德地图Windows Phone API 快速开发地图相关APP(二)
  5. jquery对输入框内容的数字校验
  6. [转] Firefox 24.0中的插件激活提示
  7. 计算机网络计算机应用答案,计算机网络与应用(含答案).doc
  8. Django10:Ajax介绍/发送数据/SweetAlert
  9. 树莓派+Kubernetes
  10. centos os u盘启动盘_UltraISO制作u盘centos启动盘教程
  11. 高通源代码 Ubuntu14.04下载编译Android(1)
  12. 手把手教你构建 C 语言编译器(0)- 前言
  13. 怎么看mmdetection版本_mmdetection使用指南
  14. matlab位移反分析公式,位移反分析.doc
  15. python用双重循环输出菱形_Python 使用双重循环打印图形菱形操作
  16. Window系统安装FFmpeg
  17. 百度之星2019决赛摸鱼记
  18. 第三空间与第四空间的幻想(序言篇)
  19. Redis-常用数据结构
  20. 关于Java中的除以零的研究

热门文章

  1. 蔡学镛 java,Java该何去何从思考
  2. ArcCatalog中通过ArcSDE向Oracle数据库中导入数据
  3. 约束优化内罚函数c语言程序,约束优化惩罚函数法.pdf
  4. 嵌入式系统、嵌入式设计软件概述
  5. Ubuntu 设置 IP 地址和 hostname
  6. 《物联网开发实战》05 系统实例:怎样设计一个简易物联网系统?(学习笔记)
  7. JS 阻止浮层弹窗下滚动
  8. springboot+责任链模式初体验
  9. 二三、A转置乘以A可逆
  10. js 简单的鼠标指针小图标