CygnusRFI/CygnusRFI.py

172 lines
5.0 KiB
Python
Executable File

#!/usr/bin/env python
import os
import sys
import argparse
from time import sleep
# Define argparse arguments
parser = argparse.ArgumentParser()
parser.add_argument("-b", "--bandwidth", type=str, required=True)
parser.add_argument("-c", "--channels", type=str, default=1024)
parser.add_argument("-t", "--t_int", type=str, default=0.1)
parser.add_argument("-d", "--duration", type=str, required=True)
parser.add_argument("-f", "--fmin", type=float, required=True)
parser.add_argument("-F", "--fmax", type=float, required=True)
args = parser.parse_args()
bandwidth = args.bandwidth
channels = args.channels
t_int = args.t_int
duration = args.duration
fmin = args.fmin
fmax = args.fmax
# Define GRC observation parameters
bandwidth = str(bandwidth)
channels = str(channels)
t_int = str(t_int)
duration = str(duration)
fmin = float(fmin)
fmax = float(fmax)
nbins = str(int(float(t_int) * float(bandwidth) / float(channels)))
# Delete pre-existing observation.dat file
for file_name in os.listdir("."):
if file_name.endswith(".dat"):
try:
os.remove(file_name)
except OSError:
pass
try:
os.remove("rfi_plot.png")
except OSError:
pass
print(
"\n\033[1;33;48m+=================================================================+"
)
print(
"\033[1;33;48m| \033[1;36;48mCygnusRFI\033[1;33;48m:\033[1;32;48m An open-source Radio Frequency Interference analyzer\033[1;33;48m |"
)
print(
"\033[1;33;48m+=================================================================+"
)
sleep(0.5)
print("\n\033[1;33;48m\033[4;33;48mRFI Measurement Parameters:\033[0;32;48m")
sleep(0.15)
print(
(
"\033[1;32;48mFrequency range to scan: \033[1;36;48m"
+ str(float(fmin) / 1000000)
+ "-"
+ str(float(fmax) / 1000000)
+ " MHz"
)
)
sleep(0.15)
print(
(
"\033[1;32;48mBandwidth per spectrum: \033[1;36;48m"
+ str(float(bandwidth) / 1000000)
+ " MHz"
)
)
sleep(0.15)
print(("\033[1;32;48mIntegration time per spectrum: \033[1;36;48m" + duration + " sec"))
sleep(0.15)
print(
(
"\033[1;32;48mNumber of channels per spectrum (FFT Size should be a power of 2): \033[1;36;48m"
+ str(channels)
)
)
sleep(0.15)
print(("\033[1;32;48mIntegration time per FFT sample: \033[1;36;48m" + t_int + " sec"))
sleep(0.5)
print(
(
"\n\033[1;32;48mEstimated completion time: \033[1;36;48m"
+ str(float(duration) * float(fmax - fmin) / float(bandwidth))
+ " sec"
)
)
sleep(0.5)
# proceed = eval(input("\n\033[1;36;48mProceed to measurement? [Y/n]: \033[1;33;48m"))
proceed = "Y"
if proceed.lower() != "n" and proceed.lower() != "no":
print(
"\n\033[1;33;48m+=================================================================+"
)
print(
"\033[1;33;48m| [+] \033[1;32;48m Starting measurement...\033[1;33;48m |"
)
print(
"\033[1;33;48m+=================================================================+\n"
)
q = 0
for freq in range(int(fmin), int(fmax), int(float(bandwidth))):
print(
(
"\033[1;33;48m\n---------------------------------------------------------------------------\n \033[1;33;48m[*] \033[1;32;48mCurrently monitoring f_center = "
+ str(0.000001 * freq)
+ " +/- "
+ str(float(float(bandwidth) * 0.000001) / 2)
+ " MHz (iteration: "
+ str(q)
+ ")...\n\033[1;33;48m---------------------------------------------------------------------------"
)
)
# Define observation frequency
f_center = str(freq)
# Execute top_block.py with parameters
print("\033[0m")
sys.argv = [
"top_block.py",
"--c-freq=" + f_center,
"--samp-rate=" + bandwidth,
"--nchan=" + channels,
"--nbin=" + nbins,
"--obs-time=" + duration,
]
exec(compile(open("top_block.py", "rb").read(), "top_block.py", "exec"))
os.rename("observation.dat", str(q) + ".dat")
q = q + 1
print(
"\n\033[1;33;48m+=================================================================+"
)
print(
"\033[1;33;48m| \033[1;32;48mMeasurement finished!\033[1;33;48m |"
)
print(
"\033[1;33;48m+=================================================================+\n"
)
f_center = str(fmin)
sys.argv = [
"rfi_plotter.py",
"freq=" + f_center,
"samp_rate=" + bandwidth,
"nchan=" + channels,
"nbin=" + nbins,
"n=" + str(q),
"dur=" + duration,
"fminimum=" + str(fmin),
"fmaximum=" + str(fmax),
]
exec(compile(open("rfi_plotter.py", "rb").read(), "rfi_plotter.py", "exec"))
print(
"\033[1;32;48mYour data has been saved as \033[1;36;48mrfi_plot.png\033[1;32;48m."
)
else:
print("\n\033[1;31;48m[!] Exiting...\n")