# juandcontreras100-sketch/fc-filtro-inverso architecture

> Architecture diagram of the GitHub repository juandcontreras100-sketch/fc-filtro-inverso, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-12). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/juandcontreras100-sketch/fc-filtro-inverso
- Repository: https://github.com/juandcontreras100-sketch/fc-filtro-inverso

## Overview

El producto es un ecualizador FFT full-duplex con interfaz en tiempo real: mide la respuesta de un circuito, calcula un inverso regularizado y lo aplica al audio mientras muestra espectros y niveles. La calibración y el análisis numérico son flujos complementarios; la generación de mediciones sintéticas permite probar sin circuito. Las conexiones reflejan llamadas indicadas por el índice o documentación explícita del README; las relaciones internas de módulos no muestreados se omiten cuando no hay evidencia.

Main entry points: [`src/ui/window.py`](https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/ui/window.py) (Ventana principal), [`src/audio/engine.py`](https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/audio/engine.py) (Motor full-duplex), [`main.py`](https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/main.py) (Aplicación CLI), [`analisis_numerico.py`](https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/analisis_numerico.py) (Análisis numérico)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["Inicio y calibración"]
  node_main["Aplicación CLI<br/>[main.py]"]
  node_calibration["Calibración hardware"]
  node_demo_measurement["Medición sintética"]
  node_demo_launcher["Launcher demo laptop"]
  node_numerical_analysis["Análisis numérico"]
end

subgraph group_audio["Audio en tiempo real"]
  node_device_selection["Selección dispositivos<br/>[devices.py]"]
  node_engine["Motor full-duplex<br/>[engine.py]"]
end

subgraph group_dsp["Procesamiento y análisis"]
  node_inverse_filter["Filtro inverso WOLA<br/>[inverse_filter.py]"]
  node_limiter["Limitador suave<br/>[limiter.py]"]
  node_spectrum["Espectro y niveles<br/>[spectrum.py]"]
  node_numerics["Métodos numéricos<br/>[numerics.py]"]
end

subgraph group_interface["Interfaz y sesiones"]
  node_window["Ventana principal<br/>[window.py]"]
  node_controls["Controles<br/>[controls.py]"]
  node_meters["Medidores y clip<br/>[meters.py]"]
  node_readout["Lectura cursor<br/>[readout.py]"]
  node_spectrogram["Cascada espectral<br/>[spectrogram.py]"]
  node_theme["Tema visual<br/>[theme.py]"]
  node_recorder[("Grabación sesiones<br/>[recorder.py]")]
end

node_user(("Usuario"))
node_circuit(("Circuito medido"))
node_audio_device(("Interfaz de audio"))

node_user -->|"inicia"| node_main
node_main -->|"resuelve dispositivos"| node_device_selection
node_main -->|"crea motor"| node_engine
node_main -->|"crea ventana"| node_window
node_user -->|"solicita medición"| node_calibration
node_circuit -->|"señal de prueba"| node_calibration
node_calibration -->|"genera H y coherencia"| node_engine
node_user -->|"genera demo"| node_demo_measurement
node_demo_measurement -->|"produce medición sintética"| node_engine
node_user -.->|"inicia demo"| node_demo_launcher
node_user -->|"analiza medición"| node_numerical_analysis
node_numerical_analysis -->|"usa métodos"| node_numerics
node_numerical_analysis -->|"usa inversor"| node_inverse_filter
node_audio_device -.->|"intercambia audio"| node_engine
node_engine -->|"aplica filtro"| node_inverse_filter
node_engine -->|"limita salida"| node_limiter
node_engine -->|"calcula métricas"| node_spectrum
node_window -->|"muestra controles"| node_controls
node_window -->|"muestra niveles"| node_meters
node_window -->|"integra lectura"| node_readout
node_window -->|"actualiza cascada"| node_spectrogram
node_window -->|"configura apariencia"| node_theme
node_window -->|"inicia grabación"| node_recorder
node_meters -->|"usa niveles"| node_spectrum
node_controls -->|"usa estilos"| node_theme

