Beispiel #1
0
def cmd_validate(args):
    """
    validate
    """
    try:
        smffile = SigMFFile(open(args.filename).read())
    except ValueError as ex:
        print(str(ex))
        return False
    res = smffile.validate()
    if not res:
        print(str(res))
def test_invalid_capture_sequence():
    '''metadata must have captures in order'''
    invalid_metadata = dict(TEST_METADATA)
    invalid_metadata[SigMFFile.CAPTURE_KEY] = [{
        SigMFFile.START_INDEX_KEY: 10
    }, {
        SigMFFile.START_INDEX_KEY: 9
    }]
    assert not SigMFFile(invalid_metadata).validate()
def test_invalid_hash():
    '''metadata must have captures in order'''
    invalid_metadata = dict(TEST_METADATA)
    invalid_metadata[SigMFFile.GLOBAL_KEY][SigMFFile.HASH_KEY] = 'derp'
    temp_path = tempfile.mkstemp()[1]
    TEST_FLOAT32_DATA.tofile(temp_path)
    try:
        SigMFFile(metadata=invalid_metadata, data_file=temp_path)
    except sigmf.error.SigMFFileError:
        # this should occur since the hash is wrong
        pass
    else:
        # this only happens if no error occurs
        assert False
def test_invalid_annotation_sequence():
    '''metadata must have annotations in order'''
    invalid_metadata = dict(TEST_METADATA)
    invalid_metadata[SigMFFile.ANNOTATION_KEY] = [{
        SigMFFile.START_INDEX_KEY:
        2,
        SigMFFile.LENGTH_INDEX_KEY:
        120000,
        SigMFFile.COMMENT_KEY:
        "stuff"
    }, {
        SigMFFile.START_INDEX_KEY:
        1,
        SigMFFile.LENGTH_INDEX_KEY:
        120000,
        SigMFFile.COMMENT_KEY:
        "stuff"
    }]
    assert not SigMFFile(invalid_metadata).validate()
def test_valid_data():
    assert SigMFFile(TEST_METADATA).validate()
def createSignal(metafile, binfile):
    # Load a dataset
    with open(metafile, 'r') as f:
        metadata = json.loads(f.read())
    signal = SigMFFile(metadata=metadata['_metadata'], data_file=binfile)
    return signal
Beispiel #7
0
 def __init__(self):
     self.sigmf_md = SigMFFile()
     self.sigmf_md.set_global_info(GLOBAL_INFO.copy())
Beispiel #8
0
class SigMFBuilder:
    def __init__(self):
        self.sigmf_md = SigMFFile()
        self.sigmf_md.set_global_info(GLOBAL_INFO.copy())

    @property
    def metadata(self):
        return self.sigmf_md._metadata

    def set_data_type(self, is_complex):
        if is_complex:
            self.sigmf_md.set_global_field(
                "core:datatype", "cf32_le"
            )  # 2x 32-bit float, Little Endian
        else:
            self.sigmf_md.set_global_field(
                "core:datatype", "rf32_le"
            )  # 32-bit float, Little Endian

    def set_sample_rate(self, sample_rate):
        self.sigmf_md.set_global_field("core:sample_rate", sample_rate)

    def set_recording(self, recording_id):
        self.sigmf_md.set_global_field("ntia-scos:recording", recording_id)

    def set_measurement(
        self, start_time, end_time, domain, measurement_type, frequency
    ):
        self.sigmf_md.set_global_field(
            "ntia-core:measurement",
            {
                "time_start": start_time,
                "time_stop": end_time,
                "domain": domain.value,
                "measurement_type": measurement_type.value,
                "frequency_tuned_low": frequency,
                "frequency_tuned_high": frequency,
            },
        )

    def set_sensor(self, sensor):
        self.sigmf_md.set_global_field("ntia-sensor:sensor", sensor)

    def set_task(self, task_id):
        self.sigmf_md.set_global_field("ntia-scos:task", task_id)

    def set_action(self, name, description, summary):
        self.sigmf_md.set_global_field(
            "ntia-scos:action",
            {"name": name, "description": description, "summary": summary,},
        )

    def set_schedule(self, schedule_entry_json):
        self.sigmf_md.set_global_field("ntia-scos:schedule", schedule_entry_json)

    def set_coordinate_system(self, coordinate_system=get_coordinate_system_sigmf()):
        self.sigmf_md.set_global_field(
            "ntia-location:coordinate_system", coordinate_system
        )

    def set_capture(self, frequency, capture_time):
        capture_md = {
            "core:frequency": frequency,
            "core:datetime": capture_time,
        }

        self.sigmf_md.add_capture(start_index=0, metadata=capture_md)

    def add_frequency_domain_detection(
        self,
        start_index,
        fft_size,
        enbw,
        detector,
        num_ffts,
        window,
        units,
        reference,
        frequency_start,
        frequency_stop,
        frequency_step,
    ):
        metadata = {
            "ntia-core:annotation_type": "FrequencyDomainDetection",
            "ntia-algorithm:number_of_samples_in_fft": fft_size,
            "ntia-algorithm:window": window,
            "ntia-algorithm:equivalent_noise_bandwidth": enbw,
            "ntia-algorithm:detector": detector,
            "ntia-algorithm:number_of_ffts": num_ffts,
            "ntia-algorithm:units": units,
            "ntia-algorithm:reference": reference,
            "ntia-algorithm:frequency_start": frequency_start,
            "ntia-algorithm:frequency_stop": frequency_stop,
            "ntia-algorithm:frequency_step": frequency_step,
        }
        self.add_annotation(start_index, fft_size, metadata)

    def add_time_domain_detection(
        self, start_index, num_samples, detector, units, reference
    ):
        time_domain_detection_md = {
            "ntia-core:annotation_type": "TimeDomainDetection",
            "ntia-algorithm:detector": detector,
            "ntia-algorithm:number_of_samples": num_samples,
            "ntia-algorithm:units": units,
            "ntia-algorithm:reference": reference,
        }
        self.add_annotation(start_index, num_samples, time_domain_detection_md)

    def add_annotation(self, start_index, length, annotation_md):
        self.sigmf_md.add_annotation(
            start_index=start_index, length=length, metadata=annotation_md
        )

    def add_sensor_annotation(
        self, start_index, length, overload=None, gain=None, attenuation=None
    ):
        metadata = {"ntia-core:annotation_type": "SensorAnnotation"}
        if overload is not None:
            metadata["ntia-sensor:overload"] = overload
        if gain is not None:
            metadata["ntia-sensor:gain_setting_sigan"] = gain
        if attenuation is not None:
            metadata["ntia-sensor:attenuation_setting_sigan"] = attenuation
        self.add_annotation(start_index, length, metadata)

    def set_last_calibration_time(self, last_cal_time):
        self.sigmf_md.set_global_field(
            "ntia-sensor:calibration_datetime", last_cal_time
        )