AI & Machine Learning

Signalverarbeitung & Akustische Datenanalyse: Praktischer Python-Leitfaden

13 Min. Lesezeit20. März 2026
Sinyal işlemeSignal processingAkustik analizFFTSpektrogramPython sinyal işlemeGürültü filtrelemeSualtı akustikNumPy signalScipy signalAkustik iletişimUnderwater acoustics

Signalverarbeitung ist eine der grundlegendsten Disziplinen der Ingenieurwissenschaften. Von Audiosignalen über Kommunikationssysteme bis hin zur Unterwasserakustik umfasst sie ein breites Anwendungsspektrum. In diesem Artikel untersuchen wir Fourier-Transformationen, Spektrogrammanalyse, Rauschfilterung und deren praktische Python-Implementierungen.

Grundlagen der Signalverarbeitung

Was ist ein Signal?

Ein Signal ist die mathematische Darstellung einer Größe, die sich mit der Zeit oder dem Raum ändert:

  • Analoge (kontinuierliche) Signale: Auf einer kontinuierlichen Zeitachse definiert
  • Digitale (diskrete) Signale: An bestimmten Zeitpunkten abgetastet

Abtastung und Nyquist-Theorem

Die Abtastfrequenz (fs) muss mindestens das Doppelte der höchsten Signalfrequenz (fmax) betragen: *fs >= 2 fmax**. Eine Verletzung dieser Regel verursacht Aliasing.

Fourier-Transformation und FFT

Die FFT wandelt ein Zeitbereichssignal in den Frequenzbereich um:

python
import numpy as np
import matplotlib.pyplot as plt

# Abtastparameter
fs = 8000  # Abtastfrequenz (Hz)
T = 1.0    # Dauer (Sekunden)
N = int(fs * T)
t = np.linspace(0, T, N, endpoint=False)

# Zusammengesetztes Signal: 440 Hz + 1000 Hz + Rauschen
f1, f2 = 440, 1000
signal = 0.7 * np.sin(2 * np.pi * f1 * t) + 0.3 * np.sin(2 * np.pi * f2 * t)
rauschen = 0.2 * np.random.randn(N)
verrauschtes_signal = signal + rauschen

# FFT berechnen
fft_ergebnis = np.fft.rfft(verrauschtes_signal)
frequenzen = np.fft.rfftfreq(N, d=1/fs)
amplitude = 2.0 / N * np.abs(fft_ergebnis)

# Frequenzspektrum plotten
plt.figure(figsize=(12, 4))
plt.plot(frequenzen, amplitude)
plt.title('Frequenzspektrum (FFT)')
plt.xlabel('Frequenz (Hz)')
plt.ylabel('Amplitude')
plt.xlim(0, 2000)
plt.grid(True, alpha=0.3)
plt.axvline(x=440, color='r', linestyle='--', alpha=0.7, label='440 Hz')
plt.axvline(x=1000, color='g', linestyle='--', alpha=0.7, label='1000 Hz')
plt.legend()
plt.tight_layout()
plt.show()

Spektrogrammanalyse

Ein Spektrogramm visualisiert die zeitliche Veränderung des Frequenzinhalts:

python
from scipy import signal as scipy_signal

# Chirp-Signal erstellen
fs = 16000
t = np.linspace(0, 2, 2 * fs)
chirp = scipy_signal.chirp(t, f0=100, f1=4000, t1=2, method='linear')

# Spektrogramm berechnen
f, t_spec, Sxx = scipy_signal.spectrogram(chirp, fs=fs, nperseg=512, noverlap=384)

plt.figure(figsize=(12, 5))
plt.pcolormesh(t_spec, f, 10 * np.log10(Sxx + 1e-10), shading='gouraud', cmap='viridis')
plt.title('Spektrogramm')
plt.xlabel('Zeit (s)')
plt.ylabel('Frequenz (Hz)')
plt.ylim(0, 5000)
plt.colorbar(label='Leistung (dB)')
plt.tight_layout()
plt.show()

Digitale Filterung

