我使用下面的引數和公式來生成信號。
蟒蛇代碼:
import numpy as np
fs=15e6
dt=1/fs
f0=1e6
pri=400e-6
t=np.arange(0,pri,dt)
i=64
fd=5/(i*pri)
xt=0.1*np.exp(2j*np.pi*f0*t)
xf=np.fft.fft(xt)
matlab 代碼與 python 代碼非常相似:
fs=15e6
dt=1/fs
f0=1e6
pri=400e-6
t=0:dt:pri-dt
i=64
fd=5/(i*pri)
xt=0.1*exp(2j*pi*f0*t)
xf=fft(xt)
這些代碼將生成一個長度為 6000 的陣列來執行 fft。然后我使用相同的方法在matlab中計算結果。當fft長度小于6000時,結果完全一樣。但當fft長度為6000時,結果就有點不同了。python中xf的結果是:
xf[:5] = [4.68819428e-12-2.53650626e-12j,
6.55886345e-12 4.51937973e-13j,
5.91758655e-12 4.48215898e-12j,
2.07297400e-12 6.37992397e-12j,
-1.44454940e-12 5.60550355e-12j]
matlab中xf的結果是:
xf(1:5) = 5.165829569664382e-12 1.503743771929872e-12j
4.389776854811194e-12 5.127317569216533e-12j
1.067288620484369e-12 7.191186166371298e-12j
-3.058138112418996e-12 6.189531470616248e-12j
-5.288313073640339e-12 2.908982377132765e-12j
如果使用長度 5999 在 python 中執行這樣的 fft: xf=np.fft.fft(xt, 5999) 或在 matlab 中: xf=fft(xt, 5999) 結果完全相同。在蟒蛇中:
xf[:5] = [-0.09135455 0.04067366j,
-0.09160153 0.04072616j,
-0.09184974 0.04077892j,
-0.09209917 0.04083194j,
-0.09234986 0.04088522j]
在matlab中:
xf(1:5) = -9.135455e-02 4.067366e-2j
-9.160153e-02 4.072616e-2j
-9.184974e-02 4.077892e-2j
-9.209917e-02 4.083194e-2j
-9.234986e-02 4.088522e-2j
我很困惑。誰能說明這個現象?謝謝你的幫助。PS:python 3.8.5,numpy 1.19.2,matlab 2014
uj5u.com熱心網友回復:
黛米歐 我認為您獲得的不同值是因為 MATLAB 的浮點舍入錯誤。對于 1e-15 階的低值,該值四舍五入為 0,并產生四舍五入順序的錯誤。對于非常大的值,它會以相同的方式發生。你可以看到一個相關的帖子,對此有很好的解釋:https : //es.mathworks.com/matlabcentral/answers/475494-unexpected-results-due-to-floating-point-rounding-errors-by-performing- la 上的算術計算。
另外值得注意的是,即使這種浮點舍入錯誤總是發生,您也必須考慮到您的資料集和您期望的結果來確定這是否重要。有時這些絕對差異并不意味著什么,因為相對差異是微不足道的。如果您希望避免 MATLAB 的這種行為,您需要使用該sym函式,該函式會觸發 MATLAB 使用涉及幾件事的符號表示,其中之一是更準確地表示數字。有關此主題的更多資訊,請訪問:https : //es.mathworks.com/help/symbolic/create-symbolic-numbers-variables-and-expressions.html#buyfu27。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/371519.html
