#!/usr/bin/python3 import matplotlib.pyplot as plt import numpy as np from scipy.io import wavfile from scipy.signal import hilbert def wav_zu_png(wav_pfad, png_pfad): samplerate, data = wavfile.read(wav_pfad) # Falls Stereo, ersten Kanal wählen if len(data.shape) > 1: data = data[:, 0] # Normalisieren auf Bereich [-1, 1] data = data.astype(np.float32) data /= np.max(np.abs(data)) if np.max(np.abs(data)) != 0 else 1.0 # Hüllkurve berechnen (Hilbert-Trafo + Tiefpass-Glättung über 10ms) envelope = np.abs(hilbert(data)) window_len = int(samplerate * 0.01) # 10 ms Fenster if window_len > 1: envelope = np.convolve(envelope, np.ones(window_len)/window_len, mode='same') dauer = len(data) / samplerate zeit = np.linspace(0, dauer, num=len(data)) # Figsize auf moderate Werte anpassen (z.B. 30x5 bei dpi=150 ergibt 4500px Breite) plt.figure(figsize=(30, 5)) # Hüllkurve in Rot zeichnen (klar identifizierbare Pulse) plt.plot(zeit, envelope, color="red", linewidth=1.0, label="MSF Hüllkurve (AM-Absenkung)") # Optional: Original-Audio transparent im Hintergrund darstellen plt.plot(zeit, data, color="blue", alpha=0.2, linewidth=0.3, label="HF/NF Rohdaten") # Beschriftungen und Raster plt.title(f"MSF 60 kHz Amplitudenverlauf: {wav_pfad}") plt.xlabel("Zeit (Sekunden)") plt.ylabel("Rel. Amplitude") plt.grid(True, linestyle="--", alpha=0.6) plt.xlim(0, dauer) plt.ylim(-1.1, 1.1) plt.legend(loc="upper right") plt.tight_layout() plt.savefig(png_pfad, dpi=150) plt.close() print(f"Erfolgreich gespeichert unter: {png_pfad}") if __name__ == "__main__": wav_zu_png("websdr_recording_60khz.wav", "amplitudenverlauf.png")