Python Spectrum analyzer 'Max hold' function
Implementation of 'Max Hold' in Python
How can I create a 'Max Hold' in Python on the Moku's Spectrum Analyzer
The Moku's Spectrum Analyzer includes a math channel on both the iPad and Windows app. This math channel has a useful 'max hold' function.
The attached Python script deploys a Spectrum Analyzer instrument, sweeps the frequency and captures this data into Python. Within Python, we then calculate and display a 'Max Hold' trace.
# # Moku example: Plotting Spectrum Analyzer - Max Hold # # This example demonstrates how you can configure the Spectrum Analyzer # instrument and plot ad Max Hold of its spectrum data in real-time. # # (c) 2023 Liquid Instruments Pty. Ltd. # from moku.instruments import SpectrumAnalyzer import logging import matplotlib.pyplot as plt logging.getLogger('moku').setLevel(logging.INFO) # Launch Spectrum Analyzer and connect to your device via IP i = SpectrumAnalyzer('192.168.###.###', force_connect=True) try: # Set spectrum analyzer configuration i.set_defaults() i.set_span(70e6, 130e6) i.set_rbw('Auto') # Auto-mode # Configure ADC inputs i.set_frontend(1, "50Ohm", "AC", "400mVpp") i.set_frontend(2, "50Ohm", "AC", "400mVpp") # Set up basic plot configurations line1, = plt.plot([]) line2, = plt.plot([]) plt.ion() plt.show() plt.grid() plt.ylim([-200, 100]) plt.autoscale(axis='x', tight=True) # Get an initial frame of data to set any frame-specific plot parameters frame = i.get_data() # Format the x-axis as a frequency scale ax = plt.gca() counter = 0 # Get and update the plot with new data while True: frame = i.get_data() plt.pause(0.0001) fc1 = frame['ch1'] spectrum_length = len(fc1) # Set the frame data for each channel plot line1.set_ydata(fc1) if counter == 0: current_max = fc1 else: for x in range(0,spectrum_length): if fc1[x]>current_max[x]: current_max[x] = fc1[x] line2.set_ydata(current_max) # Frequency axis shouldn't change, but to be sure line1.set_xdata(frame['frequency']) line2.set_xdata(frame['frequency']) # Ensure the frequency axis is a tight fit ax.relim() ax.autoscale_view() # Redraw the lines plt.draw() counter = counter + 1 finally: # Close the connection to the Moku device # This ensures network resources are released correctly i.relinquish_ownership()