【问题标题】:"Casting complex values to real discards the imaginary part" using fft“将复数值转换为实数会丢弃虚部”使用 fft
【发布时间】:2021-11-01 12:56:36
【问题描述】:

我想知道代码有什么问题。

我只想制作一个傅立叶变换图并通过滑块更改值。

但这就是我的图表发生的情况。

我只是想做一个这样的Parametric EQ图形界面,只有带有滑块的图形部分

这里是源代码:

import matplotlib as mpl
import matplotlib.pyplot as plt
from numpy import pi, sin
import numpy as np
from matplotlib.widgets import Slider, Button, RadioButtons
import scipy.fftpack
"""import warnings
warnings.simplefilter("ignore",np.ComplexWarning)"""


# Eq many times calcule
def fermi(A1, F1, A2, F2):
    peak1 = A1 * sin(2.0 * pi * F1 * x)
    pFl = A2 * sin(2.0 * pi * F2 * x)
    y = peak1 + pFl
    yf = scipy.fftpack.fft(y)
    
    return yf

fig = plt.figure(figsize=(5, 5))

# Create main axis
ax = fig.add_subplot(111)
ax.set_xlim([0,30])
ax.set_ylim([-2, 10])
fig.subplots_adjust(bottom=0.5, top=0.95)

# Create axes for sliders
ax_a1 = fig.add_axes([0.3, 0.10, 0.4, 0.05])
ax_a1.spines['top'].set_visible(True)
ax_a1.spines['right'].set_visible(True)

ax_f1 = fig.add_axes([0.3, 0.01, 0.4, 0.05])
ax_f1.spines['top'].set_visible(True)
ax_f1.spines['right'].set_visible(True)

ax_a2 = fig.add_axes([0.3, 0.20, 0.4, 0.05])
ax_a2.spines['top'].set_visible(True)
ax_a2.spines['right'].set_visible(True)

ax_f2 = fig.add_axes([0.3, 0.30, 0.4, 0.05])
ax_f2.spines['top'].set_visible(True)
ax_f2.spines['right'].set_visible(True)

# Create sliders
s_a1 = Slider(ax=ax_a1, label='amp1 ', valmin=-2, valmax=6, valinit=0, valfmt=' %1.1f eV', facecolor='#cc7000')
s_f1 = Slider(ax=ax_f1, label='f1 ', valmin=0, valmax=30, valinit=1.5, valfmt=' %i K', facecolor='#cc7000')
s_a2 = Slider(ax=ax_a2, label='amp2 ', valmin=-2, valmax=6, valinit=0, valfmt=' %1.1f eV', facecolor='#cc7000')
s_f2 = Slider(ax=ax_f2, label='f2 ', valmin=0, valmax=30, valinit=3.946, valfmt=' %i K', facecolor='#cc7000')


N = 10500
T = 1.0/ 800.0
# Plot default data
x = np.linspace(-0, 30, 1000)
a1_0 = 5
f1_0 = 0
a2_0 = 0
f2_0 = 0
y = fermi(a1_0, f1_0, a2_0, f2_0)
f_d, = ax.plot(x, y, linewidth=0.5, color='#000000')


# Update values
def update(val):
    aa1 = s_a1.val
    ff1 = s_f1.val
    aa2 = s_a2.val
    ff2 = s_f2.val
    f_d.set_data(x.real, (fermi(aa1, ff1, aa2, ff2)).imag)
    fig.canvas.draw_idle()
    

s_a1.on_changed(update)
s_f1.on_changed(update)
s_a2.on_changed(update)
s_f2.on_changed(update)
    
plt.show()

我怀疑错误出在函数 fermi 中。

【问题讨论】:

  • 来晚了,忘记分享代码了,谢谢!

标签: python interface fft


【解决方案1】:

函数fermi 本身看起来不错。然而,重要的是要注意 FFT 结果是复数。另一方面,Matplotlib 绘制实值数据并且不知道如何处理复数。然后它会发出您看到的警告,因为它会在绘图之前丢弃数据的虚部。

对于您的特定应用,FFT 的(实值)幅度可能更符合您的需求。如果您只需要 FFT 的幅度,则可以更改 fermi 函数以仅返回计算出的幅度:

yf = np.abs(scipy.fftpack.fft(y))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    相关资源
    最近更新 更多