2012-09-28 15 views
2

我想對我捕獲的一些數據做FFT。我在10MHz-100MHz範圍內工作,因此我的8192採樣捕獲不足以在對它們進行FFT時傳達任何有意義的信息。所以我正在拍攝很多不重疊的正弦波,並且想將它們平均到一起。如何做一個非重疊塊的FFT平均值

我目前做的(在Scilab的)在for循環的每個文件是什麼:

temp1 = read_csv(filename,"\t"); 
temp1_fft = fft(temp1); 
temp1_fft = temp1_fft .* conj(temp1_fft); 
temp1_fft = log10(temp1_fft); 
fft_code = fft_code + temp1_fft; 

然後當我與所有的文件執行的I: fft_code = fft_code./numFiles;

但我我不太確定我是否正確處理這個問題。對於不重疊的樣本有沒有更好的方法?

+0

這將有助於瞭解一些其他的事情,例如你的採樣率,這是什麼類型的數據,如果你正在開窗口數據等等。 – aganders3

回答

0

我認爲你已經接近了,但是在採取log10之前,你應該對頻譜的大小進行平均(temp1_fft)。否則,你基本上最終將它們相乘,而不是平均。因此,相反,只要將log10到外面像這樣循環(我不知道SCILAB的語法):

for filename in files: 
    temp1 = read_csv(filename,"\t"); 
    temp1_fft = fft(temp1); 
    temp1_fft = temp1_fft .* conj(temp1_fft); 
    fft_code = fft_code + temp1_fft; 

fft_code = fft_code./numFiles; 
fft_code = log10(fft_code); 

你一定要使用的大小(你已經這樣做了,當你在conj乘),因爲相位信息將取決於您的採樣何時開始相對於信號。如果您需要相位信息,您必須確保您的採集以某種方式與信號同步。

這樣做是叫"Power Spectrum Averaging"

功率譜平均,也稱爲RMS平均。 RMS平均計算平方量值(FFT乘以其複共軛)之和的加權平均值。權重可以是線性的也可以是指數的。 RMS平均值可以減少數據的波動,但不會降低實際的本底噪聲。有了足夠數量的平均值,可以顯示實際隨機噪底的非常好的近似值。由於RMS均值僅涉及幅度,因此顯示RMS均值的實部或虛部或相位沒有意義,並且功率譜平均值沒有相位信息。

+0

Thanks @ aganders3。這似乎是有道理的。我像你所建議的那樣製作了模組,除了信號強度爲1/2之外,整體情節似乎相同。我在看到改變之前/之後的正常情節,本底噪聲從-12dBc降至-6dBc。當我解決我的錯誤時,你期望的是否會發生? – toozie21

+0

可能是這樣的,但它取決於你的信號和噪聲特性。如果你發佈一些更多的信息或例子,我可以看看。我的建議實際上與操作順序有關(平均和記錄日誌)。 – aganders3