[英]How to fit a sinusoidal graph to an audio signal in order to determine frequency and amplitude in Python?
[英]Problems with sinusoidal curve fitting: amplitude and frequency come out too low
我有一些時間序列數據,它對應於圖像中的黑線(它是滾動平均值)。 我試圖擬合正弦曲線但沒有成功; 淺藍色,幾乎直線是當前的結果。 (深藍色的是多項式擬合,暫時忽略它)。
def objective(x, a, b, c, d):
return a * np.sin(b - x) + c * x**2 + d
[..]
from scipy import optimize
X = X.ravel() # 1D array of ordinal dates
y = y.ravel() # 1D array of temperature values
# Curvefit with the objective function.
params, _ = optimize.curve_fit(objective, X, y)
# Plot the curvefit
plt.plot(X_extended, objective(
X, params[0], params[1], params[2], params[3]))
即使我添加了非常低的頻率或非常高的振幅的猜測,也幾乎沒有任何變化。
任何想法表示贊賞。 如有必要,我可以嘗試在其他地方重現該問題。
應用答案中給出的 p0 值和函數,圖形現在如下所示:
謝謝!
沒有要測試的數據,很難准確判斷。 但是,一個很好的猜測是您的起始參數已關閉,然后廣義最小二乘擬合可能(很容易)失敗。 您甚至沒有給curve_fit
一組初始參數,因此a
、 b
、 c
和d
的初始起始值都將設置為 1。
僅處理正弦擬合,對於幅度a
,您可能需要大約 7 ,而對於偏移d
,大約為 27。 b
更難猜測,因此最初可以保留為 0(或 1)。
但是,方程的二次部分會使事情變得一團糟:x 值很大,所以它會變化得非常快,或者更確切地說, c
應該非常接近於零(接近於1/x^2
, 所以說~ 1e-12
, 以抵消大二次變化的影響. 任何這樣小的數字也會有擬合問題:事先規范化你的公式/參數(為 1 級)總是一個好主意。
事實上,我不明白為什么你的函數中有二次方。 也許是底層模型需要這樣做,但數字本身根本沒有顯示二次行為的跡象。 我會刪除它。
最后,雖然您有 x-offset b
,但您沒有周期參數。 結果,它會固定在 2π,而這絕對不是。 這將是擬合數據的最大障礙,僅次於方程的二次部分。 該周期看起來大約是 300(或一年?),或大約 50 * 2π。
因此,請嘗試使用以下功能:
def objective(x, a, b, c, d):
return a * np.sin(b - c*x/50) + d
具有非常粗略的起始參數:
p0 = [7, 0, 1, 27]
看看你得到了什么。
(如果您想知道公式中的 50:在這些數量級上並不是真的有必要,但它作為將c
規范化為 1 階的示例。您可以將d
替換為10*d
然后將其初始猜測設置為 3。或者,如果你這樣做,你現在可以完全省略p0
,所有參數猜測都為 1。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.