Làm cách nào để tính SNR của tín hiệu nhiễu?


14

Tôi đang gặp vấn đề trong việc hiểu làm thế nào để làm điều đó một cách thực tế

Tôi có một tệp wav chứa lời nói thuần túy và một tệp ave khác chỉ chứa tiếng ồn nền (có thể là nhiều thứ khác nhau, chẳng hạn như tiếng ồn trắng, tiếng ồn đám đông, bản ghi gió thổi, v.v.). Đây là những lời nói hoàn toàn hoặc tiếng ồn thuần túy. Vì vậy, tôi cho rằng tôi có thể nhận được giá trị SNR từ chúng bằng cách phân chia đơn giản các mẫu tương ứng (hoặc trung bình của một khung mẫu) trong cả hai tệp. Sau đó, tôi kết hợp chúng trong táo bạo để có được một tập tin ồn ào. Tôi đoán tập tin này sẽ vẫn có cùng SNR.

Bây giờ tôi chuyển tập tin này thông qua chương trình giảm tiếng ồn của mình và kết quả là nhận được một tập tin khác. Làm cách nào để tính SNR của tệp "giảm nhiễu" này?

--- BIÊN TẬP ---

câu hỏi tiếp theo được đăng tải TẠI ĐÂY

Câu trả lời:


8

Định nghĩa chung của SNR là công suất của tín hiệu mong muốn chia cho công suất nhiễu. Giả sử bạn đã thu được tín hiệu mong muốn và tín hiệu nhiễu dưới dạng mảng, tính toán SNR trong Matlab trước khi giảm nhiễu có thể được thực hiện như sau:

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

Sau khi giảm nhiễu, nhiễu dư có thể được tính là chênh lệch của tín hiệu mong muốn và tín hiệu thực tế. Tính toán SNR sau đó rất đơn giản:

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

1
signal và noise_reduces_signal phải được căn chỉnh theo thời gian trong trường hợp của bạn.
dspGuru

@dspGuru Đúng, tôi giả sử rằng thuật toán giảm nhiễu không gây ra độ trễ về thời gian.
Deve

@DspGuru và Dev: Ở những nơi này, thay vì lấy var và giá trị trung bình của toàn bộ tín hiệu, điều gì sẽ xảy ra nếu tôi chỉ định một phần tín hiệu chắc chắn có chứa lời nói? Ví dụ: thay thế tín hiệu bằng tín hiệu (start_speech: end_speech) trong Matlab, vì tín hiệu của tôi dài 5 giây với tạm dừng giữa các từ
user13267

@ user13267 Tín hiệu nào? Trước hay sau giảm tiếng ồn? Nói chung, tín hiệu bạn phân tích càng dài sẽ càng tốt cho ước tính SNR của bạn.
Deve

cả hai. Ý tôi là, mẫu âm thanh của tôi có một câu nói ngắn gọn nên khi tôi mở nó trong âm thanh, tôi có thể thấy các vùng cường độ cao và cường độ thấp (sự hiện diện của từ và khoảng lặng giữa các từ tôi nghĩ). Vì vậy, tôi chỉ muốn chọn những mẫu có chứa từ và không bao gồm những mẫu có chứa khoảng im lặng.
dùng13267

3

Về phía đầu vào:

  1. Tính toán DB1 = 10 * log10 (var (noiseSignal))
  2. Tính toán DB2 = 10 * log10 (var (cleanSpeechSignal))

SNR là = DB2 - DB1

Về phía đầu ra:

  1. Gửi tín hiệu lời nói sạch thông qua thuật toán khử tiếng ồn của bạn. Suy ra đầu ra Y1.
  2. Gửi tín hiệu tiếng ồn thông qua thuật toán khử tiếng ồn của bạn. Suy ra rằng đầu ra Y2.
  3. Tính Z = Y2 - Y1
  4. phần dưNatyDB = 10 * log10 (var (Z))
  5. speechDB = 10 * log10 (var (Y1))
  6. SNR = speechDB - ResidNNDB

Có thực sự cần thiết phải truyền tín hiệu giọng nói sạch thông qua thuật toán giảm nhiễu không? Không phải tín hiệu giọng nói giống nhau trước và sau thuật toán giảm nhiễu để chúng ta có một điểm tham chiếu chung?
user13267

Điều đó hoàn toàn phụ thuộc vào thuật toán của bạn. Nhiều khả năng đầu ra sẽ không khớp với đầu vào sạch - do độ trễ và quá trình lọc.
dspGuru

Đầu ra (khi lời nói sạch được chuyển qua thuật toán giảm nhiễu) thực sự không khớp với đầu vào, nhưng tôi khá chắc chắn rằng thuật toán không đưa ra bất kỳ độ trễ nào. Vui lòng kiểm tra câu hỏi tiếp theo của tôi (liên kết đã được chỉnh sửa thành câu hỏi này). Nó có dạng sóng của giọng nói sạch trước (giảm đỉnh của hình) và giảm nhiễu sau (dưới cùng của hình). Không có độ trễ nhưng có độ khuếch đại rất cao và một số bài phát biểu đã được lọc ra.
user13267
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.