代码之家  ›  专栏  ›  技术社区  ›  Kev

Python中的信号频率滤波

  •  6
  • Kev  · 技术社区  · 6 年前

    我试着用fft过滤一些信号。 我正在研究的信号非常复杂,我在这个主题上没有真正的经验。 这就是为什么我创建了一个简单的正弦波3Hz,并试图切断3 Hz。

    到目前为止,一切顺利

    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.fftpack import fftfreq, irfft, rfft
    
    t = np.linspace(0, 2*np.pi, 1000, endpoint=True)
    f = 3.0 # Frequency in Hz
    A = 100.0 # Amplitude in Unit
    s = A * np.sin(2*np.pi*f*t) # Signal
    dt = t[1] - t[0] # Sample Time
    
    W = fftfreq(s.size, d=dt)
    f_signal = rfft(s)
    
    cut_f_signal = f_signal.copy()
    cut_f_signal[(np.abs(W)>3)] = 0 # cut signal above 3Hz
    
    cs = irfft(cut_f_signal)
    
    fig = plt.figure(figsize=(10,5))
    plt.plot(s)
    plt.plot(cs)
    

    我所期望的 expected output

    我得到了什么 Result

    我真的不知道噪音是从哪里来的。 我认为这是一些基本的东西,但我不明白。 谁能给我解释一下吗?

    编辑

    只是进一步的信息

    频率

    yf = fft(s)
    N = s.size
    xf = np.linspace(0, fa/2, N/2, endpoint=True)
    fig, ax = plt.subplots()
    ax.plot(xf,(2.0/N * np.abs(yf[:N//2])))
    plt.xlabel('Frequency ($Hz$)')
    plt.ylabel('Amplitude ($Unit$)')
    plt.show()
    

    enter image description here

    2 回复  |  直到 6 年前
        1
  •  6
  •   Mihayl    6 年前

    您可以更改创建信号的方式并使用采样频率:

    fs = 1000
    t = np.linspace(0, 1000 / fs, 1000, endpoint=False) # 1000 samples
    f = 3.0 # Frequency in Hz
    A = 100.0 # Amplitude in Unit
    s = A * np.sin(2*np.pi*f*t) # Signal
    dt = 1/fs
    

    这里是整个代码:

    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.fftpack import fftfreq, irfft, rfft
    
    fs = 1000
    t = np.linspace(0, 1000 / fs, 1000, endpoint=False)
    f = 3.0 # Frequency in Hz
    A = 100.0 # Amplitude in Unit
    s = A * np.sin(2*np.pi*f*t) # Signal
    dt = 1/fs
    
    W = fftfreq(s.size, d=dt)
    f_signal = rfft(s)
    
    cut_f_signal = f_signal.copy()
    cut_f_signal[(np.abs(W)>3)] = 0 # cut signal above 3Hz
    
    cs = irfft(cut_f_signal)
    
    fig = plt.figure(figsize=(10,5))
    plt.plot(s)
    plt.plot(cs)
    

    f = 3.0 Hz和 (np.abs(W) >= 3) : enter image description here

    f = 1.0 赫兹: enter image description here

        2
  •  3
  •   0x51ba    6 年前

    关于为什么A.As解决方案比您的解决方案更有效的其他信息:

    A、 A的模型在其解中不包含任何非整数频率,过滤掉较高频率后,结果如下所示:

    1.8691714842589136e-12 * exp(2*pi*n*t*0.0)
    1.033507502555532e-12 * exp(2*pi*n*t*1.0)
    2.439774536202658e-12 * exp(2*pi*n*t*2.0)
    -8.346741339115191e-13 * exp(2*pi*n*t*3.0)
    -5.817427588021649e-15 * exp(2*pi*n*t*-3.0)
    4.476938066992472e-14 * exp(2*pi*n*t*-2.0)
    -3.8680170177940454e-13 * exp(2*pi*n*t*-1.0)
    

    而您的解决方案包括以下组件:

    ...
    
    177.05936105690256 * exp(2*pi*n*t*1.5899578814880346)
    339.28717376420747 * exp(2*pi*n*t*1.7489536696368382)
    219.76658524130005 * exp(2*pi*n*t*1.9079494577856417)
    352.1094590251063 * exp(2*pi*n*t*2.0669452459344453)
    267.23939871205346 * exp(2*pi*n*t*2.2259410340832484)
    368.3230130593005 * exp(2*pi*n*t*2.384936822232052)
    321.0888818355804 * exp(2*pi*n*t*2.5439326103808555)
    
    ...
    

    请参阅 this 关于将FFT箱归零可能产生的副作用的问题。