Python ifft

2019-04-11  本文已影响0人  多问Why

1.傅利叶逆变换得到原始信号

import numpy as np
import matplotlib.pyplot as plt
def get_data(sample_time,f_s):
    f = 20
    t = np.linspace(0, sample_time, sample_time*f_s, endpoint=False)
    y = np.cos(f * 2 * np.pi * t) + np.cos(2*f * 2 * np.pi * t)
    return y

def demo_fft():
    fig = plt.figure()
    s_t = 1
    f_s = 1024
    y = get_data(s_t, f_s)
    # signal wave
    ax = fig.add_subplot(3, 1, 1)
    ax.plot(y)

    yf = np.fft.fft(y)
    xf = np.fft.fftfreq(len(yf), 1/len(yf))
    # frequency
    ax = fig.add_subplot(3, 1, 2)
    ax.stem(xf, np.abs(yf))

    yifft = np.fft.ifft(yf)
    ax = fig.add_subplot(3, 1, 3)
    # signal from ifft ,can not use np.abs() here
    ax.plot(yifft.real)
    plt.show()

demo_fft()

注意fft的结果是个复数,这时取绝对值得到频率对应的振幅。ifft的结果也是复数,有正有负,因为原始信号也是有正有负,这时不能取绝对值,而应取实数部分。虚数部分都接近于0.当然如果原始信号没有负数,也可取绝对值。


Figure_1.png

2.模拟去除高频噪声

def get_data(sample_time,f_s):
    f = 20
    t = np.linspace(0, sample_time, sample_time*f_s, endpoint=False)
    y = np.cos(f * 2 * np.pi * t) + 0.1*np.cos(450 * 2 * np.pi * t) + 0.05*np.cos(500 * 2 * np.pi * t)
    return y

def demo_fft():
    fig = plt.figure()
    s_t = 1
    f_s = 1024
    y = get_data(s_t, f_s)
    # signal wave
    ax = fig.add_subplot(3, 1, 1)
    ax.plot(y)

    yf = np.fft.fft(y)
    xf = np.fft.fftfreq(len(yf)) * len(yf)
    # frequency
    ax = fig.add_subplot(3, 1, 2)
    ax.stem(xf, np.abs(yf))

    M = len(yf)
    K = 100
    yf[M // 2 - K: M // 2 + K] = 0

    yifft = np.fft.ifft(yf)
    ax = fig.add_subplot(3, 1, 3)
    # signal from ifft ,can not use np.abs() here
    ax.plot(yifft.real)
    plt.show()

demo_fft()
Figure_1-1.png

现在原始信号中加入了频率为450,500的两个小幅的高频信号,模拟高频噪声,可以发现信号波形中有很多毛刺。fft的结果频率是正频率从0到最高,然后负频率再从最高到0,所以去除高频信号就是让中间那部分为0。

上一篇下一篇

猜你喜欢

热点阅读