Bài viết này thảo luận về cách thêm tiếng ồn vào dữ liệu âm thanh [hoặc bất kỳ dữ liệu nào khác]. Điều này có thể quan trọng đối với nhiều ứng dụng như đánh giá hiệu suất của các mô hình học máy.
Ví dụ, một mô hình học tập sâu để phân loại dữ liệu âm thanh có thể bị ảnh hưởng bởi tiếng ồn. Vì vậy, chúng ta có thể thay đổi các mẫu tín hiệu ban đầu với tiếng ồn về tín hiệu khác nhau so với tỷ lệ nhiễu và đánh giá hiệu suất của mô hình trong các điều kiện ồn ào này.
Để đọc Audio .wav vào một mảng từ tệp, chúng ta có thể sử dụng mã bên dưới. Tôi đã sử dụng Python cho các ví dụ được hiển thị ở đây
import librosasignal, sr = librosa.load[“path/to/audio.wav”]
Để có được một âm mưu của tín hiệu tôi đã sử dụng cho các thí nghiệm này [tôi nói rằng hãy để con chó của tôi một mình!
import matplotlib.pyplot as pltplt.plot[signal]plot của tín hiệu
Tỷ lệ tín hiệu trên nhiễu
Tỷ lệ tín hiệu trên nhiễu [SNR] có thể được xác định như sau:
Định nghĩa của SNRTrong đó rms_signal là giá trị rms của tín hiệu và rms_noise là tiếng ồn. Nhật ký là logarit của 10
Chúng ta có thể sử dụng mã bên dưới để tính giá trị rms của tín hiệu
import numpy as npRMS=math.sqrt[np.mean[signal**2]]
Bây giờ là lúc để thêm một số tiếng ồn vào tín hiệu
Chúng tôi mô tả 2 loại tiếng ồn có thể được thêm vào dữ liệu âm thanh
- Phụ gia Trắng Gaussian Tiếng ồn [AWGN]
- Tiếng ồn thế giới thực
Vui lòng tham khảo repo GitHub sau đây cho mã
Phụ gia Trắng Gaussian Tiếng ồn [AWGN]
Tiếng ồn thế giới thực
Vui lòng tham khảo repo GitHub sau đây cho mã
Loại nhiễu này có thể được thêm vào [bổ sung phần tử số học] vào tín hiệu. Ngoài ra, giá trị trung bình của nó là 0 [được lấy mẫu ngẫu nhiên từ phân phối Gaussian với giá trị trung bình là độ lệch chuẩn có thể thay đổi]. Nó chứa tất cả các thành phần tần số theo cách bình đẳng [do đó là tiếng ồn trắng].
AWGN rất quan trọng vì việc mô hình hóa dễ dàng hơn cho các phân tích phân tích và nó dễ dàng hơn để tạo ra. Nhưng nó có thể không đại diện cho các điều kiện tiếng ồn thực tế cho một số ứng dụng.
Từ mã trong repo github, chúng ta có thể sử dụng chức năng get_white_noise để tạo ra AWGN của SNR mong muốn. Điều này có giá trị trung bình khoảng 0,0
Cách tạo AWGNTừ phương trình định nghĩa SNR, chúng ta có thể có được
Also,
Giá trị RMS bắt buộc của tiếng ồn
Ở đây RMS_RAIQUIRED là RMS yêu cầu của tiếng ồn mà chúng ta nên tạo ra.
Ở đây std_noise là độ lệch chuẩn của tiếng ồn.
noise=np.random.normal[0, STD_n, signal.shape[0]]
Vì giá trị trung bình của AWGN bằng 0, chúng ta có thể thấy rằng
Để tạo nhiễu, chúng ta có thể lấy mẫu từ phân phối Gaussian với mean = 0 và độ lệch chuẩn = rms_requiredNếu chúng ta vẽ sơ đồ AWGN mà chúng ta đã tạo ra,
Âm mưu tiếng ồn
Phân tích tần số của AWGNĐể phân tích nội dung tần số, chúng tôi sử dụng chuyển đổi Fourier nhanh [tham khảo mã]
X=np.fft.rfft[noise]radius,angle=to_polar[X]Phân phối tiếng ồn
signal_noise = signal+noise
Chúng ta có thể thấy rằng AWGN mà chúng ta tạo ra có phân phối tần số hơi bằng nhau. Điều này thỏa mãn điều kiện trắng của người Viking đối với AWGN.
trong đó tín hiệu là tín hiệu tăng cường tiếng ồn
Tín hiệu được thêm tiếng ồn [SNR = 10]
Pha trộn với tiếng động thế giới thực
Ở đây chúng tôi không tạo ra bất kỳ dữ liệu. Thay vào đó, chúng tôi sử dụng một clip âm thanh khác có chứa nhiễu. Chính xác thì chúng tôi có nghĩa là gì bởi tiếng ồn phụ thuộc vào ứng dụng cụ thể.
Điều gì xảy ra nếu chúng ta nhân toàn bộ tín hiệu [phần tử khôn ngoan] với một hằng số [nói là A A]? Giá trị RMS của nó được nhân lên bởi một cách khác nhau theo phương trình dưới đây.
Thay đổi giá trị RMS của tín hiệuChúng ta có thể tính toán rms_noise bằng cách sử dụng clip nhiễu được cung cấp. Sau đó, chúng ta có thể tìm thấy các hằng số A A, bằng cách sử dụng phương trình trên. Sau đó, chúng ta có thể sửa đổi nhiễu bằng cách nhân nó với phần tử của một phần tử.
Clip âm thanh tiếng ồn tôi đã sử dụng [nước chạy từ vòi]:
Tiếng ồn của tín hiệu tăng cường nước [SNR = 10]Để nghe tín hiệu và tiếng ồn tôi đã sử dụng và cả các tệp âm thanh được thêm tiếng ồn được tạo bằng cách thêm nhiễu vào tín hiệu, hãy truy cập
Cảm ơn vì đã đọc!! Vui lòng để lại nhận xét/phản hồi !!!
Theo dõi tôi trên Twitter //twitter.com/lahirunuwan
LinkedIn: www.linkedin.com/in/lahiru-nuwan-59568a88
Đối với những người cố gắng tạo kết nối giữa SNR và biến ngẫu nhiên thông thường được tạo bởi Numpy:
[1], nơi điều quan trọng là phải nhớ rằng P là sức mạnh trung bình., where it's important to keep in mind that P is average power.
Hoặc trong db: [2]
[2]
Trong trường hợp này, chúng tôi đã có một tín hiệu và chúng tôi muốn tạo tiếng ồn để cung cấp cho chúng tôi một SNR mong muốn.
Mặc dù tiếng ồn có thể có các hương vị khác nhau tùy thuộc vào những gì bạn đang mô hình hóa, nhưng một khởi đầu tốt [đặc biệt đối với ví dụ về kính viễn vọng radio này] là tiếng ồn Gaussian trắng phụ gia [AWGN]. Như đã nêu trong các câu trả lời trước, để mô hình AWGN, bạn cần thêm biến ngẫu nhiên Gaussian không trung bình vào tín hiệu ban đầu của bạn. Phương sai của biến ngẫu nhiên đó sẽ ảnh hưởng đến công suất nhiễu trung bình.
Đối với biến ngẫu nhiên của Gaussian X, công suất trung bình, còn được gọi là khoảnh khắc thứ hai, là [3], also known as the second moment, is
[3]
Vì vậy, đối với nhiễu trắng, và công suất trung bình sau đó bằng phương sai. and the average power is then equal to the variance .
Khi mô hình hóa điều này trong Python, bạn có thể 1. Tính phương sai dựa trên SNR mong muốn và một tập hợp các phép đo hiện có, sẽ hoạt động nếu bạn mong đợi các phép đo của mình có giá trị biên độ khá phù hợp. 2. Ngoài ra, bạn có thể đặt nguồn nhiễu ở mức đã biết để phù hợp với một cái gì đó như tiếng ồn của máy thu. Tiếng ồn có thể được đo bằng cách chỉ kính viễn vọng vào không gian trống và tính toán công suất trung bình.
1. Calculate variance based on a desired SNR and a set of existing measurements, which would work if you expect your measurements to have fairly consistent amplitude values.
2. Alternatively, you could set noise power to a known level to match something like receiver noise. Receiver noise could be measured by pointing the telescope into free space and
calculating average power.
Dù bằng cách nào, điều quan trọng là đảm bảo rằng bạn thêm nhiễu vào tín hiệu của mình và lấy trung bình trong không gian tuyến tính chứ không phải trong các đơn vị DB.
Dưới đây là một số mã để tạo ra một điện áp tín hiệu và âm mưu, công suất trong watts và năng lượng trong db:
# Signal Generation
# matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
t = np.linspace[1, 100, 1000]
x_volts = 10*np.sin[t/[2*np.pi]]
plt.subplot[3,1,1]
plt.plot[t, x_volts]
plt.title['Signal']
plt.ylabel['Voltage [V]']
plt.xlabel['Time [s]']
plt.show[]
x_watts = x_volts ** 2
plt.subplot[3,1,2]
plt.plot[t, x_watts]
plt.title['Signal Power']
plt.ylabel['Power [W]']
plt.xlabel['Time [s]']
plt.show[]
x_db = 10 * np.log10[x_watts]
plt.subplot[3,1,3]
plt.plot[t, x_db]
plt.title['Signal Power in dB']
plt.ylabel['Power [dB]']
plt.xlabel['Time [s]']
plt.show[]
Dưới đây là một ví dụ để thêm AWGN dựa trên SNR mong muốn:
# Adding noise using target SNR
# Set a target SNR
target_snr_db = 20
# Calculate signal power and convert to dB
sig_avg_watts = np.mean[x_watts]
sig_avg_db = 10 * np.log10[sig_avg_watts]
# Calculate noise according to [2] then convert to watts
noise_avg_db = sig_avg_db - target_snr_db
noise_avg_watts = 10 ** [noise_avg_db / 10]
# Generate an sample of white noise
mean_noise = 0
noise_volts = np.random.normal[mean_noise, np.sqrt[noise_avg_watts], len[x_watts]]
# Noise up the original signal
y_volts = x_volts + noise_volts
# Plot signal with noise
plt.subplot[2,1,1]
plt.plot[t, y_volts]
plt.title['Signal with noise']
plt.ylabel['Voltage [V]']
plt.xlabel['Time [s]']
plt.show[]
# Plot in dB
y_watts = y_volts ** 2
y_db = 10 * np.log10[y_watts]
plt.subplot[2,1,2]
plt.plot[t, 10* np.log10[y_volts**2]]
plt.title['Signal with noise [dB]']
plt.ylabel['Power [dB]']
plt.xlabel['Time [s]']
plt.show[]
Và đây là một ví dụ để thêm AWGN dựa trên sức mạnh tiếng ồn đã biết:
# Adding noise using a target noise power
# Set a target channel noise power to something very noisy
target_noise_db = 10
# Convert to linear Watt units
target_noise_watts = 10 ** [target_noise_db / 10]
# Generate noise samples
mean_noise = 0
noise_volts = np.random.normal[mean_noise, np.sqrt[target_noise_watts], len[x_watts]]
# Noise up the original signal [again] and plot
y_volts = x_volts + noise_volts
# Plot signal with noise
plt.subplot[2,1,1]
plt.plot[t, y_volts]
plt.title['Signal with noise']
plt.ylabel['Voltage [V]']
plt.xlabel['Time [s]']
plt.show[]
# Plot in dB
y_watts = y_volts ** 2
y_db = 10 * np.log10[y_watts]
plt.subplot[2,1,2]
plt.plot[t, 10* np.log10[y_volts**2]]
plt.title['Signal with noise']
plt.ylabel['Power [dB]']
plt.xlabel['Time [s]']
plt.show[]