<<<<<<< HEAD
Disciplina: ES413 - Sinais e Sistemas
Instituição: Cin/UFPE
Objetivo: Detecção de ataques de spoofing em sinais GPS usando processamento de sinais e machine learning
- Visão Geral
- Estrutura do Projeto
- Instalação
- Uso Rápido
- Datasets
- Pipeline Completa
- Módulos
- Notebooks
- Testes
- Documentação
- Contribuindo
Este projeto implementa uma pipeline completa para detecção de spoofing em sinais GPS L1 C/A, incluindo:
- Pré-processamento robusto: Normalização, filtragem, remoção de DC, windowing
- Extração de features: Métricas de correlação (FWHM, P/S ratio, assimetria), C/N0, features temporais
- Classificação: Random Forest, SVM, MLP com tratamento de desbalanceamento
- Avaliação: Métricas completas (accuracy, precision, recall, F1, ROC-AUC)
- Visualizações: Confusion matrix, ROC curves, feature distributions
Diferencial: Todas as decisões técnicas são fundamentadas em conceitos de Sinais e Sistemas (veja DECISIONS.md).
SinaisProject/
├── data/ # Dados GPS (não versionados)
│ └── .gitkeep
├── docs/ # Documentação
│ └── DECISIONS.md # Justificativas técnicas detalhadas
├── notebooks/ # Jupyter notebooks
│ ├── EDA.ipynb # Análise exploratória
│ ├── feature_demo.ipynb # Demonstração de features
│ └── training_eval.ipynb # Treinamento e avaliação
├── scripts/ # Scripts executáveis
│ └── run_pipeline.py # Pipeline completa
├── src/ # Código fonte
│ ├── preprocessing/ # Pré-processamento de sinais
│ │ ├── signal_io.py # Leitura de sinais (bin, csv, mat)
│ │ ├── normalization.py # Normalização e remoção DC
│ │ ├── filtering.py # Filtros passa-banda, notch
│ │ ├── windowing.py # Segmentação
│ │ ├── cn0_estimation.py # Estimação C/N0
│ │ └── resampling.py # Reamostragem
│ ├── features/ # Extração de features
│ │ ├── correlation.py # Correlação cruzada/auto
│ │ ├── correlation_features.py # Features do perfil (FWHM, P/S, etc)
│ │ ├── temporal_features.py # Features temporais
│ │ └── feature_pipeline.py # Pipeline de features
│ ├── models/ # Modelos de classificação
│ │ ├── classifiers.py # Random Forest, SVM, MLP
│ │ ├── training.py # Treinamento (com/sem SMOTE)
│ │ ├── evaluation.py # Métricas e avaliação
│ │ └── persistence.py # Save/load modelos
│ └── utils/ # Utilitários
│ ├── plots.py # Visualizações
│ └── synthetic_data.py # Gerador de dados sintéticos
├── tests/ # Testes unitários
├── results/ # Resultados (não versionados)
├── requirements.txt # Dependências Python
├── environment.yml # Ambiente conda
└── README.md # Este arquivo
# Clone o repositório
git clone https://github.com/BlackSardes/SinaisProject.git
cd SinaisProject
# Crie ambiente virtual
python3 -m venv venv
source venv/bin/activate # Linux/Mac
# ou
venv\Scripts\activate # Windows
# Instale dependências
pip install -r requirements.txt# Clone o repositório
git clone https://github.com/BlackSardes/SinaisProject.git
cd SinaisProject
# Crie ambiente conda
conda env create -f environment.yml
conda activate gps-spoofing- Essenciais: numpy, scipy, pandas, scikit-learn, matplotlib, seaborn
- ML Avançado: imbalanced-learn (SMOTE)
- Persistência: joblib
- Notebooks: jupyter
- Testes: pytest
Nota: TensorFlow/Keras e librosa estão comentados em requirements.txt e environment.yml (dependências pesadas opcionais).
# Pipeline completa com dados sintéticos
python scripts/run_pipeline.py --synthetic --n-authentic 200 --n-spoofed 200
# Com SMOTE para balanceamento
python scripts/run_pipeline.py --synthetic --use-smote
# Escolher modelo diferente
python scripts/run_pipeline.py --synthetic --model svmSaída: Modelo treinado, relatório de avaliação, visualizações em results/
# Gerar dados sintéticos
from src.utils.synthetic_data import generate_synthetic_dataset
signals, labels = generate_synthetic_dataset(n_authentic=100, n_spoofed=100)
# Extrair features
from src.features.feature_pipeline import build_feature_vector
features_df = build_feature_vector(signals, fs=5e6, prn=1)
features_df['label'] = labels
# Treinar modelo
from src.models.training import train_model
X = features_df.drop(['segment_id', 'label'], axis=1).values
y = features_df['label'].values
model, info = train_model(X, y, model_name='random_forest')
# Avaliar
from src.models.evaluation import evaluate_model
metrics = evaluate_model(model, info['X_test'], info['y_test'])
print(f"Accuracy: {metrics['test_accuracy']:.3f}")O projeto inclui gerador de sinais GPS sintéticos para testes:
- Código C/A válido
- Ruído Gaussiano
- Opção de adicionar sinal de spoofing com delay e potência configuráveis
from src.utils.synthetic_data import generate_synthetic_gps_signal
# Sinal autêntico
signal_auth = generate_synthetic_gps_signal(duration_s=0.5, cn0_db=45)
# Sinal com spoofing
signal_spoof = generate_synthetic_gps_signal(
duration_s=0.5, cn0_db=45, add_spoofing=True,
spoofing_delay_chips=0.3, spoofing_power_ratio=2.0
)Para usar dados reais, baixe o FGI-SpoofRepo:
-
Download: https://github.com/nlsfi/FGI-GSRx/tree/master/Spoofing%20Dataset
-
Estrutura recomendada:
data/
└── FGI-SpoofRepo/
├── scenario1/
│ ├── signal_authentic.bin
│ └── signal_spoofed.bin
├── scenario2/
└── ...
-
Parâmetros típicos:
- Formato: int16 interleaved I/Q
- Taxa de amostragem: 5-26 MHz (varia por cenário)
- PRNs: múltiplos (1-32)
-
Carregar sinal:
from src.preprocessing.signal_io import load_signal
signal = load_signal(
'data/FGI-SpoofRepo/scenario1/signal.bin',
file_format='binary',
count_samples=int(0.5 * 5e6) # 0.5s @ 5 MHz
)Nota: Implementar rotulagem automática baseada em timestamps do FGI (veja docs/DECISIONS.md seção 7).
A pipeline segue estas etapas:
1. Carregamento/Geração de Sinais
↓
2. Pré-processamento
- Normalização de potência
- Remoção DC
- Filtragem (opcional)
↓
3. Segmentação (Windowing)
- Janelas de 0.5-1s
- Overlap de 50%
↓
4. Extração de Features
- Correlação com código C/A
- Features do perfil: FWHM, P/S ratio, assimetria
- C/N0 e variação temporal
- Features estatísticas
↓
5. Pré-processamento de Features
- Imputação de valores faltantes
- Padronização (StandardScaler)
- PCA (opcional)
↓
6. Treinamento
- Random Forest (class_weight='balanced')
- Opção: SMOTE para balanceamento
- Validação cruzada
↓
7. Avaliação
- Métricas: accuracy, precision, recall, F1, ROC-AUC
- Confusion matrix
- Feature importance
↓
8. Persistência
- Salvar modelo (.pkl)
- Salvar metadados (.json)
- Salvar visualizações
Funções de pré-processamento de sinais GPS:
load_signal(): Carrega sinais de múltiplos formatos (.bin, .csv, .mat)normalize_signal(): Normalização de potênciabandpass_filter(): Filtro passa-banda Butterworthwindow_segment(): Segmentação em janelasestimate_cn0_from_correlation(): Estimação de C/N0
Extração de features para classificação:
compute_cross_correlation(): Correlação rápida via FFTextract_correlation_features(): FWHM, P/S ratio, assimetria, etc.extract_temporal_features(): Features estatísticas do sinalbuild_feature_vector(): Pipeline completa de features
Treinamento e avaliação de modelos:
train_model(): Treina Random Forest/SVM/MLPtrain_with_smote(): Treina com balanceamento SMOTEevaluate_model(): Métricas completassave_model(),load_model(): Persistência
Utilitários e visualizações:
plot_confusion_matrix(): Matriz de confusãoplot_roc_curves(): Curvas ROCplot_feature_distributions(): Distribuição de features por classegenerate_synthetic_gps_signal(): Gerador de sinais sintéticos
- Visualização de sinais GPS
- Análise de perfis de correlação
- Distribuição de features
- Comparação autêntico vs spoofed
- Extração passo-a-passo de features
- Visualização de FWHM, P/S ratio
- Análise de sensibilidade
- Interpretação física
- Treinamento de múltiplos modelos
- Comparação de performance
- Análise de feature importance
- Tuning de hiperparâmetros
A robust machine learning pipeline for detecting GPS spoofing attacks using signal processing and classification techniques. This project was developed for the Signals and Systems (ES413) course.
- Overview
- Features
- Installation
- Project Structure
- Quick Start
- Usage
- Documentation
- Contributing
- License
GPS spoofing is a security threat where false GPS signals are transmitted to deceive receivers. This project implements a complete pipeline for detecting such attacks by analyzing:
- Correlation peak distortions: Spoofing creates multiple peaks or asymmetric patterns
- Power anomalies: Spoofing signals often have higher power (C/N0) than authentic signals
- Statistical features: Distribution changes in signal properties
The pipeline uses machine learning models (Random Forest, SVM, Neural Networks) trained on features extracted from GPS signal correlation functions.
- Multi-format signal loading (binary, MATLAB, CSV, synthetic)
- GPS C/A code generation for all PRN satellites (1-32)
- Comprehensive preprocessing pipeline:
- DC offset removal
- Frequency correction (Doppler/IF)
- Interference mitigation (pulse blanking, frequency domain)
- Bandpass and notch filtering
- Signal normalization
-
Correlation-based features:
- Peak-to-secondary ratio
- Full Width at Half Maximum (FWHM)
- Peak asymmetry
- Skewness and kurtosis
- Energy distribution
-
Power metrics:
- C/N0 estimation
- SNR calculation
- Noise floor analysis
-
Statistical features:
- Distribution moments
- Spectral characteristics
- Temporal patterns
- Multiple model support (Random Forest, SVM, MLP)
- Class imbalance handling (SMOTE, class weights)
- Stratified cross-validation
- Comprehensive evaluation metrics
- Model persistence (save/load)
- Correlation profile plots
- Feature distribution analysis
- Confusion matrices
- ROC curves
- Feature importance rankings
- C/N0 temporal evolution
- Python 3.9 or higher
- pip or conda package manager
# Clone the repository
git clone https://github.com/BlackSardes/SinaisProject.git
cd SinaisProject
# Create virtual environment (recommended)
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt# Clone the repository
git clone https://github.com/BlackSardes/SinaisProject.git
cd SinaisProject
# Create conda environment
conda env create -f environment.yml
conda activate sinaisprojectSinaisProject/
├── data/ # Data directory (gitignored)
│ ├── raw/ # Raw signal files
│ └── processed/ # Processed features
├── notebooks/ # Jupyter notebooks
│ ├── 01_exploratory_analysis.ipynb
│ ├── 02_feature_extraction_demo.ipynb
│ └── 03_model_training_evaluation.ipynb
├── src/ # Source code
│ ├── preprocessing/ # Signal preprocessing
│ │ ├── signal_io.py # I/O operations
│ │ ├── signal_processing.py # Processing functions
│ │ ├── prn_codes.py # PRN code generation
│ │ └── pipeline.py # Complete pipeline
│ ├── features/ # Feature extraction
│ │ ├── correlation.py # Correlation features
│ │ ├── statistical.py # Statistical features
│ │ └── pipeline.py # Feature pipeline
│ ├── models/ # Machine learning models
│ │ ├── training.py # Training functions
│ │ └── evaluation.py # Evaluation metrics
│ └── utils/ # Utilities
│ └── plots.py # Visualization functions
├── tests/ # Unit tests
├── scripts/ # Executable scripts
│ └── run_pipeline.py # End-to-end pipeline
├── docs/ # Documentation
│ └── DECISIONS.md # Technical decisions
├── requirements.txt # Python dependencies
├── environment.yml # Conda environment
└── README.md # This file
from src.preprocessing.signal_io import generate_synthetic_signal
from src.preprocessing.pipeline import preprocess_signal
from src.features.pipeline import extract_features_from_segment
# Generate synthetic GPS signal
signal = generate_synthetic_signal(
num_samples=50000,
fs=5e6,
snr_db=10.0,
prn=1,
add_spoofing=True
)
# Preprocess
signal_processed = preprocess_signal(signal, fs=5e6)
# Extract features
features = extract_features_from_segment(
signal_processed,
fs=5e6,
prn=1
)
print(f"Extracted {len(features)} features")from src.features.pipeline import extract_features_from_file
# Define labeling function (TEXBAT dataset example)
def label_func(time_s):
return 1 if time_s >= 17.0 else 0 # Spoofing starts at 17s
# Extract features from entire file
features_df = extract_features_from_file(
file_path='data/raw/signal.bin',
fs=5e6,
prn=1,
segment_duration=0.5,
label_func=label_func,
verbose=True
)
print(features_df.head())from src.models.training import train_model, create_train_test_split
from src.models.evaluation import evaluate_model
from src.utils.plots import plot_confusion_matrix, plot_roc_curve
# Prepare data
X = features_df.drop(columns=['label', 'segment_start_time']).values
y = features_df['label'].values
# Split data
X_train, X_test, y_train, y_test = create_train_test_split(X, y)
# Train model
model, cv_results = train_model(
X_train, y_train,
model_name='random_forest',
balance_method='class_weight'
)
# Evaluate
results = evaluate_model(model, X_test, y_test)
# Visualize
plot_confusion_matrix(results['confusion_matrix'])Run the end-to-end pipeline:
python scripts/run_pipeline.py --data-dir data/raw --output-dir resultsExplore the interactive notebooks:
main
jupyter notebook notebooks/Execute testes unitários:
# Todos os testes
pytest tests/
# Com cobertura
pytest tests/ --cov=src --cov-report=html
# Teste específico
pytest tests/test_features.py::test_fwhm_computationTestes implementados:
- Geração de código C/A
- Normalização de sinal
- Cálculo de FWHM
- Pipeline mínima com dados sintéticos
- Persistência de modelos
Documento essencial que explica:
- Fundamentos de Sinais e Sistemas
- Justificativa para cada decisão técnica
- Interpretação física de cada feature
- Trade-offs de modelos e métodos
- Limitações e trabalhos futuros
Leitura obrigatória para entender o projeto em profundidade.
- Fork o repositório
- Crie branch para feature:
git checkout -b feature/nova-feature - Commit:
git commit -m 'Add nova feature' - Push:
git push origin feature/nova-feature - Abra Pull Request
Diretrizes:
- Docstrings em todas as funções
- Testes para novas funcionalidades
- Justificar decisões técnicas
Este projeto é de código aberto para fins educacionais (ES413).
Equipe ES413 - Sinais e Sistemas
Centro de Informática - UFPE
Para dúvidas ou sugestões, abra uma Issue no GitHub.
- 01_exploratory_analysis.ipynb: Dataset exploration and visualization
- 02_feature_extraction_demo.ipynb: Feature extraction walkthrough
- 03_model_training_evaluation.ipynb: Model training and comparison
-
Place signal files in
data/raw/ -
Supported formats:
- Binary I/Q files (
.bin,.dat): TEXBAT/FGI format - MATLAB files (
.mat): Must contain 'signal' or 'I'/'Q' variables - CSV files (
.csv): Two columns (I, Q)
- Binary I/Q files (
-
Define labeling function based on your dataset:
def custom_label_func(time_s):
# Return 1 for spoofed segments, 0 for authentic
if time_s >= SPOOF_START_TIME:
return 1
return 0Detailed documentation is available in the docs/ directory:
- DECISIONS.md: Technical decisions and justifications
- Why specific features were chosen
- Signal processing techniques explained
- Algorithm selection rationale
- Connection to Signal and Systems theory
- DC Removal: Removes hardware-induced offset
- Frequency Correction: Compensates for Doppler and IF
- Interference Mitigation: Suppresses RFI and impulsive noise
- Normalization: Standardizes power levels
- Peak-to-Secondary Ratio: Measures correlation peak purity (decreases with spoofing)
- Asymmetry: Quantifies peak imbalance (increases with overlapping signals)
- C/N0: Carrier-to-noise density ratio (increases in power attacks)
- Random Forest: Best overall performance, handles non-linear relationships
- SVM: Good for high-dimensional feature spaces
- MLP: Neural network for complex pattern learning
Run unit tests:
python -m pytest tests/Run specific test module:
python -m pytest tests/test_preprocessing.py -vContributions are welcome! Please:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit changes (
git commit -m 'Add amazing feature') - Push to branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is developed for academic purposes as part of the ES413 course.
- TEXBAT Dataset: GPS spoofing test dataset
- IS-GPS-200: GPS Interface Specification for C/A code generation
- Course: Sinais e Sistemas (ES413)
For questions or issues, please open an issue on GitHub.
Note: This project requires GPS signal data to function. Synthetic signals can be generated for testing, but real spoofing detection requires authentic datasets like TEXBAT or FGI.
main