python
from scipy.signal import butter, filtfilt, iirnotch

def bandpass_filter(signal_daten, untere_freq, obere_freq, fs, ordnung=4):
    """Butterworth-Bandpassfilter anwenden."""
    nyq = 0.5 * fs
    niedrig = untere_freq / nyq
    hoch = obere_freq / nyq
    b, a = butter(ordnung, [niedrig, hoch], btype='band')
    gefiltert = filtfilt(b, a, signal_daten)
    return gefiltert

def notch_filter(signal_daten, ziel_freq, fs, guete_faktor=30):
    """Notch-Filter zur Unterdrückung einer bestimmten Frequenz."""
    b, a = iirnotch(ziel_freq, guete_faktor, fs)
    gefiltert = filtfilt(b, a, signal_daten)
    return gefiltert

# 300-3400 Hz Bandpass (Sprachkommunikation)
sprache_gefiltert = bandpass_filter(verrauschtes_signal, 300, 3400, fs)

# 50 Hz Netzbrummen unterdrücken
netz_bereinigt = notch_filter(verrauschtes_signal, 50, fs)

Wavelet-Transformation

Die Fourier-Transformation zeigt den Frequenzinhalt eines Signals, verliert jedoch die Zeitinformation. Die STFT löst dies teilweise, macht aber aufgrund der festen Fenstergröße einen Kompromiss zwischen Zeit- und Frequenzauflösung. Die Wavelet-Transformation überwindet diese Einschränkung: Sie bietet gute Frequenzauflösung bei niedrigen Frequenzen und gute Zeitauflösung bei hohen Frequenzen.

python
import pywt

# Kontinuierliche Wavelet-Transformation (CWT)
skalen = np.arange(1, 128)
koeffizienten, frequenzen_wt = pywt.cwt(
    verrauschtes_signal[:2000], skalen, 'morl', sampling_period=1/fs
)

plt.figure(figsize=(12, 6))
plt.imshow(np.abs(koeffizienten), aspect='auto', cmap='jet',
           extent=[0, 2000/fs, frequenzen_wt[-1], frequenzen_wt[0]])
plt.title('Kontinuierliche Wavelet-Transformation (Morlet)')
plt.xlabel('Zeit (s)')
plt.ylabel('Frequenz (Hz)')
plt.colorbar(label='Amplitude')
plt.tight_layout()
plt.show()

# Rauschreduzierung mit diskreter Wavelet-Transformation
def wavelet_entrauschen(signal_daten, wavelet='db4', ebene=4):
    """Rauschreduzierung durch Wavelet-Schwellenwertbildung."""
    koeffs = pywt.wavedec(signal_daten, wavelet, level=ebene)
    sigma = np.median(np.abs(koeffs[-1])) / 0.6745
    schwelle = sigma * np.sqrt(2 * np.log(len(signal_daten)))

    saubere_koeffs = [koeffs[0]]
    for detail in koeffs[1:]:
        saubere_koeffs.append(pywt.threshold(detail, schwelle, mode='soft'))

    return pywt.waverec(saubere_koeffs, wavelet)

Mel-Frequenz-Cepstral-Koeffizienten (MFCC)

MFCC ist die am häufigsten verwendete Merkmalextraktion in der Audio- und Sprachverarbeitung. Sie ahmt die Frequenzwahrnehmung des menschlichen Gehörs nach: hohe Auflösung bei niedrigen Frequenzen, niedrige Auflösung bei hohen Frequenzen. MFCC ist der Standardmerkmalsvektor für Spracherkennung und Audioklassifikation.

python
import librosa

# MFCC-Extraktion
sr = 16000
dauer = 2.0
t_audio = np.linspace(0, dauer, int(sr * dauer), endpoint=False)
audio_signal = 0.5 * np.sin(2 * np.pi * 440 * t_audio) * np.exp(-t_audio)

mfcc_koeffizienten = librosa.feature.mfcc(
    y=audio_signal, sr=sr,
    n_mfcc=13, n_fft=2048, hop_length=512, n_mels=40
)

