annotate fsp7_phasenoise.py @ 81:1947d10f9395

- Search for signal frequency iteratively to improve accuracy. - Use narrower bandwidths (via FFT filter) for close in measurements. - Work around bug in firmware when using FFT filter. - Actually _raise_ the exception when the signal power is too low.
author Daniel O'Connor <doconnor@gsoft.com.au>
date Fri, 27 Sep 2024 16:56:44 +0930
parents 23c96322cfb6
children 6ce8ed5ba76d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
1 #!/usr/bin/env python
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
2
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
3 # Copyright (c) 2024
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
4 # Daniel O'Connor <darius@dons.net.au>. All rights reserved.
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
5 #
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
6 # Redistribution and use in source and binary forms, with or without
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
7 # modification, are permitted provided that the following conditions
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
8 # are met:
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
9 # 1. Redistributions of source code must retain the above copyright
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
10 # notice, this list of conditions and the following disclaimer.
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
11 # 2. Redistributions in binary form must reproduce the above copyright
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
12 # notice, this list of conditions and the following disclaimer in the
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
13 # documentation and/or other materials provided with the distribution.
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
14 #
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
15 # THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
16 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
17 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
18 # ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
19 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
20 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
21 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
22 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
23 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
24 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
25 # SUCH DAMAGE.
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
26 #
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
27
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
28 import argparse
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
29 import math
81
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
30 import misc
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
31 import numpy
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
32 import os
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
33 import PIL
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
34 import rsib
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
35 import scipy
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
36 import scpi
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
37 import sys
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
38 import time
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
39
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
40 def setupsweep(r, rbw, vbw, centre = None, span = None, start = None, stop = None):
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
41 '''Helper function to set various sweep parameters'''
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
42 if centre is not None:
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
43 r.write('SENSE1:FREQ:CENT %f Hz' % (centre))
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
44 if span is not None:
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
45 r.write('SENSE1:FREQ:SPAN %f Hz' % (span))
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
46 if start is not None:
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
47 r.write('SENSE1:FREQ:START %f Hz' % (start))
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
48 if stop is not None:
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
49 r.write('SENSE1:FREQ:STOP %f Hz' % (stop))
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
50 if rbw is not None:
81
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
51 # Need to use FFT filters below 10Hz BW
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
52 if rbw < 10:
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
53 r.write('BAND:TYPE FFT')
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
54 else:
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
55 r.write('BAND:TYPE NORM')
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
56 r.write('SENS1:BAND:RES %f Hz' % (rbw))
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
57 if vbw is not None:
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
58 r.write('SENS1:BAND:VID %f Hz' % (vbw))
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
59
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
60 def dosweep(r, sweeps):
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
61 '''Helper function to trigger a sweep and wait for it to finish'''
81
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
62 tout = getsweeptime(r) * 5 * sweeps
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
63 if tout < 1:
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
64 tout = 1
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
65 #print('Sweep time', swt)
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
66
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
67 # Trigger the sweep
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
68 r.write('INIT;*WAI')
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
69
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
70 # Wait for it to be done
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
71 opc = int(r.ask('*OPC?', timeout = tout))
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
72 assert(opc == 1)
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
73
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
74 def findpeaks(r, maxpeak = 5, minpwr = None):
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
75 '''Ask instrument to find maxpeaks peaks and return a list of frequencies and powers'''
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
76 peaks_f = []
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
77 peaks_pwr = []
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
78 r.write('CALC:MARK1:MAX')
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
79 for i in range(maxpeak):
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
80 frq = float(r.ask('CALC:MARK1:X?'))
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
81 pwr = float(r.ask('CALC:MARK1:Y?'))
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
82 if minpwr is not None and pwr < minpwr:
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
83 break
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
84 if i > 0:
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
85 if frq == peaks_f[i - 1]:
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
86 break
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
87 peaks_f.append(frq)
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
88 peaks_pwr.append(pwr)
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
89 r.write('CALC:MARK1:MAX:NEXT')
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
90
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
91 return peaks_f, peaks_pwr
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
92
81
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
93 def getsweeptime(r):
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
94 '''Return sweep time in seconds'''
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
95 # According to the manual SWE:TIME works for both normal and FFT filters
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
96 # however in practise it doesn't get a response for FFT ones so we fake it
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
97
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
98 if r.ask('BAND:TYPE?').decode('ascii') == 'FFT':
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
99 return 5
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
100 else:
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
101 return float(r.ask('SWE:TIME?'))
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
102
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
103 def phasenoise(r, nominal, sweeps, atten, rlev, yscale, ssprefix):
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
104 '''Main function to find a signal, do some phase noise measurements and wideband sweeps'''
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
105 cpwrlim = -30
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
106 measurements = (
81
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
107 { 'offset' : 10, 'span' : 100, 'rbw' : 1, 'vbw' : 3 },
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
108 { 'offset' : 100, 'span' : 250, 'rbw' : 1, 'vbw' : 3 },
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
109 { 'offset' : 1e3, 'span' : 2.5e3, 'rbw' : 1, 'vbw' : 3 },
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
110 { 'offset' : 10e3, 'span' : 25e3, 'rbw' : 100, 'vbw' : 300 },
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
111 { 'offset' : 100e3, 'span' : 250e3, 'rbw' : 100, 'vbw' : 300 },
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
112 { 'offset' : 1e6, 'span' : 2.1e6, 'rbw' : 1e3, 'vbw' : 3e3 },
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
113 )
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
114 # Reset to defaults
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
115 r.write('*RST')
81
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
116 r.write('*CLS')
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
117
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
118 # Set to single sweep mode
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
119 r.write('INIT:CONT OFF')
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
120
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
121 # Enable display updates
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
122 r.write('SYST:DISP:UPD ON')
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
123
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
124 # Set attenuation
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
125 if atten is None:
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
126 r.write('INP:ATT AUTO')
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
127 else:
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
128 r.write('INP:ATT %s' % atten)
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
129
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
130 # Set Y scale
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
131 if yscale is not None:
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
132 r.write('DISP:TRAC:Y %s dB' % (yscale))
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
133
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
134 # Set reference level
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
135 if rlev is None:
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
136 r.write('DISP:WIND:TRAC:Y:RLEV AUTO')
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
137 else:
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
138 r.write('DISP:WIND:TRAC:Y:RLEV %f' % (rlev))
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
139
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
140 #
81
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
141 # Look from 100kHz down to 100Hz to narrow down the exact frequency
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
142 #
81
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
143 found = False
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
144 cmeas = nominal
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
145 for idx, span in enumerate((100e3, 10e3, 1e3, 100)):
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
146 setupsweep(r, span / 50, span / 50 * 3, centre = cmeas, span = span)
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
147 print('Looking for signal at %s+/-%s (%.1f seconds)' % (
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
148 misc.sifmt(nominal), misc.sifmt(span, dp = 1),
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
149 getsweeptime(r)))
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
150 # Do the sweep
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
151 dosweep(r, 1)
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
152
81
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
153 # Check the instrument is happy
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
154 status = int(r.ask('STAT:QUES:COND?'))
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
155 pwrstat = int(r.ask('STAT:QUES:POW:COND?'))
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
156 if status != 0 or pwrstat != 0:
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
157 # Dump a screenshot for debugging
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
158 screenshot(r, '%s-sweep-inst-warnings.png' % (ssprefix))
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
159 raise Exception('Instrument warning, status %s power status %s' %
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
160 (bin(status), bin(pwrstat)))
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
161 # Find the peak
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
162 r.write('CALC:MARK1 ON')
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
163 r.write('CALC:MARK1:MAX')
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
164 cpwr = float(r.ask('CALC:MARK1:Y?'))
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
165 if cpwr < cpwrlim:
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
166 # Dump a screenshot for debugging
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
167 screenshot(r, '%s-sweep-no-power.png' % (ssprefix))
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
168 raise Exception('Power too low / not found: %.1f dBm vs %.1f dBm' % (cpwr, cpwrlim))
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
169 else:
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
170 found = True
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
171 cmeas = float(r.ask('CALC:MARK1:X?'))
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
172 print('Found signal at %s with power %.1f dBm' % (misc.sifmt(cmeas, dp = 6), cpwr))
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
173
81
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
174 if not found:
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
175 print('Unable to find signal')
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
176 # Centre peak
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
177 r.write('CALC:MARK1:FUNC:CENT')
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
178
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
179 # Set number of sweeps
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
180 r.write('SWE:COUN %d' % (sweeps))
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
181
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
182 # Enable phase noise measurement
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
183 r.write('CALC:MARK:AOFF')
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
184 r.write('CALC:DELT1:FUNC:PNO')
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
185
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
186 for idx, m in enumerate(measurements):
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
187 # Setup measurement
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
188 setupsweep(r, m['rbw'], m['vbw'], span = m['span'])
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
189 # Do the sweep
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
190 dosweep(r, sweeps)
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
191
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
192 # Set offset of phase noise measurement
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
193 r.write('CALC:MARK1:MAX')
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
194 r.write('CALC:DELT1:MOD REL')
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
195 r.write('CALC:DELT1:X %f Hz' % (m['offset']))
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
196 meas = float(r.ask('CALC:DELT:FUNC:PNO:RES?'))
81
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
197 print('Offset %7s %7.2f dBc/Hz' % (misc.sifmt(m['offset'], dp = 0), meas))
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
198
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
199 # Take screen shot and save it
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
200 if ssprefix is not None:
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
201 screenshot(r, '%s-%d_%s_offset.png' % (
81
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
202 ssprefix, idx, misc.sifmt(m['offset'], dp = 0, sp = '')))
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
203
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
204 # Do a wide band scan
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
205 if ssprefix is not None:
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
206 start = 1e6
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
207 stop = 100e6
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
208 setupsweep(r, 1e3, 3e3, start = start, stop = stop)
81
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
209 print('Scanning %s - %s (%.1f seconds)' % (misc.sifmt(start, dp = 0), misc.sifmt(stop, dp = 0),
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
210 getsweeptime(r)))
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
211 dosweep(r, sweeps)
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
212 # Show peaks
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
213 r.write('CALC:MARK:AOFF')
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
214 for i, (f, p) in enumerate(zip(*findpeaks(r, 4))):
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
215 r.write('CALC:MARK%d:X %f Hz' % (i + 1, f))
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
216 screenshot(r, '%s-sweep-%.1f-%.1fMHz.png' % (
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
217 ssprefix, start / 1e6, stop / 1e6))
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
218
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
219 # Look from just before signal to just after second harmonic
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
220 start = nominal * 0.9
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
221 stop = 2 * nominal + nominal * 0.1
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
222 setupsweep(r, 1e3, 3e3, start = start, stop = stop)
81
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
223 print('Scanning %s - %s (%.1f seconds)' % (misc.sifmt(start, dp = 0), misc.sifmt(stop, dp = 0),
1947d10f9395 - Search for signal frequency iteratively to improve accuracy.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 77
diff changeset
224 getsweeptime(r)))
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
225 dosweep(r, sweeps)
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
226 # Show peaks
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
227 r.write('CALC:MARK:AOFF')
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
228 for i, (f, p) in enumerate(zip(*findpeaks(r, 4))):
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
229 r.write('CALC:MARK%d:X %f Hz' % (i + 1, f))
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
230 screenshot(r, '%s-sweep-%.1f-%.1fMHz.png' % (
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
231 ssprefix, start / 1e6, stop / 1e6))
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
232
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
233 def screenshot(r, ssname, sapath = '\'c:\\temp\\pntmp.bmp\''):
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
234 # Setup & take screen shot
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
235 r.write('HCOPY:DEV:LANG1 BMP')
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
236 r.write('HCOPY:DEST1 MMEM')
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
237 r.write('HCOPY:CMAP:DEF2')
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
238 r.write('HCOPY:ITEM:ALL')
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
239 r.write('MMEM:NAME %s' % (sapath,))
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
240 r.write('HCOPY:IMM1')
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
241 time.sleep(5)
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
242
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
243 # Grab it
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
244 r.write('MMEM:DATA? %s' % (sapath,))
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
245 bmpdat = scpi.getbin(r.read())
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
246 bmpname = ssname[0:-4] + '.bmp'
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
247
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
248 # Convert to whatever format
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
249 open(bmpname, 'wb').write(bmpdat)
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
250 img = PIL.Image.open(bmpname)
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
251 img.save(ssname)
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
252 os.unlink(bmpname)
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
253 r.write('MMEM:DEL %s' % (sapath,))
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
254
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
255 if __name__ == '__main__':
77
23c96322cfb6 Spell Rohde Schwarz correctly.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 76
diff changeset
256 parser = argparse.ArgumentParser(description = 'Configures a Rohde Schwarz FSP7 spectrum analyser to do a phase noise measurement')
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
257 parser.add_argument('-a', '--atten', default = None, help = 'Attenuation level (default: autoamatic)')
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
258 parser.add_argument('-r', '--rlevel', default = 10, help = 'Reference level (default: %default dBm)', type = float)
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
259 parser.add_argument('-s', '--ssprefix', default = None, help = 'Path name to save screenshots to (default: none)', type = str)
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
260 parser.add_argument('-w', '--sweeps', default = 1, help = 'Number of sweeps (default: %default)', type = int)
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
261 parser.add_argument('-y', '--yscale', default = 120, help = 'Y-scale extent (default: %default dB)', type = float)
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
262 parser.add_argument('address', help = 'Address of analyser', type = str)
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
263 parser.add_argument('nominal', help = 'Nominal frequency of measurement (Hz)', type = float)
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
264
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
265 args = parser.parse_args()
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
266
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
267 # Connect to the analyser
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
268 r = rsib.RSIBDevice(args.address)
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
269
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
270 # ID instrument
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
271 print('Device ID is', r.ask('*IDN?').decode('ascii'))
74
b6ebe05f250f Add some commentry about what it works with
Daniel O'Connor <doconnor@gsoft.com.au>
parents:
diff changeset
272
76
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
273 # Do measurements
e2bb136bd2ed Add script to use FSP7 to perform phasenoise measurements.
Daniel O'Connor <doconnor@gsoft.com.au>
parents: 74
diff changeset
274 phasenoise(r, args.nominal, args.sweeps, args.atten, args.rlevel, args.yscale, args.ssprefix)