天天看點

FFT補零相關

1.轉自http://www.ilovematlab.cn/viewthread.php?tid=36349&sid=lqshA1

補零後的FFT和補零前的FFT,兩者會有較大的不同,但兩頻譜的包絡還是一緻的。設補零前資料長N,補零後資料長M(補了M-N個零值),則補零前的FFT有N條譜線,分别代表的頻率點是(0,1,...,N-1)*df1,df1=fs/N;補零前的FFT有M條譜線,分别代表的頻率點是(0,1,...,M-1)*df2,df2=fs/M。由于補零前後資料長度不一樣,它們的分辨率(分别為df1,df2)不一樣,在頻域中譜線所代表的頻率也不一樣,是以這兩個頻譜所描述的對象也不相同。這裡舉一個例子,fs=1000HZ,補零前後資料長度N=500和M=800,對應的df1=2,df2=1.25。補零前的頻譜是對應于0,2,4,...,500HZ的頻譜,而補零後的頻譜是對應于0,1.25,2.5,...,500HZ的頻譜,是以兩頻譜中對應頻率不兩同,描述當然不同。

但是當特殊情況:M=(2^n)N時,補零後的頻譜相當于在補零前的頻譜中插入(2^n)-1條譜線。與補零前的頻譜中相重合的譜線,它們的幅值和相位完全一緻。

2.下面這部分僅作為參考,暫時還沒有弄懂是什麼意思。轉自:http://savasxch.spaces.live.com/blog/cns!1767F4CC09016DB!449.entry

fft補零的提高分辨率嗎? 不知你注意到沒有?

評論一篇文章:一篇關于fft補零提高頻率分辨率的讨論

這是一篇值得讨論的問題,作者認為補零fft可以提高頻率分辨率,并給出了試驗結果,可以看出确實提高了對頻率細節的觀察能力,本人可以肯定這個試驗是真實的試驗。但是所有的數字信号教課書上都認為補零fft并不能提高頻率分辨率,是不是有沖突?

1 從分析角度, 設fs為采樣頻率,fft長度為N, 那麼頻率分辨率為fs/N, 如果N增加那麼頻率分辨率增加。這是下面一篇文章的用的論據。

2 從另一角度,設fs為采樣頻率,fft長度為N, 則頻率分辨率為fs/N, 我們引進另一個概念:時間長度DT(duration of time),  可以看出DT = 1/頻率分辨率.     則頻率分辨率=1/DT 。 從這一角度看隻要DT不變,頻率分辨率就不會變。是以盡管補零或插值,都不會提高分辨率。這是所有目前信号處理教科書的觀點,但這些教科書都沒有給出原因,不知道為什麼,我發現這個問題是曾經找過不少教科書,沒有一本給出原因,問老師也答的含糊不清。後來我反複考慮,感覺應該如此解釋,如若有意見,歡迎讨論。

為什麼兩個角度看竟然沖突?同樣一個問題為什麼有不同的解釋

從1 我們看出,增加的值全為零,不是原信号内容,這就造成了特殊性,我們的信号變了不是原來信号了!而是新的補零信号的周期延拓。但是可以證明兩個信号在對應點上的頻譜值相同(直接利用定義即可推出)。至于補零後其它多點處的頻譜是否是原信号的内容,這是問題的關鍵。

事實上,用于實用的方法不是下文裡提到的方法,而是利用采樣資料抽取,降低采樣頻率的方法來實作。因為資料長度一般在使用時都是最大長度,尤其是這種應用,肯定已經采用最大資料處理長度,不用問的。

我有一個試驗,是多年前和一位同學讨論此類問題的試驗,有興趣的不妨試試.

%% 用于檢驗補零FFT是否提高分辨率

%%  結論:  1。 補零fft提高分辨率是指信号加窗後的合成信号的分辨率。

%     這種情況下fft可以幫助分辨真實的峰值,但分辨率你可以計算一下應該改是不變的。   

%           2。 如果信号=加窗後的合成信号   提高分辨率,如果加入點為真實的資料,當然提高分辨率。  

%           4。 提高分辨細節的本質是由于窗的展寬,窗分辨細節率的提高引起的。這是一個用大窗觀 察含有小窗信号的小窗的過程。補零而看到的頻率細節不是信号本身的細節,而是窗的細節。

  clear;

Nfft=16;

span=[0:Nfft-1];

omga=[1:3]*pi/8;

x=exp(j*omga(1)*span)+exp(j*omga(2)*span)+exp(j*omga(3)*span);

stem(pi/Nfft*[0:Nfft-1],abs(fft(x,Nfft)),'r');  figure(2);

