AI & Machine Learning

Sinyal İşleme ve Akustik Veri Analizi: Python ile Pratik Rehber

13 dk okuma20 Mart 2026
Sinyal işlemeSignal processingAkustik analizFFTSpektrogramPython sinyal işlemeGürültü filtrelemeSualtı akustikNumPy signalScipy signalAkustik iletişimUnderwater acoustics

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:

python
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:

python
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:

python
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.

python
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).

python
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.

python
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_sinyal

Sualtı 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

Flutter Projeniz mi Var?

iOS, Android ve web için yüksek performanslı Flutter uygulamaları geliştiriyorum.

İletişime Geç