Hướng dẫn add noise to audio python - thêm tiếng ồn vào trăn âm thanh

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 SNR

Trong đó 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 AWGN

Từ 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_required

Nế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.

Cuối cùng chúng ta có thể thêm nhiễu vào tín hiệu bằng cách

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ệu

Chú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 https://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]

Hướng dẫn add noise to audio python - thêm tiếng ồn vào trăn âm thanh

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()

Hướng dẫn add noise to audio python - thêm tiếng ồn vào trăn âm thanh

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()

Hướng dẫn add noise to audio python - thêm tiếng ồn vào trăn âm thanh

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()

Hướng dẫn add noise to audio python - thêm tiếng ồn vào trăn âm thanh

Làm thế nào để bạn tạo ra tiếng ồn trong Python?

Làm thế nào để bạn thêm nhiễu vào tín hiệu trong Python ?..
print(original).
tiếng ồn = np.ngẫu nhiên.Bình thường (0, .1, bản gốc. Hình dạng).
new_signal = gốc + nhiễu ..
print(new_signal).

Làm cách nào để thêm âm thanh vào tệp âm thanh?

1] Audacity..
Tải xuống và cài đặt Audacity ..
Mở giao diện của Audacity ..
Nhập tệp âm thanh ..
Thêm bản nhạc Lớp phủ mới vào âm thanh và chọn nó ..
Chuyển đến menu Tạo và chọn tùy chọn nhiễu ..
Chọn tiếng ồn trắng làm loại nhiễu ..
Điều chỉnh biên độ và thời lượng của nhiễu ..

Làm thế nào để bạn thêm tiếng ồn trắng trong Python?

Thông thường ngẫu nhiên Numpy tạo ra một mảng các số ngẫu nhiên được phân phối bình thường. Đối số LỘC là giá trị trung bình và đối số tỷ lệ là độ lệch chuẩn.Đây là một cách để tạo ra một chuỗi tiếng ồn trắng. The loc argument is the mean and the scale argument is the standard deviation. This is one way to generate a white noise series.