【问题标题】:Simulate Fourier Analysis with Python用 Python 模拟傅里叶分析
【发布时间】:2019-12-29 21:12:34
【问题描述】:

我正在尝试制作一个程序,将我的数据图和模拟数据图一起显示。我的数据来自输入为方波、输出为鲨鱼鳍波形的 RC 电路。问题是模拟的有点乱。我不知道错误在哪里,我猜频率上有些错误,但我不知道。感谢任何会帮助我的人。 链接到数据https://drive.google.com/open?id=1d8p9sIsNoVuXTsjHga0bXmgrbmUIb-LX 我的代码

import numpy as np
import matplotlib.pyplot as plt
import pylab

x, y = pylab.loadtxt('dati06_04.txt', unpack=True) #  $\mu s$; digits
off = (y.max() + y.min()) / 2  # digits, offset
Amp = y.max()-y.min()  # digits, amplitude
f_T = 24  # Hz, cut frequency
w_T = 2 * np.pi * f_T  # rad / s


def A_k(k, w):
    global w_T
    return 1 / (1 + k * w / w_T) ** 0.5


def Phi(k, w):
    global w_T
    return np.arctan(- w * k / w_T)


def c_k(k):
    global Amp
    c = 0
    if k % 2 == 0:
        c = 0
    if k % 2 == 1:
        c = 2 * Amp / (k * np.pi)
    return c


def w_res(tt, f, k):
    global off
    w = 2 * np.pi * f
    ww = 0
    for i in range(k+1):
        ww = ww + c_k(i) * A_k(i, w) * np.sin(w * i * tt + Phi(i, w))
    return ww + off


plt.plot(x/1000, y, color='blue')
plt.plot(x/1000, w_res(x, 111, 1000), color='orange')
plt.show()

【问题讨论】:

  • 当我调用 w_res(x,111,1000) 时,111 是输入信号的频率(以 Hz 为单位)(您还可以在 .txt 文件的第一行中看到,1000 是一个很好的值k 有一个很好的近似值。
  • 这么多全局变量的目的是什么?
  • 在函数中使用,不是这样使用的吗?可能我错了
  • 您可以删除它们,因为无论如何您都在全局范围内定义了它们。也很难理解,因为我不知道你的功能应该做什么。我建议添加一些 cmets。
  • 例如写w_res(x, 1/111, 1000)而不是w_res(x, 111, 1000)会显示一个square信号。不过我不知道这有什么帮助。

标签: python matplotlib fft


【解决方案1】:

您可能在某处混淆了周期和频率,这会导致您的问题。我不确定在哪里,因为我对这个理论并不完全熟悉,我也不完全理解你那里的逻辑。解决方案是更改以下行:

plt.plot(x/1000, w_res(x, 111, 1000), color='orange')

plt.plot(x/1000, w_res(x, 1/111, 1000), color='orange')

您之前得到了一条直线,因为频率太低,并且您看到了方形信号的下沿。另外,你可以删除全局定义,在这种情况下它们是没有用的。

【讨论】:

  • 好的,谢谢。在哪里可以了解有关全局变量以及如何使用它们的更多信息?
  • 在 Python 中,使用全局变量通常是个坏主意,但在少数情况下需要使用全局变量。我猜只是谷歌 Python 本地全局范围,全局变量。
猜你喜欢
  • 1970-01-01
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 2015-07-14
  • 1970-01-01
  • 2010-10-10
  • 2012-05-18
  • 2013-06-11
相关资源
最近更新 更多