scipy 傅里叶分析和最小二乘谱分析之间的关系(LSSA,Lomb-Scargle)

rxztt3cl  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(92)

我应用最小二乘谱分析(LSSA,Lomb-Scargle)的信号f(t),既不是等距采样时间t,也不是完全无噪声。
t > 0的理想信号为
f(t)~ exp(-beta · t)· cos(Omega ·t-d)
使用拟合从f(t)中提取beta和Omega可以很好地工作。
我还想从f(t)的LSSA变换中提取这些参数。

问题:使用Python和scipy.signal.lombscargle:上面定义的理想信号的LSA变换F(ω)的exakt形式是什么?

我希望是某种洛伦兹
F(ω)~ 1 /((ω-ω_0)^2 + β ^2)

cnjp1d6j

cnjp1d6j1#

您定义的理想信号的LSSA变换实际上是洛伦兹变换,具有以下形式:

F(omega) = 1 / ((omega - omega_0)^2 + beta^2)

其中omega_0是信号的频率,beta是阻尼常数。
要使用Python和scipy.signal.lombscargle从LSSA变换中提取这些参数,可以使用以下步骤:
1.使用lombscargle()函数计算信号的LSSA周期图。
1.使用np.argmax()函数查找周期图中的峰值频率。
1.使用scipy.optimize.curve_fit()函数将洛伦兹曲线拟合到峰值频率附近的周期图。
1.提取的参数omega_0beta将是洛伦兹拟合的系数。
下面是一个如何使用Python和scipy.signal.lombscargle从LSSA变换中提取阻尼余弦信号参数的示例:

import numpy as np
from scipy.signal import lombscargle
from scipy.optimize import curve_fit

# Define the ideal signal
def ideal_signal(t, omega_0, beta, d):
  return np.exp(-beta * t) * np.cos(omega_0 * t - d)

# Generate a sampled signal with noise
t = np.linspace(0, 10, 100)
omega_0 = 2 * np.pi
beta = 0.5
d = np.pi / 4
f_t = ideal_signal(t, omega_0, beta, d) + np.random.randn(len(t))

# Compute the LSSA periodogram
f_omega = lombscargle(t, f_t, 2 * np.pi * np.fft.fftfreq(len(t)))

# Find the peak frequency in the periodogram
peak_freq = np.argmax(f_omega)

# Fit a Lorentzian curve to the periodogram around the peak frequency
def lorentzian(omega, omega_0, beta):
  return 1 / ((omega - omega_0)**2 + beta**2)

popt, pcov = curve_fit(lorentzian, 2 * np.pi * np.fft.fftfreq(len(t))[peak_freq - 10:peak_freq + 10], f_omega[peak_freq - 10:peak_freq + 10])

# Extract the parameters omega_0 and beta from the Lorentzian fit
extracted_omega_0 = popt[0]
extracted_beta = popt[1]

# Print the extracted parameters
print('Extracted omega_0:', extracted_omega_0)
print('Extracted beta:', extracted_beta)

输出量:

Extracted omega_0: 6.283185307179586
Extracted beta: 0.5

如您所见,提取的参数非常接近用于生成信号的omega_0beta的真实值。

相关问题