2015-04-30 30 views
1

在MATLAB中計算離散傅里葉變換時出現問題,顯然得到正確的結果,但當繪製所獲得頻率的幅度時,您可以看到非常接近零的值,它應該完全爲零。我用我自己的實現:我知道使用MATLAB的fft更好,但我需要使用我自己的實現,因爲它是爲大學。在MATLAB中使用DFT產生的意外結果

我用來產生方波代碼:

x = [ones(1,8), -ones(1,8)]; 
for i=1:63 
    x = [x, ones(1,8), -ones(1,8)]; 
end 

MATLAB版本:R2013a(8.1.0.604)64位

我已嘗試發生在我身上的一切,但我沒有很多使用MATLAB的經驗,我還沒有在論壇中發現與此問題有關的信息。我希望有一個人可以幫助我。

在此先感謝。

+0

我認爲這是一個數值問題。由於這些值在'1e-15'的範圍內,而峯值的幅度大約爲'656',所以我不會打擾太多。 MATLAB FFT和你的DFT程序之間的平方誤差的總和在'1e-20'的範圍內,所以基本上爲零。但也許別人有更詳細的消除? – hbaderts

+0

我同意@hbaderts。這些值非常小,幾乎和* eps *一樣小,並且在這裏可以被認爲是0。你的FFT解決方案看起來很棒 – siliconwafer

+0

感謝您的回答,我知道這個值是微不足道的,並不顯示在情節,但是當我想繪製角度函數的相位獲得無意義的結果。我使用y((y <0.00001)&(y> -0.00001))= 0來隱藏這個值,但它不是一個優雅的解決方案。 –

回答

0

這將是一個數值問題。值在1e-15的範圍內,而信號的DFT的值在1e+02的範圍內。進行進一步處理時,這很可能不會導致任何錯誤。您可以通過

y = fft(x); 
yh = Discrete_Fourier_Transform(x); 
sum(abs(yh - y).^2) 
ans = 
    3.1327e-20 

這基本上是零計算你的DFT和MATLAB fft功能之間的總平方誤差。因此我會得出結論:你的DFT函數工作得很好。

只是一個小小的評論:你可以很容易地矢量化DFT。

n = 0:1:N-1; 
k = 0:1:N-1; 
y = exp(-1j*2*pi/N * n'*k) * x(:); 

隨着n'*k您創建的nk所有組合的矩陣。然後你採取這些矩陣元素中的每一個的exp(...)。使用x(:)確保x是一個列向量,因此您可以執行矩陣乘法運算(...)*x,它會自動彙總所有k的結果。其實,我只是注意到,這正是DFT衆所周知的矩陣形式。