stem(pi/Nfft/2*[0:Nfft*2-1],abs(fft(x,Nfft*2)),'b');  figure(3);

stem(pi/Nfft/16*[0:Nfft*16-1],abs(fft(x,Nfft*16)),'g');

原文連接配接:http://www.ed-china.com/ART_8800009929_400014_500012_TS.HTM

原文簡介:

采用C語言程式處理FFT算法無能為力的擴大頻譜的問題

如果你隻是對計算小頻率範圍上的頻譜有興趣,那HRFT可能比FFT更有效。頻率範圍越窄,HRFT的吸引力就越大。當必須利用有限的存儲資源在嵌入式系統中執行運算時,這一點尤為明顯。

許多科學和工程應用都要求信号準确的頻譜或傅立葉變換。式1以無量綱形式(dimensionless form)給出,其中Ω = ΩT,T是采樣間隔,q[n] = q(nT),代表信号q(t)的第n次采樣。該式也假設信号為有限長序列,故總共僅有N 個連續采用點。Q(Ω)是連續變量Ω的周期函數,周期為2e。

正常求解方法是在區間Ω = [0, 2e]内的N個均勻間隔點上計算Q(Ω)的值。這個過程叫做離散傅立葉變換(DFT),通常利用快速傅利葉變換(FFT)的算法來完成。DFT給出點Ω = 2ek/N (k = 0...N -1)的傅立葉變換,進而按照實際頻率給出了Ω=2e/(NT) 或f=1/(NT)的分辨率。對許多應用來說,這種分辨率可能已經足夠。

對于某些應用,必須非常準确地确定頻譜峰值(spectral peak)的位置。在這種情況下,DFT提供的分辨率可能不夠。提高分辨率的方法之一就是簡單地用額外的零來增加采樣點。例如,為加倍頻率分辨率,你可以在q[n]序列末尾增添N個零,使總的序列長度為2N。DFT将在2N個點上計算Q(Ω),進而使分辨率提高一倍。

為提高分辨率而增加的零的個數是有限制的。通常,隻有在很小的頻率範圍内才需要提高分辨率。這裡提供了一種簡潔明了的辦法,那就是直接在你感興趣的頻率範圍上計算式1。下面給出有效算法。

采用歐拉恒等式,我們可以把式1分為實數和虛數兩部分:

通過契比雪夫多項式(Chebyshev polynomials),我們從sinΩ和cosΩ開始,有效地進行sin(nΩ)和cos(nΩ)的遞歸運算。

在式4和式5中,已知T0 =1、T1=cosΩ、U0=1以及U1=2cosΩ,我們可以利用下列公式計算每一個Tn和Un現在我們隻需要cosΩ和sinΩ,就能夠以任意的高分辨率(遠大于标準FFT)在一個非常小的頻率範圍上計算子頻譜了。這一程式hrft用C語言編寫,執行如下:

hrft f1 f2 Nf N sps infile outfile

其中,f1=開始頻率(Hz),f2=終止頻率(Hz),Nf=計算FT的頻率點數, N=從輸入檔案讀取的采樣點數,sps=每秒采樣點數,infile=輸入檔案,outfile=輸出檔案。

圖中顯示了由FFT算法産生的從2260Hz到2268 Hz的部分頻譜,以及由高分辨率傅立葉變換(HRFT)在該頻率範圍上産生的頻譜。

兩種方法都采用了相同的2048點資料集。FFT具有4 Hz/bin的分辨率,HRFT計算了41個點,分辨率為0.2 Hz/bin。顯然,41點的HRFT3比3點FFT的圖更平滑。資料集的主要頻率為2265 Hz,據此我們可以看出HRFT方法準确定位了頻率峰值,而用FFT定位的峰值則偏離了1Hz。為了利用FFT獲得同樣好的分辨率,必須添加零,以達到65,536個點的序列長度。

如果你隻是對計算小頻率範圍上的頻譜有興趣,那HRFT可能比FFT更有效。頻率範圍越窄,HRFT的吸引力就越大。當必須利用有限的存儲資源在嵌入式系統中執行運算時,這一點尤為明顯。

 3.下面這篇文章的講述容易了解一些

轉自:http://xialulee.spaces.live.com/blog/cns!4EE324C8ACFA82DB!1041.entry

