jak obliczyć SNR szumu?

14

Mam problemy ze zrozumieniem, jak to zrobić praktycznie

Mam plik wav, który zawiera czystą mowę i inny plik ave, który zawiera tylko szum tła (mogą to być różne rzeczy, takie jak biały szum, hałas tłumu, nagranie wiejącego wiatru itp.). Są to albo wyłącznie mowa, albo wyłącznie szum. Więc przypuszczam, że mogę uzyskać od nich wartość SNR poprzez prosty podział odpowiadających próbek (lub średniej liczby próbek) w obu plikach. Następnie łączę je w zuchwałości, aby uzyskać głośny plik mowy. Zgaduję, że ten plik nadal będzie miał ten sam SNR.

Teraz przekazuję ten plik przez mój program redukcji szumów i uzyskuję w rezultacie inny plik. Jak obliczyć SNR tego pliku „zmniejszonego hałasu”?

--- EDYTOWAĆ ---

pytanie uzupełniające opublikowane TUTAJ

użytkownik13267
źródło

Odpowiedzi:

8

Powszechną definicją SNR jest moc pożądanego sygnału podzielona przez moc szumu. Załóżmy, że uzyskałeś pożądany sygnał szumu jako tablice, obliczenie SNR w Matlabie przed redukcją szumów można wykonać w następujący sposób:

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

Po redukcji szumów hałas resztkowy można obliczyć jako różnicę sygnału pożądanego i sygnału rzeczywistego. Obliczanie SNR jest zatem proste:

residual_noise = signal - noise_reduced_signal; 
snr_after = mean( signal .^ 2 ) / mean( residual_noise .^ 2 ); 
snr_after_db = 10 * log10( snr_after )
Deve
źródło
1
Signal and Noise_reduced_signal musi być wyrównany czasowo w twoim przypadku.
dspGuru,
@dspGuru Prawda, założyłem, że algorytm redukcji szumów nie wprowadza opóźnienia czasowego.
Deve,
@DspGuru i Dev: W tych miejscach, zamiast brać zmienną i średnią całego sygnału, co jeśli podam pewną część sygnału, która zdecydowanie zawiera mowę? Dla s \ przykład zamień sygnał na sygnał (mowa_początkowa: mowa_końcowa) w Matlabie, ponieważ mój sygnał ma długość 5 sekund z pauzą między słowami
13267
@ user13267 Który sygnał? Przed czy po redukcji hałasu? Ogólnie rzecz biorąc, im dłuższy sygnał, który analizujesz, tym lepsza będzie Twoja ocena SNR.
Deve
oboje. Chodzi mi o to, że moja próbka dźwięku ma krótkiego zdania, więc kiedy otwieram go w zuchwałości, widzę obszary o wysokiej intensywności i niskiej intensywności fali (myślę, że słowa i cisza między słowami). Chcę tylko wybrać próbki zawierające słowa, a nie próbki zawierające ciszę.
user13267,
3

Po stronie wejściowej:

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

SNR wynosi = DB2 - DB1

Po stronie wyjściowej:

  1. Wyślij czysty sygnał mowy przez swój system tłumienia hałasu. Oznacz wyjście Y1.
  2. Wyślij hałaśliwy sygnał mowy przez swój tłumik hałasu. Oznacz to wyjście Y2.
  3. Oblicz Z = Y2 - Y1
  4. residualNoiseDB = 10 * log10 (var (Z))
  5. speechDB = 10 * log10 (var (Y1))
  6. SNR = speechDB - residualNoiseDB
dspGuru
źródło
Czy naprawdę konieczne jest również przekazanie czystego sygnału mowy przez algorytm redukcji szumów? Czy sygnał mowy nie powinien być taki sam przed algorytmem redukcji szumów i po nim, abyśmy mieli wspólny punkt odniesienia?
user13267,
To całkowicie zależy od twojego algorytmu. Najprawdopodobniej wyjście nie będzie pasować do czystego wejścia - z powodu opóźnienia i filtrowania.
dspGuru
Sygnał wyjściowy (gdy czysta mowa jest przekazywana przez algorytm redukcji szumów) faktycznie nie pasuje do wejścia, ale jestem pewien, że algorytm nie wprowadza żadnych opóźnień. Sprawdź moje pytanie kontrolne (link został edytowany w tym pytaniu). Ma kształty fali czystej mowy przed redukcją szumów (u góry rysunku) i po redukcji szumów (u dołu rysunku). Nie ma opóźnienia, ale jest bardzo duże wzmocnienie i część mowy została odfiltrowana.
user13267,