asataura's picture
initial commit
6fa23b0
raw
history blame
3.82 kB
#!/usr/bin/env python
# coding:utf-8
"""
name : dataset.py,
version : 1.0.0,
url : https://github.com/abubakar-sani/RFF,
license : MIT License,
copyright : Copyright 2021 by Abubakar Sani Ali, Khalifa University,
author : Abubakar Sani Ali,
email : [email protected],
date : 9/5/2022,
description : Dataset module that returns the processed data,
"""
import math
import os
import numpy as np
import pandas as pd
import json
base_dir = os.path.abspath('')
raw_dir = f'{base_dir}/datasets/raw/spectral_scans_QC9880_ht20_background'
processed_dir = f'{base_dir}/datasets/processed/spectral_scans_QC9880_ht20_background'
def load_spectral_scans(jammer, jammed_freq, jammer_dist, jamming_power, channels, n_features, n_scans=10):
if jammer == 'combined':
scenario = f'samples_chamber_{jammer_dist}cm_{jamming_power}dBm'
elif jammer == 'none':
interference = np.random.choice(['high', 'medium', 'low'], p=[0.4, 0.4, 0.2])
if interference == 'high':
scenario = f'samples_office_None'
elif interference == 'low':
scenario = f'samples_lab_None'
else:
scenario = f'samples_chamber_None'
else:
scenario = f'samples_chamber_{jammed_freq}MHz_{jammer_dist}cm_{jamming_power}dBm'
# Process the dataset and generate the raw numpy (to processing it every run)
if not os.path.isfile(f'{processed_dir}/{scenario}.npy'):
spectral_data = []
for channel in channels:
channel_data = np.empty((0, n_features), int)
for scan in range(n_scans):
if jammer == 'combined':
scenario = f'samples_chamber_{channel}MHz_{jammer_dist}cm_{jamming_power}dBm'
df = pd.read_csv(f'{raw_dir}/{scenario}_{scan}.csv')
temp_data = df.where(df['freq1'] == channel).dropna()
temp_data = temp_data.to_numpy()
channel_data = np.append(channel_data, temp_data, axis=0)
spectral_data.append(channel_data)
if not os.path.exists(processed_dir):
os.makedirs(processed_dir)
if jammer == 'combined':
scenario = f'samples_chamber_{jammer_dist}cm_{jamming_power}dBm'
np.save(f'{processed_dir}/{scenario}', np.array(spectral_data, dtype='object'))
spectral_data = np.load(f'{processed_dir}/{scenario}.npy', allow_pickle=True)
return spectral_data
def get_feats_dirs(scenario, scan=1):
spectral_df = pd.read_csv(f'{raw_dir}/{scenario}_{scan}.csv')
features = spectral_df.columns
n_features = len(features)
return features, n_features
def process_data(data, channels, length, stride, time_step, mode=0):
if mode == 0:
min_len = len(data[0])
for i in range(len(data)):
min_len = len(data[i]) if len(data[i]) < min_len else min_len
t_samples = min_len
else:
t_samples = len(data)
n_samples = math.floor((t_samples - length) / stride)
if mode == 1:
# Breaking data into batches
data = data[0:t_samples]
batches = []
for sample in range(n_samples):
batch = []
for i in range(length):
batch_sample = data[(sample * stride) + i]
batch.append(batch_sample)
batches.append(batch)
else:
batches = []
for sample in range(n_samples):
batch = []
for i in range(len(channels)):
channel_data = data[i]
channel_samples = channel_data[(sample * stride):(length + (sample * stride)), :]
batch.append(channel_samples)
batches.append(batch)
processed_data = np.array(batches[time_step % len(batches)])
return processed_data