使用scipy.fftpack进行离散傅立叶变换

时间:2017-12-14 02:11:34

标签: python scipy fft dft

我有一个关于scipy.fft包的问题,​​以及我如何使用它来生成脉冲的傅里叶变换。

我试图在将来为任意脉冲做这个,但我想让它尽可能简单,所以我一直在尝试FFT时域矩形脉冲,它应该产生一个频域Sinc函数。您可以在此处查看更多信息:https://en.wikipedia.org/wiki/Rectangular_function

根据我对FFT的理解,信号需要重复和周期性,所以在像矩形脉冲这样的情况下,我需要移动它以使FFT算法“看到”它作为对称脉冲。 / p>

当我观察傅立叶变换的实部和虚部时,我的问题就出现了。我期望矩形脉冲(因为它是真实的,甚至是功能的)是真实的和对称的。但是,我注意到有虚构的组件,即使我不使用复数。

我的方法如下:

  1. 定义输入脉冲
  2. 移动我的输入脉冲,使功能在周围对称 原点
  3. 对此进行傅立叶变换并将其移位,以便显示负频率 第一
  4. 单独的虚构和实际组件
  5. 绘制频率的幅度和相位
  6. 我附上的图表显示了我的尝试并概述了这些步骤。

    这是我关于堆栈溢出的第一个问题,所以我无法发布图片,但是imgur相册的链接在这里:https://imgur.com/a/geufY

    我的频率相位信息有问题,从imgur文件夹中的图像来看,我的相位差线性增加,在理想情况下应该是平坦的。

    我预计这是一个问题,我如何移动我的输入脉冲,并尝试了其他几种方法(我可以发布它们,如果这会有帮助)

    任何有关这方面的帮助都会非常感激,我一直在倾注例子但这些主要是指无限正弦函数而不是脉冲。

    我的代码如下所示:

        import numpy as np
        import scipy.fftpack as fft
        import matplotlib.pyplot as plt
    
        '''Numerical code starts here'''
    
        #Define number of points and time/freq arrays
        npts = 2**12
        time_array = np.linspace(-1, 1, npts)
        freq_array = fft.fftshift(fft.fftfreq(len(time_array), time_array[1]-time_array[0]))
    
        #Define a rectangular pulse
        pulse = np.zeros(npts)
        pulse_width = 100
        pulse[npts/2 - pulse_width/2:npts/2 + pulse_width/2] = 1
    
        #Shift the pulse so that the function is symmetrical about origin
        shifted_pulse = fft.fftshift(pulse)
    
        #Calculate the fourier transform of the shifted pulse
        pulse_frequencies = fft.fftshift(fft.fft(shifted_pulse))
    
        '''Plotting code starts here'''
    
        #Plot the pulse in the time domain
        fig, ax = plt.subplots()
        ax.plot(time_array, pulse)
        ax.set_title('Time domain pulse', fontsize=22)
        ax.set_ylabel('Field Strength', fontsize=22)
        ax.set_xlabel('Time', fontsize=22)
    
        #Plot the shifted pulse in the time domain
        fig, ax = plt.subplots()
        ax.plot(time_array, shifted_pulse)
        ax.set_title('Shifted Time domain pulse', fontsize=22)
        ax.set_ylabel('Field Strength', fontsize=22)
        ax.set_xlabel('Time', fontsize=22)
    
        #Plot the frequency components in the frequency domain
        fig, ax = plt.subplots()
        ax.plot(freq_array, np.real(pulse_frequencies), 'b-', label='real')
        ax.plot(freq_array, np.imag(pulse_frequencies), 'r-', label='imaginary')
        ax.set_title('Pulse Frequencies real and imaginary', fontsize=22)
        ax.set_ylabel('Spectral Density', fontsize=22)
        ax.set_xlabel('Frequency', fontsize=22)
        ax.legend()
    
        #Plot the amplitude and phase of the frequency components in the frequency domain
        fig, ax = plt.subplots()
        ax.plot(freq_array, np.abs(pulse_frequencies), 'b-', label='amplitude')
        ax.plot(freq_array, np.angle(pulse_frequencies), 'r-', label='phase')
        ax.set_title('Pulse Frequencies intenisty and phase', fontsize=22)
        ax.set_ylabel('Spectral Density', fontsize=22)
        ax.set_xlabel('Frequency', fontsize=22)
        ax.legend()
    
        plt.show()
    

0 个答案:

没有答案