频域和时域FFT及IFFT算法C++程序.docx

上传人:b****5 文档编号:6203917 上传时间:2023-01-04 格式:DOCX 页数:44 大小:43.39KB
下载 相关 举报
频域和时域FFT及IFFT算法C++程序.docx_第1页
第1页 / 共44页
频域和时域FFT及IFFT算法C++程序.docx_第2页
第2页 / 共44页
频域和时域FFT及IFFT算法C++程序.docx_第3页
第3页 / 共44页
频域和时域FFT及IFFT算法C++程序.docx_第4页
第4页 / 共44页
频域和时域FFT及IFFT算法C++程序.docx_第5页
第5页 / 共44页
点击查看更多>>
下载资源
资源描述

频域和时域FFT及IFFT算法C++程序.docx

《频域和时域FFT及IFFT算法C++程序.docx》由会员分享,可在线阅读,更多相关《频域和时域FFT及IFFT算法C++程序.docx(44页珍藏版)》请在冰豆网上搜索。

频域和时域FFT及IFFT算法C++程序.docx

频域和时域FFT及IFFT算法C++程序

1.一维DFT的基2FFT算法VisualC++程序

设原始信号

由一个模拟频率为3265Hz的正弦信号,以8000Hz的频率采样获得

(1)频域抽取的FFT和IFFT算法

#include

#include

#include

#definepi3.14159265

#defineN64

typedefstd:

:

complexcomplex;

/*----频域抽取的FFT算法----*/

voidfft(complexf[])