# Delta- und Delta-Delta-Koeffizienten
mfcc_delta = librosa.feature.delta(mfcc_koeffizienten)
mfcc_delta2 = librosa.feature.delta(mfcc_koeffizienten, order=2)

# Alle Merkmale kombinieren
merkmale = np.concatenate([mfcc_koeffizienten, mfcc_delta, mfcc_delta2], axis=0)

Unterwasser-Akustikkommunikation

In meiner Masterarbeit mit dem Titel "ML-Based Reconstruction of Lost Acoustic Messages in Unmanned Underwater Vehicles" habe ich an der Rekonstruktion von Nachrichten gearbeitet, die über akustische Unterwasserkanäle übertragen wurden. Der Unterwasserkanal stellt einzigartige Herausforderungen dar:

  • Mehrwegeausbreitung: Reflexionen an Oberfläche und Meeresboden verursachen Intersymbolinterferenz (ISI)
  • Doppler-Verschiebung: Relative Bewegung verursacht Frequenzverschiebungen, die im Wasser durch die geringere Schallgeschwindigkeit besonders ausgeprägt sind
  • Umgebungsrauschen: Meereslebewesen, Wellengeräusche, Schiffsverkehr und thermisches Rauschen bilden einen konstanten Rauschteppich
  • Begrenzte Bandbreite: Der nutzbare Frequenzbereich ist extrem schmal, typischerweise auf wenige kHz beschränkt
  • Entfernungsabhängige Dämpfung: Akustische Signale erleiden sowohl Ausbreitungs- als auch Absorptionsverluste

Durch die Kombination von FFT-basierter Merkmalsextraktion, Spektrogrammanalyse und MFCC-Merkmalen erstellte ich einen umfassenden Merkmalsvektor. Deep-Learning-Modelle erreichten damit 90,8% Befehlsgenauigkeit und 87,3% Parameterwiederherstellungsrate. Die Befehlsgenauigkeit bezeichnet die korrekte Identifikation gesendeter akustischer Befehle, während die Parameterwiederherstellungsrate die genaue Rekonstruktion begleitender numerischer Parameter (Entfernung, Winkel, Geschwindigkeit) angibt.

Rauschreduzierungstechniken

Spektrale Subtraktion schätzt das Umgebungsrauschen und subtrahiert es vom Signalspektrum. Sie funktioniert gut bei stationären Rauschquellen wie Lüftern.

Wiener-Filterung entwirft einen optimalen Filter, der das Signal-Rausch-Verhältnis (SNR) maximiert. Adaptive Versionen können sich an wechselnde Rauschbedingungen anpassen.

Anwendungsbereiche

  • Audio und Musik: Rauschunterdrückung, Spracherkennung
  • Telekommunikation: Modulation, Codierung, Kanalentzerrung
  • Medizin: EKG/EEG-Analyse, Ultraschallbildgebung
  • Radar und Sonar: Zielerkennung, Entfernungsmessung

Zusammenfassung

Signalverarbeitung und akustische Analyse spielen eine grundlegende Rolle in vielen Ingenieurdisziplinen. FFT für Frequenzanalyse, Spektrogramme für Zeit-Frequenz-Visualisierung und digitale Filter zur Rauschentfernung sind die wesentlichen Werkzeuge. Die Wavelet-Transformation bietet multiresolutionale Analyse jenseits der Fourier-Transformation, während MFCC das menschliche Gehör modelliert und die Grundlage für Spracherkennungsanwendungen bildet. Das Python-Ökosystem mit NumPy, SciPy, librosa und PyWavelets ermöglicht eine schnelle und effektive Umsetzung. Selbst in anspruchsvollen Bereichen wie der Unterwasserakustik können Signalverarbeitung und KI Genauigkeiten von über 90% erzielen.

Verwandte Artikel

Haben Sie ein Flutter-Projekt?

Ich entwickle hochleistungsfähige Flutter-Anwendungen für iOS, Android und Web.

Kontakt aufnehmen