複數基2 DIT FFT程式

2021-05-05 21:40:26 字數 3276 閱讀 4037

好象不斷有人問關於fft的問題,我也發乙個以前寫的fft程式吧。先發乙個複數運算的,過幾天再發乙個定點的。我自己覺得這個程式的可讀性還是比較好的,如果你能理解蝶形運算,你就應該能理解這個程式。我的程式沒有用通用的stl複數類,而用了我以前自己寫的乙個複數運算類,只是做了一些stl化,大學裡的老師應該不會罵我了吧:)。我的這個複數類也有其優點,可以支援直角座標和極座標的互動運算。比如說,假設第乙個數c1是極座標(1, pi/2),第二個數c2是笛卡爾座標(3, 4i),你可以不用考慮轉換問題直接運算c1(+,-,*,/)c2,運算結果的座標型別由第乙個運算元決定。

好了,看程式吧。 需要指出的是,為了方便,我把複數類的定義和實現寫在乙個檔案裡了。

// file: my_complex.h

#ifndef _my_complex_h_

#define _my_complex_h_

#include

#include

#include

static const double pi = 3.1415926536;

static const double epsilon=1e-8;

class complex

;//no explicit here, otherwise you cannot use codes like complex x=32; etc.

complex(double r) : real(r), img(0.0), is_polar(false) ;

complex(double r, double i, bool polar=false) : real(r), img(i), is_polar(polar)

;inline const double get_real() const;

inline const double get_img() const;

inline const double get_rho() const;

inline const double get_theta() const;

inline const bool ispolar() const ;

void to_polar(void);

void to_ri(void);

void conj(void) ;

const complex& operator = (double a);

const complex& operator = (const complex& a);

const bool operator == (const complex& a) const;

const complex operator -() const;

const complex operator +(const complex& a) const;

const complex operator -(const complex& a) const;

const complex operator *(double a) const;

const complex operator *(const complex& a) const;

const complex operator /(double a) const;

const complex operator /(const complex& a) const;

friend std::ostream& operator <<(std::ostream& os, const complex& a);

friend const complex conj(const complex& a);

};void complex::check_zero(void)

void complex::to_polar(void)

}void complex::to_ri(void)

}const double complex::get_real() const

const double complex::get_img() const

const double complex::get_rho() const

const double complex::get_theta() const

inline const complex& complex::operator = (double a)

inline const complex& complex::operator = (const complex& a)

inline const bool complex::operator == (const complex& a) const

inline const complex complex::operator -() const

const complex complex::operator +(const complex& a) const

const complex complex::operator -(const complex& a) const

const complex complex::operator *(double a) const

const complex complex::operator *(const complex& a) const

const complex complex::operator /(double a) const

const complex complex::operator /(const complex& a) const

std::ostream& operator <<(std::ostream& os, const complex& a)

#endif

// file: fft_dit_base2.cpp

#include "my_complex.h"

using namespace std;

static const int n=32;

static complex fft_coeff[n];

static complex ifft_coeff[n];

void setup_table(void)

while(ifor(int m=n>>1; !((r^=m)&m); m>>=1);

if(r>i)

++i;

}#undef swp

}void fft_dit(complex data, bool ifft=false)

++first;

++second;

coeff_idx += groups;}}

groups /= 2;

step *= 2;}}

int main()

複數前置知識2 複數乘法的幾何意義

本文為數學 虛數乘法竟能表示旋轉?教你暴力破解初中壓軸題!的學習筆記,侵刪。2021.2.9 由於latex轉markdown的效果很差,故改為上傳 2021.2.9 2.9更新 複數乘法幾何意義三角法推導 2.13更新 複數乘法幾何意義矩陣法推導 先更後改 參考教材 復變函式 史濟懷 劉太順 中國...

子集 2 (含重複數字)

給定乙個可能包含重複元素的整數陣列nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集。輸入 1,2,2 輸出 2 1 1,2,2 2,2 1,2 這個題目的解題思想是這樣的。由於nums內的元素存在重複,那麼我們必然需要 考慮如果元素重複了,怎麼去處理這個元素。最直觀的想法是說比...

PowerBI 學習筆記(2) 構建基塊

power bi 的構建基塊 即使是看似複雜的事物也是由基本構建基塊構建而來 建築物通過木材 鋼 混凝土和玻璃建造。車輛由從金屬 織物和橡膠製成。當然,建築物和車輛也可有基本或複雜之分 具體取決於這些基本構造基塊的排列方式。在 power bi 中執行的所有操作可以分解為幾個基本構建基塊 power...