資源簡介
給出了完整的FFT的C語言代碼,以及MATLAB的仿真效果,主要解決了FFT計算頻譜圖的問題。注意大部分周期信號的最小非零頻率分量就是基波,但是還有很多信號并不是這樣:比如y=sin(2πx) +sin(3πx)的信號周期為2,對應的基波角頻率為π,而頻譜圖中角頻率為π的那個點的幅度為0。

代碼片段和文件信息
#include?“fft.h“
inline?void?swap?(float?&a?float?&b)
{
????float?t;
????t?=?a;
????a?=?b;
????b?=?t;
}
void?bitrp?(float?xreal?[]?float?ximag?[]?int?n)
{
????//?位反轉置換?Bit-reversal?Permutation
????int?i?j?a?b?p;
????for?(i?=?1?p?=?0;?i?????????{
????????p?++;
????????}
????for?(i?=?0;?i?????????{
????????a?=?i;
????????b?=?0;
????????for?(j?=?0;?j?????????????{
????????????b?=?(b?<1)?+?(a?&?1);????//?b?=?b?*?2?+?a?%?2;
????????????a?>>=?1;????????//?a?=?a?/?2;
????????????}
????????if?(?b?>?i)
????????????{
????????????swap?(xreal?[i]?xreal?[b]);
????????????swap?(ximag?[i]?ximag?[b]);
????????????}
????????}
}
void?FFT(float?xreal?[]?float?ximag?[]?int?n)
{
????//?快速傅立葉變換,將復數?x?變換后仍保存在?x?中,xreal?ximag?分別是?x?的實部和虛部
????float?wreal?[N?/?2]?wimag?[N?/?2]?treal?timag?ureal?uimag?arg;
????int?m?k?j?t?index1?index2;
????bitrp?(xreal?ximag?n);
????//?計算?1?的前?n?/?2?個?n?次方根的共軛復數?W‘j?=?wreal?[j]?+?i?*?wimag?[j]??j?=?0?1?...??n?/?2?-?1
????arg?=?-?2?*?PI?/?n;
????treal?=?cos?(arg);
????timag?=?sin?(arg);
????wreal?[0]?=?1.0;
????wimag?[0]?=?0.0;
????for?(j?=?1;?j?????????{
????????wreal?[j]?=?wreal?[j?-?1]?*?treal?-?wimag?[j?-?1]?*?timag;
????????wimag?[j]?=?wreal?[j?-?1]?*?timag?+?wimag?[j?-?1]?*?treal;
????????}
????for?(m?=?2;?m?<=?n;?m?*=?2)
????????{
????????for?(k?=?0;?k?????????????{
????????????for?(j?=?0;?j?????????????????{
????????????????index1?=?k?+?j;
????????????????index2?=?index1?+?m?/?2;
????????????????t?=?n?*?j?/?m;????//?旋轉因子?w?的實部在?wreal?[]?中的下標為?t
????????????????treal?=?wreal?[t]?*?xreal?[index2]?-?wimag?[t]?*?ximag?[index2];
????????????????timag?=?wreal?[t]?*?ximag?[index2]?+?wimag?[t]?*?xreal?[index2];
????????????????ureal?=?xreal?[index1];
????????????????uimag?=?ximag?[index1];
????????????????xreal?[index1]?=?ureal?+?treal;
????????????????ximag?[index1]?=?uimag?+?timag;
????????????????xreal?[index2]?=?ureal?-?treal;
????????????????ximag?[index2]?=?uimag?-?timag;
????????????????}
????????????}
????????}
}
void??IFFT?(float?xreal?[]?float?ximag?[]?int?n)
{
????//?快速傅立葉逆變換
????float?wreal?[N?/?2]?wimag?[N?/?2]?treal?timag?ureal?uimag?arg;
????int?m?k?j?t?index1?index2;
????bitrp?(xreal?ximag?n);
????//?計算?1?的前?n?/?2?個?n?次方根?Wj?=?wreal?[j]?+?i?*?wimag?[j]??j?=?0?1?...??n?/?2?-?1
????arg?=?2?*?PI?/?n;
????treal?=?cos?(arg);
????timag?=?sin?(arg);
????wreal?[0]?=?1.0;
????wimag?[0]?=?0.0;
????for?(j?=?1;?j?????????{
????????wreal?[j]?=?wreal?[j?-?1]?*?treal?-?wimag?[j?-?1]?*?timag;
????????wimag?[j]?=?wreal?[j?-?1]?*?timag?+?wimag?[j?-?1]?*?treal;
????????}
????for?(m?=?2;?m?<=?n;?m?*=?2)
????????{
????????for?(k?=?0;?k?????????????{
????????????for?(j?=?0;?j?????????????????{
????????????????index1?=?k?+?j;
????????????????index2?=?index1?+?m?/?2;
????????????????t?=?n?*?j?/?m;????//?旋轉因子?w?的實部在?wreal?[]?中的下標為?t
????????????????treal?=?wreal?[t]?*
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????739??2018-07-21?16:28??FFT計算頻譜圖\C語言實現\Debug\.qmake.stash
?????文件??????90994??2018-08-20?23:41??FFT計算頻譜圖\C語言實現\Debug\debug\FFT.exe
?????文件??????25926??2018-08-20?23:41??FFT計算頻譜圖\C語言實現\Debug\debug\fft.o
?????文件??????17165??2018-08-20?23:41??FFT計算頻譜圖\C語言實現\Debug\debug\main.o
?????文件??????50744??2018-07-21?19:13??FFT計算頻譜圖\C語言實現\Debug\FFT
?????文件??????46808??2018-07-21?19:13??FFT計算頻譜圖\C語言實現\Debug\fft.o
?????文件???????7164??2018-07-21?18:53??FFT計算頻譜圖\C語言實現\Debug\input.txt
?????文件??????38043??2018-07-21?16:47??FFT計算頻譜圖\C語言實現\Debug\input1.txt
?????文件????????111??2018-07-21?16:34??FFT計算頻譜圖\C語言實現\Debug\input11.txt
?????文件??????32728??2018-07-21?19:09??FFT計算頻譜圖\C語言實現\Debug\main.o
?????文件??????26586??2018-08-20?22:54??FFT計算頻譜圖\C語言實現\Debug\Makefile
?????文件??????14483??2018-08-20?22:54??FFT計算頻譜圖\C語言實現\Debug\Makefile.Debug
?????文件??????14522??2018-08-20?22:54??FFT計算頻譜圖\C語言實現\Debug\Makefile.Release
?????文件?????147558??2018-07-21?18:59??FFT計算頻譜圖\C語言實現\Debug\output.txt
?????文件???????6442??2018-08-21?00:53??FFT計算頻譜圖\C語言實現\fft.cpp
?????文件????????662??2018-08-21?00:53??FFT計算頻譜圖\C語言實現\fft.h
?????文件????????142??2018-07-21?16:24??FFT計算頻譜圖\C語言實現\FFT.pro
?????文件??????23607??2018-08-21?00:21??FFT計算頻譜圖\C語言實現\FFT.pro.user
?????文件??????23662??2018-07-21?16:23??FFT計算頻譜圖\C語言實現\FFT.pro.user.6ed20e1
?????文件?????????92??2018-08-20?22:57??FFT計算頻譜圖\C語言實現\main.cpp
?????文件???????1164??2018-07-21?16:46??FFT計算頻譜圖\matlab驗證試驗\FFT.m
?????文件????????261??2018-07-21?18:43??FFT計算頻譜圖\readme.txt
?????文件?????347069??2018-07-21?19:13??FFT計算頻譜圖\實驗結果\2018-07-21?19-13-22屏幕截圖.png
?????文件?????363558??2018-07-21?19:14??FFT計算頻譜圖\實驗結果\2018-07-21?19-14-07屏幕截圖.png
????..A.SH.???????162??2018-08-20?22:47??FFT計算頻譜圖\實驗結果\~$試驗結果記錄.docx
?????文件?????792980??2018-07-21?19:25??FFT計算頻譜圖\實驗結果\試驗結果記錄.docx
?????目錄??????????0??2018-08-21?00:45??FFT計算頻譜圖\C語言實現\Debug\debug
?????目錄??????????0??2018-08-20?22:54??FFT計算頻譜圖\C語言實現\Debug\release
?????目錄??????????0??2018-08-21?00:45??FFT計算頻譜圖\C語言實現\Debug
?????目錄??????????0??2018-08-21?00:45??FFT計算頻譜圖\C語言實現
............此處省略6個文件信息
- 上一篇:MFC畫時鐘自適應大小
- 下一篇:C++ 拼音輸入法
評論
共有 條評論