【正文】
圖3 整個蝶形運算流程圖送入x(n),MN=2^M倒序L=1:MB=2^(L1)J=0:B1P=J*2^(ML) K=J:2^L:N1T=A(K)+A(K+B)*WN^PA(K+B)=A(K)A(K+B)*WN^PA(K)=T輸出開始 結(jié)束束束為了保證運算輸出的X(k)按順序排列,要求序列x(n)倒序輸入,即在運算前要先對輸入的序列進行位序顛倒。首先讀入數(shù)據(jù),根據(jù)數(shù)據(jù)長度確定運算級數(shù)M,運算總點數(shù),不足補0處理。1. 原位計算對點的FFT共進行M級運算,每級由N/2個蝶形運算組成。按時間抽取基2FFT算法的基本思路是將N點序列按時間下標的奇偶分為兩個N/2點序列,計算這兩個N/2點序列的N/2點DFT,計算量可減小約一半;每一個N/2點序列按照同樣的劃分原則,可以劃分為兩個N/4點序列,最后,將原序列劃分為多個2點序列,將計算量大大降低。采集到語音信號之后,需要對語音信號進行分析,如語音信號的時域分析、頻譜分析、譜圖分析。s39。用GUI界面完成人機交互方便使用的。數(shù)字信號處理是MATLAB重要應用的領(lǐng)域之一。附加的工具箱(單獨提供的專用 MATLAB 函數(shù)集)擴展了 MATLAB 環(huán)境,以解決這些應用領(lǐng)域內(nèi)特定類型的問題?;诒緦W期所學的DITFFT的運算規(guī)律和編程思想以及Matlab的學習和使用,本課設要求在Matlab環(huán)境下編寫基2 DITFFT算法實現(xiàn)對離散信號的快速傅里葉變換,再與Matlab軟件自帶的FFT函數(shù)實現(xiàn)對離散信號的傅里葉變換進行比較,如果得到的頻譜相同,那么我們編寫的程序就是正確的。在MATLAB中,fn=input(39。sound(x,fs,nb)。利用這兩個途徑實現(xiàn)DFT的快速傅里葉變換(FFT),F(xiàn)FT算法基本上可分為按時間抽取的FFT算法(DITFFT)和按頻率抽取的FFT算法(DIFFFT)。M級運算共需要復數(shù)乘法次數(shù)為C=N/2*M,復數(shù)加法次數(shù)為C=N*M。第L級共有個不同指數(shù)的旋轉(zhuǎn)因子,用R表示這些不同指數(shù)旋轉(zhuǎn)因子從上到下的順序(R=0,1,…,B1)??紤]到蝶形運算有兩個輸出,且都要用到本級的兩個輸入數(shù)據(jù),故第一個輸出計算完畢后,輸出數(shù)據(jù)不能立即存入輸入地址,要等到第二個輸出計算調(diào)用輸入數(shù)據(jù)完畢后才能覆蓋。JB是IB的位倒置結(jié)果,十進制順序數(shù)I增加1,相當于IB最低位加1且逢2向高位進1,即相當于JB最高位加1且逢2向低位進1。例如,N=8時,序列倒序結(jié)果如表1所示。需要注意的是自由輸入的語音信號不同,其長度也不同,所以根據(jù)要輸入的語音信號輸入N1,N2的值。三個靜態(tài)文本(static text)用來提示我們需要人為輸入的內(nèi)容。第四步,運行GUI。程序運行調(diào)試時,自己選擇輸入要采樣的語音信號,采樣頻率以及要變換的范圍,可以實現(xiàn)對不同信號的信號采樣和進行不同點的FFT運算。程序運行調(diào)試初期,曾經(jīng)多次出現(xiàn)錯誤、不能產(chǎn)生圖形等問題,但在我翻閱資料認真改正及老師同學的幫助下基本功能還是完成了,經(jīng)過1個星期的上機實習,程序已得到一些完善,能完成基本的要求的功能。 %語音信號采樣頻率為fsN1=input(39。,39。x1=x39。幅值39。%條件判斷及數(shù)據(jù)交換 T=x1(I+1)。end %x1。 % 蝶形運算的乘積項 y(kp)=y(k)t。)。K39。編寫的FFT程序?qū)崿F(xiàn)的的x1的頻譜39。,39。, gui_Singleton, ... 39。, [])。% UIWAIT makes gaoli208 wait for user response (see UIRESUME)% uiwait()。amp。white39。 isequal(get(hObject,39。)。BackgroundColor39。end% Executes on button press in begin.function begin_Callback(hObject, eventdata, handles)% hObject handle to begin (see GCBO)% eventdata reserved to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)N1=str2double(get(,39。))。x1=x39。ylabel(39。%按序交換數(shù)據(jù)和算倒序數(shù) if IJ。 end J=J+K。 % 蝶形運算的兩個因子對應單元下標的關(guān)系 t=y(kp)*WNp。)xlabel(39。Matlab自帶的FFT函數(shù)實現(xiàn)的x1的頻譜39。plot(abs(y))。)。 isequal(get(hObject,39。)。), get(0,39。% Executes on selection change in ringin.function ringin_Callback(hObject, eventdata, handles)% hObject handle to ringin (see GCBO)% eventdata reserved to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% Hints: contents = get(hObject,39。編寫的FFT程序?qū)崿F(xiàn)的的x1的頻譜39。K39。)。 % 蝶形運算, 注意必須先進行減法運算,然后進行加法運算,否則要使用中間變量來傳遞y(k) y(k)=y(k)+t。 y=x1。x1(I+1)=x1(J+1)。)。axes()。D:\Matlab\work\39。))。defaultUicontrolBackgroundColor39。String39。), get(0,39。endfunction N2_Callback(hObject, eventdata, handles)% hObject handle to N2 (see GCBO)% eventdata reserved to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% Hints: get(hObject,39。BackgroundColor39。% hObject handle to figure% eventdata reserved to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% Get default mand line output from handles structurevarargout{1} = 。amp。, gaoli208_OpeningF, ... 39。,...) creates a new GAOLI208 or raises the% existing singleton*. Starting from the left, property value pairs are% applied to the GUI before gaoli208_OpeningFunction gets called. An% unrecognized property name or invalid value makes property application% stop. All inputs are passed to gaoli208_OpeningF via varargin.%% *See GUI Options on GUIDE39。K39。ylabel(39。幅度39。 % 蝶形運算