【问题标题】:How to correctly extract the phase of the spectrum in python如何在python中正确提取光谱的相位
【发布时间】:2022-11-07 05:27:15
【问题描述】:

我在时域中描述一个脉冲并进行傅里叶变换以将其转换为频域。 我在频域中向它添加了一个 e-index 多项式相位e^{i*phase},相位是一个多项式。 这时候我用numpy下的angle函数来提取相位,得到的是如图这样密集的峰。我不知道这是否正确,也不知道如何再次提取多项式。


import numpy as np
import matplotlib.pyplot as plt
fs = 1e-15
THz = 1e12
nm = 1e-9
c = 3e8
N = 2 ** 13
time_window = 3000 * fs
wavelength = 800 * nm
t = np.linspace(-time_window / 2,time_window / 2, N)
df = np.append(np.linspace(0, N / 2, int(N / 2)),(np.linspace(-N / 2, -1, int(N / 2))))/ time_window
f = c/wavelength + df
dw = 2 * np.pi * df
FWHM = 50 * fs
m = 4 * np.log(2)
A_t = np.exp(-m * t ** 2 * (1 / 2) / FWHM ** 2)
A_w = np.fft.fft(A_t)
GDD = 500 * fs*fs
TOD = 0 * fs*fs*fs
FOD = 0
A_w = np.exp(1j * (GDD / 2.0) * dw**2 +
                                1j * (TOD / 6.0) * dw ** 3+
                                1j * (FOD / 24.0) * dw ** 4) * A_w

fig_1 = plt.figure(1, facecolor='w', edgecolor='k')
ax_1 = fig_1.add_subplot(1, 1, 1)
ax_2 = ax_1.twinx()
ax_1.plot(np.fft.fftshift(f/THz),np.fft.fftshift(np.abs(A_w) ** 2 / max(np.abs(A_w) ** 2)),'b')
ax_2.plot(np.fft.fftshift(f/THz),np.fft.fftshift(np.angle(A_w)),'r')
ax_1.set_ylabel('Intensity / a.u.')
ax_2.set_ylabel('Phase / rad')
ax_1.tick_params(axis='y', colors='b')
ax_2.tick_params(axis='y', colors='r')

plt.xlim(300,450)
plt.show()

【问题讨论】:

  • 我知道在 numpy 中有一个 unwrap 函数,但它不能很好地工作

标签: python numpy fft angle phase


【解决方案1】:

两件事情。要将数据相对于相位居中,您需要在 FFT 之前对数据进行 fftshift,或者在每个其他结果元素中翻转虚部的符号。

然后看幅度结果。当幅度足够接近零时,相位变成随机数字噪声的相位,而不是提供信息。因此可以将接近零幅度的相位归零以使绘图看起来更清晰。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 2020-05-21
    • 2019-10-25
    • 1970-01-01
    • 2013-11-16
    相关资源
    最近更新 更多