{

inti,j,k,m,n,l,r,M;

intla,lb,lc;

complext;

/*----计算分解的级数M=log2(N)----*/

for(i=N,M=1;(i=i/2)!

=1;M++);

/*----FFT算法----*/

for(m=1;m<=M;m++)

{

la=pow(2,M+1-m);//la=2^m代表第m级每个分组所含节点数

lb=la/2;//lb代表第m级每个分组所含碟形单元数

//同时它也表示每个碟形单元上下节点之间的距离

/*----碟形运算----*/

for(l=1;l<=lb;l++)

{

r=(l-1)*pow(2,m-1);

for(n=l-1;n

{

lc=n+lb;//n,lc分别代表一个碟形单元的上、下节点编号

t=f[n]+f[lc];

f[lc]=(f[n]-f[lc])*complex(cos(2*pi*r/N),-sin(2*pi*r/N));

f[n]=t;

}

}

}

/*----按照倒位序重新排列变换后信号----*/

for(i=1,j=N/2;i<=N-2;i++)

{

if(i

{

t=f[j];

f[j]=f[i];

f[i]=t;

}

k=N/2;

while(k<=j)

{

j=j-k;

k=k/2;

}

j=j+k;

}

}

/*----频域抽取的IFFT算法----*/

voidifft(complexf[])

{

inti,j,k,m,n,l,r,M;

intla,lb,lc;

complext;

/*----计算分解的级数M=log2(N)----*/

for(i=N,M=1;(i=i/2)!

=1;M++);

/*----按照倒位序重新排列原信号----*/

for(i=1,j=N/2;i<=N-2;i++)

{

if(i

{

t=f[j];

f[j]=f[i];

f[i]=t;

}

k=N/2;

while(k<=j)

{

j=j-k;

k=k/2;

}

j=j+k;

}

/*----将信号乘以1/N----*/

for(i=0;i

/*----IFFT算法----*/

for(m=1;m<=M;m++)

{

la=pow(2,m);//la=2^m代表第m级每个分组所含节点数

lb=la/2;//lb代表第m级每个分组所含碟形单元数

//同时它也表示每个碟形单元上下节点之间的距离

/*----碟形运算----*/

for(l=1;l<=lb;l++)

{

r=(l-1)*pow(2,M-m);

for(n=l-1;n

{

lc=n+lb;//n,lc分别代表一个碟形单元的上、下节点编号

t=f[lc]*complex(cos(2*pi*r/N),sin(2*pi*r/N));

f[lc]=f[n]-t;

f[n]=f[n]+t;

}

}

}

}

/*----显示信号数据----*/

voiddisplay(complexf[])

{

inti;

for(i=0;i

{

cout.width(9);

cout.setf(ios:

:

fixed);

cout.precision(4);

cout<

cout.flags(ios:

:

showpos);

cout.width(9);

cout.setf(ios:

:

fixed);

cout.precision(4);

cout<

cout.unsetf(ios:

:

showpos);

if((i+1)%3==0)cout<

}

}

/*----主函数----*/

voidmain()

{

inti;

complexf[N];

for(i=0;i

f[i]=complex(0.8*sin(2*pi*3265*i/8000),0.0);

cout<

"<

display(f);

fft(f);

cout<

"<

display(f);

ifft(f);

cout<

"<

display(f);

}

运行结果为:

原信号:

0.0000+0.0000i0.4366+0.0000i-0.7317+0.0000i

0.7897+0.0000i-0.5917+0.0000i0.2020+0.0000i

0.2532+0.0000i-0.6263+0.0000i0.7964+0.0000i

-0.7085+0.0000i0.3909+0.0000i0.0534+0.0000i

-0.4803+0.0000i0.7516+0.0000i-0.7793+0.0000i

0.5545+0.0000i-0.1499+0.0000i-0.3032+0.0000i

0.6581+0.0000i-0.7997+0.0000i0.6821+0.0000i

-0.3435+0.0000i-0.1065+0.0000i0.5219+0.0000i

-0.7682+0.0000i0.7656+0.0000i-0.5148+0.0000i

0.0971+0.0000i0.3520+0.0000i-0.6870+0.0000i

0.7994+0.0000i-0.6527+0.0000i0.2945+0.0000i

0.1592+0.0000i-0.5612+0.0000i0.7814+0.0000i

-0.7484+0.0000i0.4728+0.0000i-0.0440+0.0000i

-0.3991+0.0000i0.7128+0.0000i-0.7955+0.0000i

0.6204+0.0000i-0.2442+0.0000i-0.2111+0.0000i

0.5980+0.0000i-0.7911+0.0000i0.7278+0.0000i

-0.4287+0.0000i-0.0094+0.0000i0.4445+0.0000i

-0.7354+0.0000i0.7881+0.0000i-0.5853+0.0000i

0.1929+0.0000i0.2621+0.0000i-0.6321+0.0000i

0.7973+0.0000i-0.7041+0.0000i0.3826+0.0000i

0.0628+0.0000i-0.4878+0.0000i0.7548+0.0000i

-0.7772+0.0000i

FFT变换后的信号:

-0.2416+0.0000i-0.2415-0.0146i-0.2413-0.0294i

-0.2409-0.0443i-0.2402-0.0595i-0.2394-0.0751i

-0.2384-0.0911i-0.2371-0.1078i-0.2355-0.1253i

-0.2336-0.1438i-0.2314-0.1634i-0.2286-0.1844i

-0.2253-0.2072i-0.2214-0.2322i-0.2165-0.2600i

-0.2106-0.2911i-0.2032-0.3268i-0.1939-0.3683i

-0.1818-0.4177i-0.1658-0.4784i-0.1439-0.5557i

-0.1124-0.6588i-0.0643-0.8062i0.0168-1.0398i

0.1783-1.4797i0.6372-2.6746i8.8462-23.4497i

-1.6196+2.9360i-0.9624+1.2195i-0.7711+0.6680i

-0.6881+0.3740i-0.6501+0.1707i-0.6389+0.0000i

-0.6501-0.1707i-0.6881-0.3740i-0.7711-0.6680i

-0.9624-1.2195i-1.6196-2.9360i8.8462+23.4497i

0.6372+2.6746i0.1783+1.4797i0.0168+1.0398i

-0.0643+0.8062i-0.1124+0.6588i-0.1439+0.5557i

-0.1658+0.4784i-0.1818+0.4177i-0.1939+0.3683i

-0.2032+0.3268i-0.2106+0.2911i-0.2165+0.2600i

-0.2214+0.2322i-0.2253+0.2072i-0.2286+0.1844i

-0.2314+0.1634i-0.2336+0.1438i-0.2355+0.1253i

-0.2371+0.1078i-0.2384+0.0911i-0.2394+0.0751i

-0.2402+0.0595i-0.2409+0.0443i-0.2413+0.0294i

-0.2415+0.0146i

IFFT变换后的信号:

0.0000-0.0000i0.4366+0.0000i-0.7317+0.0000i

0.7897-0.0000i-0.5917-0.0000i0.2020+0.0000i

0.2532-0.0000i-0.6263+0.0000i0.7964-0.0000i

-0.7085+0.0000i0.3909-0.0000i0.0534-0.0000i

-0.4803+0.0000i0.7516-0.0000i-0.7793+0.0000i

0.5545+0.0000i-0.1499+0.0000i-0.3032-0.0000i

0.6581-0.0000i-0.7997+0.0000i0.6821-0.0000i

-0.3435-0.0000i-0.1065-0.0000i0.5219-0.0000i

-0.7682+0.0000i0.7656-0.0000i-0.5148+0.0000i

0.0971+0.0000i0.3520+0.0000i-0.6870+0.0000i

0.7994-0.0000i-0.6527-0.0000i0.2945-0.0000i

0.1592+0.0000i-0.5612+0.0000i0.7814+0.0000i

-0.7484+0.0000i0.4728+0.0000i-0.0440+0.0000i

-0.3991+0.0000i0.7128-0.0000i-0.7955+0.0000i

0.6204-0.0000i-0.2442-0.0000i-0.2111-0.0000i

0.5980-0.0000i-0.7911-0.0000i0.7278-0.0000i

-0.4287+0.0000i-0.0094-0.0000i0.4445-0.0000i

-0.7354+0.0000i0.7881+0.0000i-0.5853-0.0000i

0.1929-0.0000i0.2621-0.0000i-0.6321+0.0000i

0.7973-0.0000i-0.7041+0.0000i0.3826+0.0000i

0.0628-0.0000i-0.4878+0.0000i0.7548+0.0000i

-0.7772-0.0000i

(2)时域抽取的FFT和IFFT算法

#include

#include

#include

#definepi3.14159265

#defineN64

typedefstd:

:

complexcomplex;

/*----时域抽取的FFT算法----*/

voidfft(complexf[])

{

inti,j,k,m,n,l,r,M;

intla,lb,lc;

complext;

/*----计算分解的级数M=log2(N)----*/

for(i=N,M=1;(i=i/2)!

=1;M++);

/*----按照倒位序重新排列原信号----*/

for(i=1,j=N/2;i<=N-2;i++)

{

if(i

{

t=f[j];

f[j]=f[i];

f[i]=t;

}

k=N/2;

while(k<=j)

{

j=j-k;

k=k/2;

}

j=j+k;

}

/*----FFT算法----*/

for(m=1;m<=M;m++)

{

la=pow(2,m);//la=2^m代表第m级每个分组所含节点数

lb=la/2;//lb代表第m级每个分组所含碟形单元数

//同时它也表示每个碟形单元上下节点之间的距离

/*----碟形运算----*/

for(l=1;l<=lb;l++)

{

r=(l-1)*pow(2,M-m);

for(n=l-1;n

{

lc=n+lb;//n,lc分别代表一个碟形单元的上、下节点编号

t=f[lc]*complex(cos(2*pi*r/N),-sin(2*pi*r/N));

f[lc]=f[n]-t;

f[n]=f[n]+t;

}

}

}

}

/*----时域抽取的IFFT算法----*/

voidifft(complexf[])

{

inti,j,k,m,n,l,r,M;

intla,lb,lc;

complext;

/*----计算分解的级数M=log2(N)----*/

for(i=N,M=1;(i=i/2)!

=1;M++);

/*----将信号乘以1/N----*/

for(i=0;i

/*----IFFT算法----*/

for(m=1;m<=M;m++)

{

la=pow(2,M+1-m);//la=2^m代表第m级每个分组所含节点数

lb=la/2;//lb代表第m级每个分组所含碟形单元数

//同时它也表示每个碟形单元上下节点之间的距离

/*----碟形运算----*/

for(l=1;l<=lb;l++)

{

r=(l-1)*pow(2,m-1);

for(n=l-1;n

{

lc=n+lb;//n,lc分别代表一个碟形单元的上、下节点编号

t=f[n]+f[lc];

f[lc]=(f[n]-f[lc])*complex(cos(2*pi*r/N),sin(2*pi*r/N));

f[n]=t;

}

}

}

/*----按照倒位序重新排列变换后信号----*/

for(i=1,j=N/2;i<=N-2;i++)

{

if(i

{

t=f[j];

f[j]=f[i];

f[i]=t;

}

k=N/2;

while(k<=j)

{

j=j-k;

k=k/2;

}

j=j+k;

}

}

/*----显示信号数据----*/

voiddisplay(complexf[])

{

inti;

for(i=0;i

{

cout.width(9);

cout.setf(ios:

:

fixed);

cout.precision(4);

cout<

cout.flags(ios:

:

showpos);

cout.width(9);

cout.setf(ios:

:

fixed);

cout.precision(4);

cout<

cout.unsetf(ios:

:

showpos);

if((i+1)%3==0)cout<

}

}

/*----主函数----*/

voidmain()

{

inti;

complexf[N];

for(i=0;i

f[i]=complex(0.8*sin(2*pi*3265*i/8000),0.0);

cout<

"<

display(f);

fft(f);

cout<

"<

display(f);

ifft(f);

cout<

"<

display(f);

}

运行结果为:

原信号:

0.0000+0.0000i0.4366+0.0000i-0.7317+0.0000i

0.7897+0.0000i-0.5917+0.0000i0.2020+0.0000i

0.2532+0.0000i-0.6263+0.0000i0.7964+0.0000i

-0.7085+0.0000i0.3909+0.0000i0.0534+0.0000i

-0.4803+0.0000i0.7516+0.0000i-0.7793+0.0000i

0.5545+0.0000i-0.1499+0.0000i-0.3032+0.0000i

0.6581+0.0000i-0.7997+0.0000i0.6821+0.0000i

-0.3435+0.0000i-0.1065+0.0000i0.5219+0.0000i

-0.7682+0.0000i0.7656+0.0000i-0.5148+0.0000i

0.0971+0.0000i0.3520+0.0000i-0.6870+0.0000i

0.7994+0.0000i-0.6527+0.0000i0.2945+0.0000i

0.1592+0.0000i-0.5612+0.0000i0.7814+0.0000i

-0.7484+0.0000i0.4728+0.0000i-0.0440+0.0000i

-0.3991+0.0000i0.7128+0.0000i-0.7955+0.0000i

0.6204+0.0000i-0.2442+0.0000i-0.2111+0.0000i

0.5980+0.0000i-0.7911+0.0000i0.7278+0.0000i

-0.4287+0.0000i-0.0094+0.0000i0.4445+0.0000i

-0.7354+0.0000i0.7881+0.0000i-0.5853+0.0000i

0.1929+0.0000i0.2621+0.0000i-0.6321+0.0000i

0.7973+0.0000i-0.7041+0.0000i0.3826+0.0000i

0.0628+0.0000i-0.4878+0.0000i0.7548+0.0000i

-0.7772+0.0000i

FFT变换后的信号:

-0.2416+0.0000i-0.2415-0.0146i-0.2413-0.0294i

-0.2409-0.0443i-0.2402-0.0595i-0.2394-0.0751i

-0.2384-0.0911i-0.2371-0.1078i-0.2355-0.1253i

-0.2336-0.1438i-0.2314-0.1634i-0.2286-0.1844i

-0.2253-0.2072i-0.2214-0.2322i-0.2165-0.2600i

-0.2106-0.2911i-0.2032-0.3268i-0.1939-0.3683i

-0.1818-0.4177i-0.1658-0.4784i-0.1439-0.5557i

-0.1124-0.6588i-0.0643-0.8062i0.0168-1.0398i

0.1783-1.4797i0.6372-2.6746i8.8462-23.4497i

-1.6196+2.9360i-0.9624+1.2195i-0.77

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1