gürültülü sinyalin SNR'sini nasıl hesaplayabilirim?


14

Pratik olarak nasıl yapılacağını anlamada sorunlar yaşıyorum

Saf konuşma içeren bir wav dosyası ve sadece arka plan gürültüsünü içeren başka bir ave dosyası var (beyaz gürültü, kalabalık gürültüsü, esen rüzgar kaydı gibi çeşitli şeyler olabilir). Bunlar ya tamamen konuşma ya da tamamen gürültüdür. Bu yüzden her iki dosyada karşılık gelen örneklerin (veya örneklerin karesinin ortalamasının) basit bir şekilde bölünmesiyle onlardan bir SNR değeri alabileceğimi varsayalım. Daha sonra gürültülü bir konuşma dosyası almak için onları cesaretle birleştiriyorum. Bu dosyanın hala aynı SNR'ye sahip olacağını tahmin ediyorum.

Şimdi bu dosyayı gürültü azaltma programımdan geçiriyorum ve sonuç olarak başka bir dosya alıyorum. Bu "gürültü azaltılmış" dosyanın SNR'sini nasıl hesaplayabilirim?

--- DÜZENLE ---

BURAYA gönderilen takip sorusu

Yanıtlar:


8

SNR'nin genel tanımı, istenen sinyalin gücünün gürültü gücüne bölünmesidir. İstediğiniz ve gürültü sinyalini diziler olarak aldığınızı varsayalım, gürültü azaltmadan önce Matlab'da SNR hesaplaması şu şekilde yapılabilir:

snr_before = mean( signal .^ 2 ) / mean( noise .^ 2 );
snr_before_db = 10 * log10( snr_before ) % in dB

Gürültü azaltmadan sonra, artık gürültü istenen sinyalin ve gerçek sinyalin farkı olarak hesaplanabilir. SNR'nin hesaplanması basittir:

residual_noise = signal - noise_reduced_signal; 
snr_after = mean( signal .^ 2 ) / mean( residual_noise .^ 2 ); 
snr_after_db = 10 * log10( snr_after )

1
sinyal ve noise_reduced_signal sizin durumunuzda zamana göre ayarlanmalıdır.
dspGuru

@ dspGuru Doğru, gürültü azaltma algoritmasının zaman gecikmesi getirmediğini varsaydım.
Deve

@DspGuru ve Dev: Bu yerlerde, tüm sinyalin var ve ortalamasını almak yerine, sinyalin kesinlikle konuşma içeren bir kısmını belirtirsem ne olur? S \ örneği için, sinyali Matlab'daki sinyale (start_speech: end_speech) değiştirin, çünkü sinyalim 5 saniye uzunluğunda, kelimeler arasında duraklama var
user13267

@ user13267 Hangi sinyalden? Gürültü azaltmadan önce mi sonra mı? Genel olarak analiz ettiğiniz sinyal ne kadar uzun olursa SNR tahmininiz o kadar iyi olur.
Deve

Bunların her ikisi de. Demek istediğim, ses örneğimde kısa bir cümle konuşan bir tane var, bu yüzden onu cüretle açtığımda dalga formu yüksek yoğunluklu ve düşük yoğunluklu alanları (kelimelerin varlığı ve sanırım kelimeler arasında sessizlik) görebiliyorum. Bu yüzden sadece kelimeler içeren ve sessizlik içeren örnekleri içermeyen örnekleri seçmek istiyorum.
user13267

3

Giriş tarafında:

  1. DB1 = 10 * log10 hesapla (var (noiseSignal))
  2. DB2 = 10 * log10 hesapla (var (cleanSpeechSignal))

SNR = DB2 - DB1

Çıktı tarafında:

  1. Gürültü önleme algo aracılığıyla temiz konuşma sinyali gönderin. Y1 çıkışını belirtin.
  2. Gürültülü konuşma sinyalini gürültü bastırma algo aracılığıyla gönderin. Y2 çıkışını belirtin.
  3. Z = Y2 - Y1 hesapla
  4. residualNoiseDB = 10 * log10 (var (Z))
  5. speechDB = 10 * log10 (var (Y1))
  6. SNR = konuşmaDB - artık GürültüDB

Temiz konuşma sinyalini gürültü azaltma algoritmasından da geçirmek gerçekten gerekli mi? Ortak bir referans noktamız olması için, konuşma sinyali gürültü azaltma algoritmasından önce ve sonra aynı olmamalı mı?
user13267

Bu tamamen algoritmanıza bağlıdır. Büyük olasılıkla çıktı, gecikme ve filtreleme nedeniyle temiz girdiyle eşleşmez.
dspGuru

Çıktı (temiz konuşma gürültü azaltma algoritmasından geçtiğinde) gerçekten girişle eşleşmez, ancak algoritmanın herhangi bir gecikme yapmadığından eminim. Lütfen takip sorumu kontrol edin (bağlantı bu soruya düzenlendi). Gürültü azaltmadan önce (şeklin üstünde) ve gürültü azaltmadan sonra (şeklin altında) temiz konuşma dalga formlarına sahiptir. Gecikme yok ama çok yüksek amplifikasyon var ve konuşmanın bir kısmı filtrelendi.
user13267 15:12
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.