AI & Machine Learning
Signalverarbeitung & Akustische Datenanalyse: Praktischer Python-Leitfaden
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:
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:
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
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.
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.
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
Was ist Machine Learning? Grundlagen & Ihr erstes Modell mit Python
Einführung in Machine Learning. Supervised, Unsupervised und Reinforcement Learning Konzepte. Erstes Modell mit Python.
Deep Learning mit CNN: Convolutional Neural Network Leitfaden
Convolutional Neural Network (CNN) Architektur und Deep Learning. Convolution, Pooling, Fully Connected Layer und Bildklassifizierung.
Modelltraining mit TensorFlow: Datenvorbereitung, Training & Evaluation
Modelltraining-Leitfaden mit TensorFlow und Keras. Datenvorverarbeitung, Modelldesign, Trainingsschleife und Modellbewertung.
Haben Sie ein Flutter-Projekt?
Ich entwickle hochleistungsfähige Flutter-Anwendungen für iOS, Android und Web.
Kontakt aufnehmen