click node_main "https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/main.py"
click node_calibration "https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/calibrate_hardware.py"
click node_demo_measurement "https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/generar_medicion_demo.py"
click node_demo_launcher "https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/iniciar_demo_laptop.py"
click node_numerical_analysis "https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/analisis_numerico.py"
click node_device_selection "https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/audio/devices.py"
click node_engine "https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/audio/engine.py"
click node_inverse_filter "https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/dsp/inverse_filter.py"
click node_limiter "https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/dsp/limiter.py"
click node_spectrum "https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/dsp/spectrum.py"
click node_numerics "https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/dsp/numerics.py"
click node_window "https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/ui/window.py"
click node_controls "https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/ui/controls.py"
click node_meters "https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/ui/meters.py"
click node_readout "https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/ui/readout.py"
click node_spectrogram "https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/ui/spectrogram.py"
click node_theme "https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/ui/theme.py"
click node_recorder "https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/storage/recorder.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_main,node_calibration,node_demo_measurement,node_demo_launcher,node_numerical_analysis toneBlue
class node_device_selection,node_engine toneAmber
class node_inverse_filter,node_limiter,node_spectrum,node_numerics toneMint
class node_window,node_controls,node_meters,node_readout,node_spectrogram,node_theme,node_recorder toneRose
class node_user,node_circuit,node_audio_device toneIndigo
```

## Components

### Inicio y calibración

- [Aplicación CLI](https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/main.py): `main.py`
- [Calibración hardware](https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/calibrate_hardware.py): `calibrate_hardware.py`
- [Medición sintética](https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/generar_medicion_demo.py): `generar_medicion_demo.py`
- [Launcher demo laptop](https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/iniciar_demo_laptop.py): `iniciar_demo_laptop.py`
- [Análisis numérico](https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/analisis_numerico.py): `analisis_numerico.py`

### Audio en tiempo real

- [Selección dispositivos](https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/audio/devices.py): `src/audio/devices.py`
- [Motor full-duplex](https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/audio/engine.py): `src/audio/engine.py`

### Procesamiento y análisis

- [Filtro inverso WOLA](https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/dsp/inverse_filter.py): `src/dsp/inverse_filter.py`
- [Limitador suave](https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/dsp/limiter.py): `src/dsp/limiter.py`
- [Espectro y niveles](https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/dsp/spectrum.py): `src/dsp/spectrum.py`
- [Métodos numéricos](https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/dsp/numerics.py): `src/dsp/numerics.py`

### Interfaz y sesiones

- [Ventana principal](https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/ui/window.py): `src/ui/window.py`
- [Controles](https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/ui/controls.py): `src/ui/controls.py`
- [Medidores y clip](https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/ui/meters.py): `src/ui/meters.py`
- [Lectura cursor](https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/ui/readout.py): `src/ui/readout.py`
- [Cascada espectral](https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/ui/spectrogram.py): `src/ui/spectrogram.py`
- [Tema visual](https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/ui/theme.py): `src/ui/theme.py`
- [Grabación sesiones](https://github.com/juandcontreras100-sketch/fc-filtro-inverso/blob/main/src/storage/recorder.py): `src/storage/recorder.py`

### Other components

- **Usuario**
- **Circuito medido**
- **Interfaz de audio**

## Connections

- Usuario → Aplicación CLI: inicia (evidence: `README.md`)
- Aplicación CLI → Selección dispositivos: resuelve dispositivos (evidence: `main.py`)
- Aplicación CLI → Motor full-duplex: crea motor (evidence: `main.py`)
- Aplicación CLI → Ventana principal: crea ventana (evidence: `main.py`)
- Usuario → Calibración hardware: solicita medición (evidence: `README.md`)
- Circuito medido → Calibración hardware: señal de prueba (evidence: `README.md`)
- Calibración hardware → Motor full-duplex: genera H y coherencia (evidence: `README.md`)
- Usuario → Medición sintética: genera demo (evidence: `README.md`)
- Medición sintética → Motor full-duplex: produce medición sintética (evidence: `README.md`)
- Usuario → Launcher demo laptop: inicia demo
- Usuario → Análisis numérico: analiza medición (evidence: `README.md`)
- Análisis numérico → Métodos numéricos: usa métodos (evidence: `analisis_numerico.py`)
- Análisis numérico → Filtro inverso WOLA: usa inversor (evidence: `analisis_numerico.py`)
- Interfaz de audio → Motor full-duplex: intercambia audio
- Motor full-duplex → Filtro inverso WOLA: aplica filtro (evidence: `src/audio/engine.py`)
- Motor full-duplex → Limitador suave: limita salida (evidence: `src/audio/engine.py`)
- Motor full-duplex → Espectro y niveles: calcula métricas (evidence: `src/audio/engine.py`)
- Ventana principal → Controles: muestra controles (evidence: `src/ui/window.py`)
- Ventana principal → Medidores y clip: muestra niveles (evidence: `src/ui/window.py`)
- Ventana principal → Lectura cursor: integra lectura (evidence: `src/ui/window.py`)
- Ventana principal → Cascada espectral: actualiza cascada (evidence: `src/ui/window.py`)
- Ventana principal → Tema visual: configura apariencia (evidence: `src/ui/window.py`)
- Ventana principal → Grabación sesiones: inicia grabación (evidence: `src/ui/window.py`)
- Medidores y clip → Espectro y niveles: usa niveles (evidence: `src/ui/meters.py`)
- Controles → Tema visual: usa estilos (evidence: `src/ui/controls.py`)
