#!/usr/bin/python3
import glob
import os
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
from scipy.signal import butter, sosfiltfilt, peak_widths, find_peaks

def filter_morse_tone(input_wav, output_wav, bandwidth_hz=100):
    # 1. WAV-Datei einlesen
    sample_rate, data = wavfile.read(input_wav)
    
    # Auf Mono reduzieren (falls Stereo)
    if data.ndim > 1:
        data = data[:, 0]
        
    data_float = data.astype(np.float64)
    n_samples = len(data_float)
    
    # 2. Dominante Frequenz (Morse-Ton) per FFT finden
    fft_spectrum = np.fft.rfft(data_float)
    frequencies = np.fft.rfftfreq(n_samples, d=1/sample_rate)
    amplitudes = np.abs(fft_spectrum)
    
    cw_mask = (frequencies >= 300) & (frequencies <= 1500)
    cw_freqs = frequencies[cw_mask]
    cw_amps = amplitudes[cw_mask]
    
    peak_idx = np.argmax(cw_amps)
    cw_center_freq = cw_freqs[peak_idx]
    print(f"[+] Erkannte Morse-Tonfrequenz: {cw_center_freq:.1f} Hz")
    
    # 3. Bandpass-Filter entwerfen (Butterworth SOS fuer Stabilitaet)
    lowcut = max(20.0, cw_center_freq - (bandwidth_hz / 2))
    highcut = min(sample_rate / 2 - 1.0, cw_center_freq + (bandwidth_hz / 2))
    
    # 4. Ordnung Butterworth Bandpass
    sos = butter(N=4, Wn=[lowcut, highcut], btype='bandpass', fs=sample_rate, output='sos')
    
    # Zero-Phase-Filterung anwenden (keine Phasenverschiebung im Signal)
    filtered_data = sosfiltfilt(sos, data_float)
    
    # 4. Normalisieren & Speichern
    max_val = np.max(np.abs(filtered_data))
    if max_val > 0:
        if np.issubdtype(data.dtype, np.integer):
            i_info = np.iinfo(data.dtype)
            filtered_scaled = (filtered_data / max_val * i_info.max * 0.9).astype(data.dtype)
        else:
            filtered_scaled = (filtered_data / max_val * 0.9).astype(data.dtype)
    else:
        filtered_scaled = filtered_data.astype(data.dtype)
        
    wavfile.write(output_wav, sample_rate, filtered_scaled)
    print(f"[+] Gefilterte Datei gespeichert als: {output_wav}")

# Alle Dateien suchen, die mit 'input_' beginnen und auf '.wav' enden
wav_dateien = glob.glob("input_*.wav")

if not wav_dateien:
    print("Keine passenden Dateien gefunden.")

for wav_pfad in wav_dateien:
    # 'input_001.wav' -> 'input_001'
    dateiname_ohne_endung = os.path.splitext(wav_pfad)[0]
    
    # Ziel-PNG-Pfad zusammenbauen: 'input_01.png'
    output_pfad = f"filtered_{dateiname_ohne_endung}.wav"
    
    filter_morse_tone(wav_pfad, output_pfad, bandwidth_hz=50)
