File size: 2,706 Bytes
9d9c655 5fd585e 9d9c655 5fd585e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | import gradio as gr
import torch
import torch.nn as nn
import numpy as np
from huggingface_hub import PyTorchModelHubMixin
MODULATION_TYPES = ["8PSK", "AM-DSB", "AM-SSB", "BPSK", "CPFSK", "GFSK", "PAM4", "QAM16", "QAM64", "QPSK", "WBFM"]
class ModulationClassifier(
nn.Module,
PyTorchModelHubMixin,
library_name="modulation-classifier",
pipeline_tag="tabular-classification",
license="cc-by-nc-sa-4.0",
):
def __init__(self, num_classes: int = 11, input_channels: int = 2, input_length: int = 128):
super().__init__()
self.conv1 = nn.Conv1d(input_channels, 64, kernel_size=8, padding="same")
self.relu1 = nn.ReLU()
self.pool1 = nn.MaxPool1d(2)
self.conv2 = nn.Conv1d(64, 128, kernel_size=5, padding="same")
self.relu2 = nn.ReLU()
self.pool2 = nn.MaxPool1d(2)
self.flatten = nn.Flatten()
self.fc1 = nn.Linear(128 * (input_length // 4), 256)
self.relu3 = nn.ReLU()
self.dropout = nn.Dropout(0.5)
self.fc2 = nn.Linear(256, num_classes)
def forward(self, x):
x = self.pool1(self.relu1(self.conv1(x)))
x = self.pool2(self.relu2(self.conv2(x)))
x = self.flatten(x)
x = self.dropout(self.relu3(self.fc1(x)))
x = self.fc2(x)
return x
model = ModulationClassifier.from_pretrained("tandrewu1/5G-Signal-Modulation-Classifier")
model.eval()
def predict(iq_text):
try:
lines = iq_text.strip().split("\n")
i_samples = [float(x) for x in lines[0].split(",")]
q_samples = [float(x) for x in lines[1].split(",")]
if len(i_samples) != 128 or len(q_samples) != 128:
return {"Error": 1.0}
iq_data = np.array([[i_samples, q_samples]], dtype=np.float32)
tensor_input = torch.tensor(iq_data)
with torch.no_grad():
output = model(tensor_input)
probabilities = torch.nn.functional.softmax(output[0], dim=0)
result = {MODULATION_TYPES[i]: prob.item() for i, prob in enumerate(probabilities)}
return result
except Exception as e:
return {"Error": 1.0}
demo = gr.Interface(
fn=predict,
inputs=gr.Textbox(
label="IQ Samples (line 1: 128 I values comma-separated, line 2: 128 Q values comma-separated)",
lines=4,
placeholder="0.01, -0.03, 0.05, ...\n0.02, 0.01, -0.04, ...",
),
outputs=gr.Label(label="Predicted Modulation", num_top_classes=5),
title="5G Signal Modulation Classifier",
description="Classify radio signal modulation type from raw IQ samples. Paste 128 I-channel values on line 1 and 128 Q-channel values on line 2.",
)
if __name__ == "__main__":
demo.launch() |