AI & Machine Learning
Sinyal İşleme ve Akustik Veri Analizi: Python ile Pratik Rehber
Sinyal işleme, mühendisliğin en temel disiplinlerinden biridir. Ses sinyallerinden iletişim sistemlerine, tıbbi cihazlardan sualtı akustiğine kadar geniş bir uygulama alanına sahiptir. Bu yazıda Fourier dönüşümü, spektrogram analizi, gürültü filtreleme tekniklerini ve Python ile pratik uygulamalarını inceleyeceğiz. Ayrıca sualtı akustik mesaj rekonstrüksiyonu üzerine yaptığım yüksek lisans tez çalışmasından örnekler paylaşacağım.
Sinyal İşleme Temelleri
Sinyal Nedir?
Sinyal, zamana veya mekana bağlı olarak değişen bir büyüklüğün matematiksel temsilidir. Sinyaller iki ana kategoriye ayrılır:
- Analog (Sürekli) Sinyaller: Sürekli zaman ekseninde tanımlı (ses dalgaları, radyo sinyalleri)
- Dijital (Ayrık) Sinyaller: Belirli zaman noktalarında örneklenmiş (dijital ses, sensör verileri)
Örnekleme ve Nyquist Teoremi
Analog bir sinyali dijitale dönüştürürken örnekleme frekansı (fs), sinyaldeki en yüksek frekansın (fmax) en az iki katı olmalıdır:
*fs >= 2 fmax**
Bu kural ihlal edildiğinde aliasing (takma ad) oluşur ve sinyal geri dönüşümsüz bozulur.
Fourier Dönüşümü ve FFT
Hızlı Fourier Dönüşümü (FFT)
FFT, bir zaman alanı sinyalini frekans alanına dönüştürür. Bu dönüşüm, sinyalin hangi frekans bileşenlerinden oluştuğunu ortaya çıkarır:
import numpy as np
import matplotlib.pyplot as plt
# Örnekleme parametreleri
fs = 8000 # Örnekleme frekansı (Hz)
T = 1.0 # Süre (saniye)
N = int(fs * T) # Toplam örnek sayısı
t = np.linspace(0, T, N, endpoint=False)
# Bileşik sinyal oluşturma: 440 Hz + 1000 Hz + gürültü
f1, f2 = 440, 1000 # Frekanslar (Hz)
sinyal = 0.7 * np.sin(2 * np.pi * f1 * t) + 0.3 * np.sin(2 * np.pi * f2 * t)
gurultu = 0.2 * np.random.randn(N)
gurultulu_sinyal = sinyal + gurultu
# FFT hesaplama
fft_sonuc = np.fft.rfft(gurultulu_sinyal)
frekanslar = np.fft.rfftfreq(N, d=1/fs)
genlik = 2.0 / N * np.abs(fft_sonuc)
# Frekans spektrumu çizimi
plt.figure(figsize=(12, 4))
plt.plot(frekanslar, genlik)
plt.title('Frekans Spektrumu (FFT)')
plt.xlabel('Frekans (Hz)')
plt.ylabel('Genlik')
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.savefig('fft_spektrum.png', dpi=150)
plt.show()Spektrogram Analizi
Spektrogram, sinyalin frekans içeriğinin zaman içindeki değişimini görselleştirir. Kısa Zamanlı Fourier Dönüşümü (STFT) kullanılarak oluşturulur:
from scipy import signal as scipy_signal
# Chirp sinyali oluşturma (zamanla değişen frekans)
fs = 16000
t = np.linspace(0, 2, 2 * fs)
# 100 Hz'den 4000 Hz'ye yükselen sinyal
chirp = scipy_signal.chirp(t, f0=100, f1=4000, t1=2, method='linear')
# Spektrogram hesaplama ve çizimi
fig, axes = plt.subplots(2, 1, figsize=(12, 8))
# Zaman alanı
axes[0].plot(t, chirp, linewidth=0.5)
axes[0].set_title('Zaman Alanı Sinyali')
axes[0].set_xlabel('Zaman (s)')
axes[0].set_ylabel('Genlik')
axes[0].set_xlim(0, 2)
# Spektrogram
f, t_spec, Sxx = scipy_signal.spectrogram(chirp, fs=fs, nperseg=512, noverlap=384)
axes[1].pcolormesh(t_spec, f, 10 * np.log10(Sxx + 1e-10), shading='gouraud', cmap='viridis')
axes[1].set_title('Spektrogram')
axes[1].set_xlabel('Zaman (s)')
axes[1].set_ylabel('Frekans (Hz)')
axes[1].set_ylim(0, 5000)
plt.colorbar(axes[1].collections[0], ax=axes[1], label='Güç (dB)')
plt.tight_layout()
plt.savefig('spektrogram.png', dpi=150)
plt.show()Dijital Filtreleme
Gürültü Temizleme
Gerçek dünya sinyalleri genellikle gürültü içerir. Dijital filtreler ile istenmeyen frekans bileşenleri temizlenebilir:
from scipy.signal import butter, filtfilt, iirnotch
def bant_geciren_filtre(sinyal, dusuk_kesim, yuksek_kesim, fs, derece=4):
"""Butterworth bant geçiren filtre uygula."""
nyq = 0.5 * fs
dusuk = dusuk_kesim / nyq
yuksek = yuksek_kesim / nyq
b, a = butter(derece, [dusuk, yuksek], btype='band')
filtrelenmis = filtfilt(b, a, sinyal)
return filtrelenmis
def notch_filtre(sinyal, hedef_frekans, fs, kalite_faktoru=30):
"""Belirli bir frekansı bastırmak için notch filtre uygula."""
b, a = iirnotch(hedef_frekans, kalite_faktoru, fs)
filtrelenmis = filtfilt(b, a, sinyal)
return filtrelenmis
# Filtre uygulamaları
# 300-3400 Hz bant geçiren (ses iletişimi için)
ses_filtreli = bant_geciren_filtre(gurultulu_sinyal, 300, 3400, fs)
# 50 Hz şebeke gürültüsünü bastır
sebeke_temiz = notch_filtre(gurultulu_sinyal, 50, fs)
# Sonuçları karşılaştır
fig, axes = plt.subplots(3, 1, figsize=(12, 8))
axes[0].plot(t[:1000], gurultulu_sinyal[:1000])
axes[0].set_title('Orijinal (Gürültülü) Sinyal')
axes[1].plot(t[:1000], ses_filtreli[:1000])
axes[1].set_title('Bant Geçiren Filtre Sonrası')
axes[2].plot(t[:1000], sebeke_temiz[:1000])
axes[2].set_title('Notch Filtre Sonrası')
for ax in axes:
ax.set_xlabel('Zaman (s)')
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('filtreleme_sonuclari.png', dpi=150)
plt.show()Wavelet Dönüşümü
Fourier dönüşümü sinyalin frekans içeriğini ortaya koyarken, zaman bilgisini kaybeder. STFT bu sorunu kısmen çözer ancak sabit pencere boyutu nedeniyle zaman-frekans çözünürlüğü arasında bir ödünleşim yapar. Wavelet dönüşümü bu sınırlamayı aşar: düşük frekanslarda iyi frekans çözünürlüğü, yüksek frekanslarda iyi zaman çözünürlüğü sağlar.
Bu özellik, wavelet dönüşümünü geçici (transient) olayları içeren sinyallerin analizinde özellikle güçlü kılar. Deprem sinyalleri, konuşma sesleri, müzik ve biyomedikal sinyaller gibi zaman içinde frekans içeriği değişen sinyaller wavelet analizine idealdir.
import pywt
# Sürekli Wavelet Dönüşümü (CWT)
olcekler = np.arange(1, 128)
katsayilar, frekanslar_wt = pywt.cwt(gurultulu_sinyal[:2000], olcekler, 'morl', sampling_period=1/fs)
plt.figure(figsize=(12, 6))
plt.imshow(np.abs(katsayilar), aspect='auto', cmap='jet',
extent=[0, 2000/fs, frekanslar_wt[-1], frekanslar_wt[0]])
plt.title('Sürekli Wavelet Dönüşümü (Morlet)')
plt.xlabel('Zaman (s)')
plt.ylabel('Frekans (Hz)')
plt.colorbar(label='Genlik')
plt.tight_layout()
plt.savefig('wavelet_donusumu.png', dpi=150)
plt.show()
# Ayrık Wavelet Dönüşümü ile gürültü azaltma
def wavelet_gurultu_azaltma(sinyal, wavelet='db4', seviye=4, esik_carpani=1.0):
"""Wavelet eşikleme ile gürültü azaltma."""
katsayilar = pywt.wavedec(sinyal, wavelet, level=seviye)
# Detay katsayılarına yumuşak eşikleme uygula
sigma = np.median(np.abs(katsayilar[-1])) / 0.6745
esik = esik_carpani * sigma * np.sqrt(2 * np.log(len(sinyal)))
temiz_katsayilar = [katsayilar[0]] # Yaklaşık katsayıları koru
for detay in katsayilar[1:]:
temiz_katsayilar.append(pywt.threshold(detay, esik, mode='soft'))
temiz_sinyal = pywt.waverec(temiz_katsayilar, wavelet)
return temiz_sinyal
temiz = wavelet_gurultu_azaltma(gurultulu_sinyal)Mel-Frekans Kepstral Katsayıları (MFCC)
MFCC, ses ve konuşma işleme alanında en yaygın kullanılan özellik çıkarım yöntemidir. İnsan işitme sisteminin frekans algısını taklit eder: düşük frekanslarda yüksek çözünürlük, yüksek frekanslarda düşük çözünürlük sağlar. Bu özellik, MFCC'yi konuşma tanıma, konuşmacı doğrulama ve ses sınıflandırma gibi görevlerde standart özellik vektörü haline getirmiştir.
MFCC hesaplaması birkaç adımdan oluşur: sinyal çerçeveleme, pencere fonksiyonu uygulama, FFT hesaplama, Mel filtre bankası ile filtreleme, logaritmik güç hesaplama ve son olarak ayrık kosinüs dönüşümü (DCT).
import librosa
import librosa.display
# Ses sinyali için MFCC hesaplama
# Örnek sinyal oluşturma (gerçek uygulamada ses dosyasından yüklenir)
sr = 16000 # Örnekleme hızı
suresi = 2.0
t_ses = np.linspace(0, suresi, int(sr * suresi), endpoint=False)
ses_sinyal = 0.5 * np.sin(2 * np.pi * 440 * t_ses) * np.exp(-t_ses)
# MFCC çıkarımı
mfcc_katsayilari = librosa.feature.mfcc(
y=ses_sinyal, sr=sr,
n_mfcc=13, # 13 MFCC katsayısı (standart)
n_fft=2048, # FFT pencere boyutu
hop_length=512, # Pencere kayma adımı
n_mels=40 # Mel filtre sayısı
)
# Delta ve delta-delta katsayıları (zamanlı değişim bilgisi)
mfcc_delta = librosa.feature.delta(mfcc_katsayilari)
mfcc_delta2 = librosa.feature.delta(mfcc_katsayilari, order=2)
# Tüm özellikleri birleştir
ozellikler = np.concatenate([mfcc_katsayilari, mfcc_delta, mfcc_delta2], axis=0)
# MFCC görselleştirme
fig, axes = plt.subplots(3, 1, figsize=(12, 10))
librosa.display.specshow(mfcc_katsayilari, sr=sr, hop_length=512,
x_axis='time', ax=axes[0])
axes[0].set_title('MFCC Katsayıları')
axes[0].set_ylabel('MFCC')
librosa.display.specshow(mfcc_delta, sr=sr, hop_length=512,
x_axis='time', ax=axes[1])
axes[1].set_title('Delta MFCC')
axes[1].set_ylabel('Delta')
librosa.display.specshow(mfcc_delta2, sr=sr, hop_length=512,
x_axis='time', ax=axes[2])
axes[2].set_title('Delta-Delta MFCC')
axes[2].set_ylabel('Delta-Delta')
plt.tight_layout()
plt.savefig('mfcc_analizi.png', dpi=150)
plt.show()Gürültü Azaltma Teknikleri
Gerçek dünya uygulamalarında gürültü azaltma kritik bir adımdır. Farklı gürültü türleri için farklı teknikler en etkili sonucu verir:
Spektral çıkarma (Spectral Subtraction), ortam gürültüsünün tahmin edilerek sinyal spektrumundan çıkarılmasıdır. Durağan gürültü kaynaklarında (fan sesi, klima) etkilidir. Gürültünün bulunduğu sessiz bölümlerden gürültü profili çıkarılır ve tüm sinyalden bu profil çıkarılır.
Wiener filtresi, sinyal-gürültü oranını (SNR) en üst düzeye çıkaracak şekilde optimal bir filtre tasarlar. Hem frekans hem de zaman alanında uygulanabilir ve uyarlanabilir versiyonları değişen gürültü koşullarına adapte olabilir.
def spektral_cikarma(gurultulu, gurultu_referans, fs, n_fft=2048):
"""Spektral çıkarma ile gürültü azaltma."""
# Gürültü spektrumunu tahmin et
gurultu_fft = np.fft.rfft(gurultu_referans, n=n_fft)
gurultu_guc = np.mean(np.abs(gurultu_fft) ** 2)
# Sinyalin STFT'sini hesapla
f, t_stft, Zxx = scipy_signal.stft(gurultulu, fs=fs, nperseg=n_fft)
# Gürültü gücünü çıkar (negatif değerleri sıfırla)
temiz_guc = np.maximum(np.abs(Zxx) ** 2 - gurultu_guc, 0)
temiz_Zxx = np.sqrt(temiz_guc) * np.exp(1j * np.angle(Zxx))
# Ters STFT ile zaman alanına dön
_, temiz_sinyal = scipy_signal.istft(temiz_Zxx, fs=fs, nperseg=n_fft)
return temiz_sinyalSualtı Akustik İletişim ve Mesaj Rekonstrüksiyonu
Yüksek lisans tez çalışmamda, insansız sualtı araçlarında (UUV) kaybolan akustik mesajların makine öğrenmesi tabanlı rekonstrüksiyonu üzerine çalıştım. Tez başlığım "ML-Based Reconstruction of Lost Acoustic Messages in Unmanned Underwater Vehicles" olup, bu çalışma sualtı akustik kanalının benzersiz zorluklarını ele almaktadır.
Sualtı kanalı, karasal iletişimden çok farklı zorluklar barındırır:
- Çok yollu yayılım: Sinyal yüzey ve tabandan yansıyarak alıcıya farklı zamanlarda ulaşır. Bu yansımalar, orijinal sinyalle örtüşerek semboller arası girişime (ISI) neden olur
- Doppler kayması: Verici ve alıcının göreceli hareketi frekans kaymasına neden olur. Sualtı araçlarının hareket hızı düşük olsa da, suyun ses hızının havadakinden çok daha düşük olması Doppler etkisini belirgin hale getirir
- Ortam gürültüsü: Deniz canlıları, dalga sesleri, gemi trafiği ve termal gürültü sürekli bir gürültü tabanı oluşturur
- Sınırlı bant genişliği: Sualtında kullanılabilir frekans aralığı oldukça dardır; genellikle birkaç kHz ile sınırlıdır
- Mesafeye bağlı zayıflama: Akustik sinyaller suda mesafe arttıkça hem yayılma hem de absorpsiyon kayıplarına uğrar
Tez çalışmamda, bu zorlu koşullarda bozulmuş veya tamamen kaybedilmiş akustik mesajları yeniden oluşturmak için sinyal işleme ve makine öğrenmesi tekniklerini birleştirdim. FFT tabanlı özellik çıkarımı ile sinyalin frekans domain özelliklerini, spektrogram analizi ile zaman-frekans domain özelliklerini ve MFCC ile algısal özellikleri birlikte kullanarak kapsamlı bir özellik vektörü oluşturdum.
Bu özellikler üzerinde eğitilen derin öğrenme modelleri ile %90.8 komut doğruluğu ve %87.3 parametre kurtarma oranı elde ettim. Komut doğruluğu, gönderilen akustik komutların doğru şekilde tanınma oranını; parametre kurtarma oranı ise bu komutlara eşlik eden sayısal parametrelerin (mesafe, açı, hız gibi) doğru şekilde yeniden oluşturulma oranını ifade eder.
Bu çalışma, sinyal işleme tekniklerinin yapay zeka ile birleştirildiğinde ne denli güçlü sonuçlar üretebileceğinin somut bir örneğidir. Özellikle sualtı ortamının belirsizlikleri ve yüksek gürültü seviyeleri düşünüldüğünde, bu başarı oranları alandaki mevcut çalışmalarla karşılaştırıldığında rekabetçi sonuçlar vermektedir.
Temel Sinyal İşleme Kavramları
- Konvolüsyon: İki sinyalin birleştirilmesi, filtrelemenin matematiksel temeli
- Korelasyon: İki sinyal arasındaki benzerliğin ölçülmesi
- Pencere Fonksiyonları: Hamming, Hann, Blackman — spektral sızıntıyı azaltmak için
- Güç Spektral Yoğunluğu (PSD): Sinyalin frekans başına güç dağılımı
- Zaman-Frekans Analizi: Wavelet dönüşümü, STFT ile zamanla değişen frekans içeriği
Uygulama Alanları
Sinyal işleme teknikleri şu alanlarda yaygın olarak kullanılır:
- Ses ve Müzik: Gürültü azaltma, ses tanıma, müzik bilgi erişimi
- Telekomünikasyon: Modülasyon, kodlama, kanal eşitleme
- Tıp: EKG/EEG analizi, ultrason görüntüleme
- Radar ve Sonar: Hedef tespiti, mesafe ölçümü
- Deprem Bilimi: Sismik veri analizi, yer altı yapı haritalama
Özet
Sinyal işleme ve akustik analiz, mühendisliğin pek çok dalında temel bir rol oynar. FFT ile frekans analizi, spektrogramlarla zaman-frekans görselleştirme ve dijital filtrelerle gürültü temizleme, bu alandaki en temel araçlardır. Wavelet dönüşümü, Fourier dönüşümünün ötesinde çok çözünürlüklü analiz imkanı sunarken, MFCC insan işitme sistemini modelleyerek ses tanıma uygulamalarının temelini oluşturur. Python ekosistemi — NumPy, SciPy, librosa, PyWavelets — bu teknikleri hızlı ve etkili bir şekilde uygulamayı mümkün kılar. Sualtı akustik iletişim gibi zorlu alanlarda bile sinyal işleme ve yapay zeka tekniklerinin birleşimi, %90'ın üzerinde doğruluk oranlarına ulaşmayı sağlar.
İlgili Makaleler
Makine Öğrenmesi Nedir? Python ile Temel Kavramlar ve İlk Model
Makine öğrenmesine giriş. Supervised, unsupervised ve reinforcement learning kavramları. Python, NumPy ve Scikit-learn ile ilk model.
CNN ile Derin Öğrenme: Convolutional Neural Network Rehberi
Convolutional Neural Network (CNN) mimarisi ve derin öğrenme. Convolution, pooling, fully connected katmanlar ve görüntü sınıflandırma.
TensorFlow ile Model Eğitimi: Veri Hazırlama, Eğitim ve Değerlendirme
TensorFlow ve Keras ile model eğitimi rehberi. Veri ön işleme, model tasarımı, eğitim döngüsü, hiperparametre ayarı ve model değerlendirme.
Flutter Projeniz mi Var?
iOS, Android ve web için yüksek performanslı Flutter uygulamaları geliştiriyorum.
İletişime Geç