2

I have a question regarding the scipy.fft package, and how I can use this to generate a Fourier transform of a pulse.

I am trying to do this for an arbitrary pulse in the future, but I wanted to make it as simple as possible so I have been attempting to FFT a time domain rectangular pulse, which should produce a frequency domain Sinc function. You can see more information here: https://en.wikipedia.org/wiki/Rectangular_function

From my understanding of FFTs, a signal needs to be repeating and periodic, so in a situation like a rectangular pulse, I will need to shift this in order for the FFT algorithm to 'see' it as a symmetric pulse.

My problem arises when I observe the real and imaginary components of my Fourier transform. I expect a rectangular pulse (As it is a real and even function) to be real and symmetrical. However, I notice that there are imaginary components, even when I don't use complex numbers.

My approach to this has been the following:

  1. Define my input pulse
  2. Shift my input pulse so that the function is symmetric around the origin
  3. Fourier transform this and shift it so negative frequencies are shown first
  4. Separate imaginary and real components
  5. Plot amplitude and phase of my frequencies

I have attached graphs showing what I have attempted and outlining these steps.

This is my first question on stack overflow so I am unable to post images, but a link to the imgur album is here: https://i.stack.imgur.com/glyFe.jpg

I am having trouble with the phase information of my frequency, from the images in the imgur folder, I have a linearly increasing phase difference, which should in the ideal case be flat.

I expect it is a problem with how I am shifting my input pulse, and have tried several other methods (I can post them if that would help)

Any help with this would be much appreciated, I have been pouring over examples but these mostly refer to infinite sinusoidal functions rather than pulses.

My Code is shown below:

    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()
  • 1
    with an even pulse width you are going to have a hard time producing a pulse that is symmetrical around zero. try something like `pulse[npt//2 - 50:npt//2 + 50 + 1]` and your imaginary parts should all but go away. – Paul Panzer Dec 14 '17 at 02:32
  • @PaulPanzer Thank you for your comment, I can't believe that I missed that! It fixed all my issues and I have updated the imgur album with the new results. – Logan Baber Dec 14 '17 at 02:44

0 Answers0