時域補零對于DFT譜的影響

      節前總是瘋狂加班,今天晚上還在實驗室幹到十點。其實這篇文章早就寫好了,隻是太忙,沒時間上網。

      前幾天上數字信号處理(本以為第二次上這個課隻是簡單地重複過去學習過的内容,但是這次有了很多新的發現),書上說對時域信号補零之後再作DFT并不能提高頻譜的頻率分辨率,提高采樣頻率也不能提高DFT譜的頻率分辨率。這個很新鮮,以前上課時沒有考慮過這個問題,以前的課本好像也沒有開辟專門的章節論述這個問題。

      提高采樣頻率不能提高頻率分辨率的原因其實很簡單,因為提高了采樣頻率,雖然在相同的觀察時長那的點數增多了,但與此同時采樣頻率也變大了,點數增加幾倍采樣頻率增加幾倍,是以不改變觀察時長而僅僅提高采樣頻率并不能提高DFT譜的頻率分辨率。

      但是時域補零呢?采樣頻率沒有變化,而點數增加無疑會減小DFT譜的相鄰譜線間隔,相鄰譜線間隔的縮小為什麼不能提高頻率的分辨率呢?書上是這樣寫的:“錯把‘計算分辨率’當成了‘實體分辨率’……補零沒有對原信号增加任何新的資訊,是以不可能提高分辨率。但補零……補零還可以對原X(k)做插值。”(《數字信号處理——理論、算法與實作(第二版)》清華大學出版社,胡廣書)

      為了更好地了解這個問題,我又一次借用MATLAB的強大力量,寫了一個簡單的程式如下: 

%點數

n=0:127;

%頻率

f=0.1;

%信号,正弦疊加矩形

y1=sin(2*pi*f*n);

y1(1:16)=y1(1:16)+1;

%繪制y1的fft譜幅度

%譜線較多,直接畫的包絡

figure;

plot(abs(fft(y1)));

%對信号進行截短

y2s=y1(1:32);

%繪制y1截斷後沒有補零的fft譜幅度

figure;

fy2s=abs(fft(y2s));

stem(fy2s);

%然後補零使y1和y2一樣長

y2=[y2s zeros(1,128-32)];

%打開一個繪圖視窗

figure;

%繪制y1的fft譜幅度

%譜線較多,直接畫包絡

plot(abs(fft(y1)));

%在同一個figure中繼續繪圖

hold on;

%繪制y2的fft譜幅度(紅色)

%譜線較多,直接畫包絡

plot(abs(fft(y2)),'r');

%繪制y2s的fft幅度譜

stem(1:4:128,fy2s,'k');

hold off;

      程式生成的圖像如下:

FFT補零相關

圖1(原信号的譜,因為點數較多,繪制的是包絡)

FFT補零相關

圖2(截短信号的譜)

FFT補零相關

圖3(比較原信号【藍】,截短信号【黑】,補零信号【紅】三者譜的關系,補零信号的譜由于點數較多,繪制的是包絡)

      程式的大意是:首先生成了一個長度為128點的信号,繪制了它的DFT譜,然後将該信号截短,求其DFT譜,然後對截短的信号補零,使其長度為128點再求DFT譜,并将原信号的譜與補零信号的譜進行比較,結果一目了然。

      從圖三中我們可以發現,紅色的補零信号的譜,僅僅是對黑色的截短信号的譜的插值,也就是說補零信号的譜,是通過截短信号的譜進行了推測(插值算法)得來的,它并不能反映原信号的譜(因為原信号在截短的過程中部分資訊丢失了,而補零并沒有将這些丢失的資訊找回來),是以雖然補零信号的譜線間隔變小了,但是除了從截短信号的譜中取出來的32根譜線以外,其餘的96根譜線都是無效的。去掉這些無效的譜線,采樣頻率不變,有效的譜線數不變,是以其實體頻率分辨率自然沒有改變。

      在時域補零起到了對頻譜的插值作用,考慮到傅立葉變換的對稱性,考慮到變換與反變換的表達式除了系數和符号的差别外并沒有根本的不同,推斷出這樣一個結果:在頻域補零也會造成時域的插值(當然在頻域進行操作一定要注意譜的對稱性,否則反變換回來得到的将是一個複信号,至于為什麼會這樣參看《xialulee來說明什麼是負頻率》 ),于是我又寫了如下的程式:  

f=0.1;

n=0:31;

%産生正弦信号

y1=sin(2*pi*f*n);

%y1的fft譜

f1=fft(y1);

%給y1的譜補零

f2=[f1(1:end/2+1) zeros(1,31) f1(end/2+1:end)];

stem(abs(f2));

%對補零後的譜作反變換

y2=ifft(f2);

%打開繪圖視窗

figure;

%繪制多幅圖形

hold on;

%繪制y2

stem(y2);

%繪制原信号(除以2以比較插值效果)

stem(1:2:64,y1/2,'r');

hold off;

      程式的輸出圖形如下:

FFT補零相關

圖4

      仿佛證明了這個推測。這是不是就是所謂的傅立葉插值?