美文网首页
Python ifft

Python ifft

作者: 多问Why | 来源:发表于2019-04-11 11:03 被阅读0次

    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。

    相关文章

      网友评论

          本文标题:Python ifft

          本文链接:https://www.haomeiwen.com/subject/ojoziqtx.html