
Мультимедиа4
.docxГУАП
КАФЕДРА № 41
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
доц., к.т.н., доц. |
|
|
|
О.О. Жаринов |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №4 |
Применение формирующих фильтров для создания шумоподобных аудиосигналов |
по курсу: МУЛЬТИМЕДИА ТЕХНОЛОГИИ |
|
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ гр. № |
4116 |
|
|
|
|
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2025
Цель работы: изучить методологию создания шумоподобных сигналов на основе формирующих фильтров
Краткие теоретические сведения
Использование фильтров в мультимедиа при обработке аудиосигналов не ограничивается только трансформацией свойств речевых, музыкальных и иных записей. Заметное место в мультимедиа отводится имитационному моделированию разнообразных шумовых эффектов (например, звуки природы, звуки технологических процессов и т. п.). При этом возможны два принципиально различных подхода: в первом имитационные модели звуков создаются посредством комбинаций детерминированных функций, во втором – с помощью случайных процессов с существенно неравномерным спектром. Ярким примером первого подхода является “графический калькулятор”, в составе которого в числе прочего имеются средства частотной модуляции несущей посредством величины функции, рассчитанной для некоторой последовательности аргументов. Методом частотной модуляции можно создать разнообразные экзотические “поющие” звуки, напоминающие звучание терменвокса. Второй подход к созданию аудиодорожек предназначен для создания звуков, в которых нет ярко выраженного основного тона. Одним из возможных подходов к созданию таких шумоподобных аудиосигналов является метод формирующего фильтра. Основная идея метода заключается в пропускании через фильтр сигнала от искусственного создаваемого источника белого шума (БШ). В зависимости от свойств применяемого фильтра выходной сигнал оказывается “спектрально окрашенным”, что порождает специфические слуховые ощущения. Например, если применить полосовой фильтр с узкой полосой, то выходной шум будет восприниматься как “звенящий”, если применить фильтр нижних частот (lowpass), то аудиосигнал на выходе представляет собой глухой шум, напоминающий, в зависимости от параметров фильтра, шум водопада, фонтана, шелест листвы, и т.д.
Смешивание нескольких шумов в разных пропорциях, а также динамическое изменение интенсивности одного или нескольких процессов значительно увеличивающих разнообразие формируемых звуковых эффектов.
Ход работы
Для начала проведено исследование трех формирующих фильтров для создания шумоподобных сигналов. В качестве исходного сигнала используется белый шум, генерируемый с помощью равномерного распределения в диапазоне от -1 до 1.
Первым выбран фильтр нижних частот (ФНЧ) Баттерворта пятого порядка с частотой среза 700 Гц, которая определяет, какие частоты будут доминировать в выходном сигнале. При прослушивании выходного сигнала, можно сказать, что он напоминает звук при полете в самолете, однако, если понизить порядок фильтра до 2, то сигнал становится походим на шум океана. Фильтр второго порядка сохраняет часть высокочастотных компонентов.
Прослушать звуки можно по данным ссылкам
Звук полета на самолете: https://disk.yandex.ru/d/6lep5s0fTuPUFg
Звук океана: https://disk.yandex.ru/d/sgMtRwHdyfOiSw
Для второго фильтра выбран полосовой фильтр Чебышева 1-го рода. Фильтр Чебышева типа 1 допускает рябь в полосе пропускания. Это означает, что амплитудно-частотная характеристика будет иметь небольшие колебания в пределах полосы пропускания. Установлены параметры для фильтра, частота 130 Гц, вокруг которой будет сосредоточена полоса пропускания фильтра. Ширина полосы установлена на 15 Гц. Рябь в полосе пропускания установлена на 20 дБ. На слух сигнал похож на отдаленное жужжание роя насекомых. Если же попробовать увеличить ширину полосы пропускания и немного увеличить центральную частоту, то получиться сигнал похожий на звук снежной бури, рябь создает случайные порывы ветра, которые создают "рваный" и нестабильный звук. Ссылка для прослушивания звука жужжания: https://disk.yandex.ru/d/zxVxehbZIKaqOA
Ссылка для прослушивания звука бури: https://disk.yandex.ru/d/4f0L8DQRY229gQ
Третий фильтр демонстрирует применение Фурье-фильтра с прямоугольной амплитудно-частотной характеристикой. Заданы два диапазона частот, которые будут пропускаться 100-1700 Гц и 5000-6000 Гц. В отличие от предыдущих фильтров, здесь фильтрация осуществляется в частотной области путем умножения спектра сигнала на передаточную функцию. Звук, полученный после применения Фурье-фильтра в зависимости от заданных параметров может напоминать фоновый шум от езды машин. Ссылка для прослушивания: https://disk.yandex.ru/d/Ld5myVLvN9KisQ
Для визуализации работы фильтров, построены графики амплитудных спектров ивыхордных сигналов, временные графики и спектограммы. (Рисунок 1-3).Программа наглядно демонстрирует, как различные типы фильтров могут преобразовывать белый шум в звуки с разными спектральными характеристиками и, соответственно, разным восприятием.
Листинг 1 –Программа реализации фильтров и построения графиков
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
import soundfile as sf
from scipy.signal.windows import gaussian
plt.close('all')
# Параметры генерации
Fd = 44100 # Частота дискретизации
T = 10 # Длительность сигнала
N = int(T * Fd)
t = np.linspace(0, T, N)
# белый шум
x = np.random.uniform(low=-1.0, high=1.0, size=N)
# Нормализация
Norm = np.max(np.abs(x))
if Norm != 0:
x = x / Norm
# ФНЧ Баттерворта
f = 700 # Частота среза
order = 5 # Порядок фильтра
sos = signal.butter(order, f / (Fd/2), btype='lowpass', output='sos')
y1 = signal.sosfilt(sos, x)
y1 = y1 / np.max(np.abs(y1))
# Полосовой фильтр Чебышева типа I
f0 = 200 # Центральная частота
bandwidth = 100 # Ширина полосы
ripple = 20 # Рябь в полосе пропускания в дБ
order = 7 # Порядок фильтра
sos = signal.cheby1(order, ripple, [(f0 - bandwidth/2) / (Fd/2), (f0 + bandwidth/2) / (Fd/2)], btype='bandpass', output='sos')
y2 = signal.sosfilt(sos, x)
y2 = y2 / np.max(np.abs(y2))
# Фурье-фильтр с прямоугольной АЧХ
X = np.fft.fft(x)
f1, f2 = 100, 1700
f3, f4 = 5000, 6000
n1 = round(N * f1 / Fd)
n2 = round(N * f2 / Fd)
n3 = round(N * f3 / Fd)
n4 = round(N * f4 / Fd)
W = np.zeros_like(X, dtype=float)
W[n1:n2 + 1] = 1.0 # первый диапазон
W[N - n2:N - n1 + 1] = 1.0 # зеркальная часть первого диапазона
W[n3:n4 + 1] = 1.0 # второй диапазон
W[N - n4:N - n3 + 1] = 1.0 # зеркальная часть второго диапазона
# Применяем фильтр
Spectr_output = X * W
# Обратное БПФ от модифицированного спектра
y3 = np.real(np.fft.ifft(Spectr_output))
y3 = y3 / np.max(np.abs(y3)) # Нормализация
# Построение спектров
f = np.arange(0, Fd/2, Fd/N)
Spectr_input = np.fft.fft(x)
AS_input = np.abs(Spectr_input)
eps = np.max(AS_input) * 1.0e-9
S_dB_input = 20 * np.log10(AS_input[:len(f)] + eps)
Spectr1 = np.fft.fft(y1)
Spectr2 = np.fft.fft(y2)
Spectr3 = np.fft.fft(y3)
S_dB1 = 20 * np.log10(np.abs(Spectr1[:len(f)]) + eps)
S_dB2 = 20 * np.log10(np.abs(Spectr2[:len(f)]) + eps)
S_dB3 = 20 * np.log10(np.abs(Spectr3[:len(f)]) + eps)
# График спектров всех сигналов
plt.figure(figsize=(12, 6))
plt.semilogx(f, S_dB_input, 'gray', label='Белый шум', alpha=0.5)
plt.semilogx(f, S_dB1, 'lime', label='ФНЧ', linewidth=2)
plt.semilogx(f, S_dB3, 'indigo', label='Фурье', linewidth=2)
plt.semilogx(f, S_dB2, 'red', label='Фильтр Чебышева', linewidth=2)
plt.grid(True)
plt.minorticks_on()
plt.grid(True, which='major', color='#444', linewidth=1)
plt.grid(True, which='minor', color='#aaa', ls=':')
plt.axvline(x=400, color='blue', linestyle='--', alpha=0.5, label='400 Гц')
plt.axvline(x=700, color='red', linestyle='--', alpha=0.5, label='700 Гц')
plt.axvline(x=3000, color='green', linestyle='--', alpha=0.5, label='3000 Гц')
plt.xlabel('Частота (Гц)', fontsize=12)
plt.ylabel('Уровень (дБ)', fontsize=12)
plt.title('Амплитудные спектры сигналов', fontsize=14, pad=10)
plt.legend(fontsize=10)
plt.tight_layout()
plt.show()
#Спектрограммы
plt.figure(figsize=(15, 10))
plt.subplot(2, 2, 1)
SFT = signal.stft(x, fs=Fd, nperseg=1024)
Sx = np.abs(SFT[2])
Sx_db = 20 * np.log10(Sx + 1e-6)
plt.imshow(Sx_db, origin='lower', aspect='auto', extent=[0, T, 0, Fd/2], cmap='viridis')
plt.title('Белый шум', fontsize=12)
plt.ylabel('Частота (Гц)', fontsize=10)
plt.xlabel('Время (с)', fontsize=10)
plt.colorbar(format='%+2.0f dB')
plt.semilogy()
plt.ylim([10, Fd/2])
plt.subplot(2, 2, 2)
g_std = 0.2 * Fd
wind = gaussian(round(2 * g_std), std=g_std, sym=True)
SFT = signal.stft(y1, fs=Fd, nperseg=1024)
Sx = np.abs(SFT[2])
Sx_db = 20 * np.log10(Sx + 1e-6)
plt.imshow(Sx_db, origin='lower', aspect='auto', extent=[0, T, 0, Fd/2], cmap='viridis')
plt.title('ФНЧ', fontsize=12)
plt.ylabel('Частота (Гц)', fontsize=10)
plt.xlabel('Время (с)', fontsize=10)
plt.colorbar(format='%+2.0f dB')
plt.semilogy()
plt.ylim([10, Fd/2])
plt.subplot(2, 2, 3)
SFT = signal.stft(y2, fs=Fd, nperseg=1024)
Sx = np.abs(SFT[2])
Sx_db = 20 * np.log10(Sx + 1e-6)
plt.imshow(Sx_db, origin='lower', aspect='auto', extent=[0, T, 0, Fd/2], cmap='viridis')
plt.title('Фильтр Чебышева', fontsize=12)
plt.ylabel('Частота (Гц)', fontsize=10)
plt.xlabel('Время (с)', fontsize=10)
plt.colorbar(format='%+2.0f dB')
plt.semilogy()
plt.ylim([10, Fd/2])
plt.subplot(2, 2, 4)
SFT = signal.stft(y3, fs=Fd, nperseg=1024)
Sx = np.abs(SFT[2])
Sx_db = 20 * np.log10(Sx + 1e-6)
plt.imshow(Sx_db, origin='lower', aspect='auto', extent=[0, T, 0, Fd/2], cmap='viridis')
plt.title('Фурье-фильтр', fontsize=12)
plt.ylabel('Частота (Гц)', fontsize=10)
plt.xlabel('Время (с)', fontsize=10)
plt.colorbar(format='%+2.0f dB')
plt.semilogy()
plt.ylim([10, Fd/2])
plt.tight_layout()
plt.show()
# Сохранение файлов
sf.write('bsh.wav', x, Fd)
sf.write('f1.wav', y1, Fd)
sf.write('f2.wav', y2, Fd)
sf.write('f3.wav', y3, Fd)
# Графики временных сигналов
plt.figure(figsize=(15, 15))
plt.subplot(4, 1, 1) # 4 строки, 1 столбец, 1-й график
plt.plot(t, x, color='gray', label='Белый шум', linewidth=1)
plt.title('Сигнал белого шума', fontsize=8)
plt.ylabel('Амплитуда', fontsize=8)
plt.grid(True, alpha=0.3)
plt.legend(fontsize=9)
plt.subplot(4, 1, 2)
plt.plot(t, y1, color='lime', label='ФНЧ', linewidth=1)
plt.title('Сигнал после ФНЧ', fontsize=8)
plt.ylabel('Амплитуда', fontsize=8)
plt.grid(True, alpha=0.3)
plt.legend(fontsize=9)
plt.subplot(4, 1, 3)
plt.plot(t, y2, color='r', label='Фильтр Чебышева', linewidth=1)
plt.title('Сигнал после фильтра Чебышева', fontsize=8)
plt.ylabel('Амплитуда', fontsize=8)
plt.grid(True, alpha=0.3)
plt.legend(fontsize=9)
plt.subplot(4, 1, 4)
plt.plot(t, y3, color='indigo', label='Фурье', linewidth=1)
plt.title('Сигнал после Фурье-фильтра', fontsize=8)
plt.ylabel('Амплитуда', fontsize=8)
plt.grid(True, alpha=0.3)
plt.legend(fontsize=9)
plt.tight_layout()
plt.show()
Рисунок 1- Амплитудные спектры сигналов
Рисунок 2- Графики временных сигналов
Рисунок 3- Спектограммы исходного сигнала и сигналов после применения фильтров
По графикам видно, что все фильтры эффективно выполняют свои функции, что подтверждается изменениями в спектрах и временных сигналах.
Затем был создан звук имитирующий шум дождя. Для создания реалистичного звука используются три независимых источника белого шума. Первый источник используется для создания фонового шума дождя, второй - для модуляции интенсивности, а третий - для генерации звука отдельных капель.
Для создания основного шума дождя применяется полосовой фильтр Чебышева первого рода. фильтр имеет центральную частоту 1000 Гц и ширину полосы пропускания 700 Гц. Параметр пульсаций в полосе пропускания установлен на уровне 0.5 Дб.
Для имитации звука отдельных капель используется второй полосовой фильтр Чебышева, настроенный на более высокую центральную частоту 5000 Гц с широкой полосой пропускания 3500 Гц.
Для создания эффекта изменения интенсивности дождя применяется фильтр нижних частот Баттерворта с частотой среза 1.Гц. Данный фильтр создает эффект неравномерности дождя.
Чтобы создать звук, похожий на падающую каплю, используется алгоритм, генерирующий короткие импульсы со случайными параметрами. Каждая капля имеет случайную амплитуду в диапазоне от 0.1 до 0.3 и случайную длительность от 10 до 30 отсчетов.
Финальный звуковой сигнал формируется путем микширования всех компонентов с определенными весовыми коэффициентами. Основной шум дождя составляет 80%, высокочастотные капли - 20%, а отдельные капли добавляются с коэффициентом 0.7. Для визуализации построен амплитудный спектр (Рисунок 4).
Прослушать звук дождя можно по ссылке: https://disk.yandex.ru/d/olefMRMCGjaIUA
Листинг 2 –Программа создания шума дождя
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
import soundfile as sf
# Основные параметры
Fd = 44100
T = 10
N = round(Fd*T)
t = np.linspace(0, T, N)
# Создаем белый шум
x1 = np.random.uniform(low=-1.0, high=1.0, size=(2,N)) # для фонового шума
x2 = np.random.uniform(low=-1.0, high=1.0, size=(2,N)) # для модуляции
x3 = np.random.uniform(low=-1.0, high=1.0, size=(2,N)) # для мелких капель
# Фильтр Чебышева
f0_rain = 1000
bandwidth_rain = 700
ripple = 0.5
order = 2
sos1 = signal.cheby1(order, ripple,
[(f0_rain - bandwidth_rain/2) / (Fd/2),
(f0_rain + bandwidth_rain/2) / (Fd/2)],
btype='bandpass', output='sos')
# Фильтр для мелких капель
f0_drops = 5000
bandwidth_drops = 3500
sos3 = signal.cheby1(order, ripple,
[(f0_drops - bandwidth_drops/2) / (Fd/2),
(f0_drops + bandwidth_drops/2) / (Fd/2)],
btype='bandpass', output='sos')
# Фильтр для модуляции интенсивности
f_up2 = 1.0
sos2 = signal.butter(2, f_up2 / (Fd/2), btype='lowpass', output='sos')
y1 = signal.sosfilt(sos1, x1)
y2 = signal.sosfilt(sos2, x2)
y3 = signal.sosfilt(sos3, x3)
#случайные капли
drops_mod = np.zeros((2,N))
for n in range(0, N, 50):
if np.random.random() < 0.8: # вероятность капель
pos = n + np.random.randint(0, 50)
if pos + 30 < N:
duration = np.random.randint(10, 30)
amplitude = np.random.uniform(0.1, 0.3)
for m in range(duration):
drops_mod[:,pos+m] = amplitude * np.exp(-15*m/duration) * (1 + 0.2*np.sin(2*np.pi*10*m/duration))
# эффект изменения интенсивности дождя
intensity_mod = np.zeros((2,N))
for n in range(N):
# Комбинация медленных изменений
intensity_mod[:,n] = 0.7 + 0.3 * (np.sin(2*np.pi*0.05*n/Fd) * np.sin(2*np.pi*0.02*n/Fd))
# естественный пространственный эффект
space_mod = np.zeros((2,N))
for n in range(N):
space_mod[0,n] = 0.9 + 0.1 * np.sin(2*np.pi*0.2*n/Fd)
space_mod[1,n] = 0.9 + 0.1 * np.cos(2*np.pi*0.2*n/Fd)
y = (y1 * 0.8 + y3 * 0.2) * (1 + 0.5*y2) * intensity_mod * space_mod + drops_mod * 0.7
# случайные "тяжелые" капли
for i in range(20): # несколько крупных капель
pos = np.random.randint(0, N-int(Fd/10))
duration = np.random.randint(int(Fd/50), int(Fd/20))
amplitude = np.random.uniform(0.2, 0.4)
for m in range(duration):
if pos + m < N:
# Более "тяжелый" звук для крупных капель
heavy_drop = amplitude * np.exp(-8*m/duration) * np.sin(2*np.pi*200*m/Fd)
y[0,pos+m] += heavy_drop
y[1,pos+m] += heavy_drop * np.random.uniform(0.8, 1.0) # небольшая стерео-вариация
# Нормализация
y = y / np.max(np.abs(y))
# Плавное нарастание и затухание
fade_len = int(0.3 * Fd) # время перехода
fade_in = np.linspace(0, 1, fade_len)
fade_out = np.linspace(1, 0, fade_len)
y[:,:fade_len] *= fade_in
y[:,-fade_len:] *= fade_out
sf.write('rain.wav', y.T, Fd)
# Построение амплитудного спектра
plt.figure(figsize=(10, 6))
Spectr_y = np.fft.fft(y)
AS_y = np.abs(Spectr_y)
eps = np.max(AS_y) * 1.0e-9
S_dB_y = 20 * np.log10(AS_y + eps)
f = np.arange(0, Fd/2, Fd/N)
S_dB_y = S_dB_y[:, :len(f)]
plt.semilogx(f, S_dB_y[0, :], color='b', label='Левый канал')
plt.semilogx(f, S_dB_y[1, :], color='r', alpha=0.5, label='Правый канал')
plt.grid(True)
plt.minorticks_on()
plt.grid(True, which='major', color='#666', linewidth=1)
plt.grid(True, which='minor', color='#999', ls=':')
Max_dB = np.ceil(np.log10(np.max(np.abs(Spectr_y))))*20
plt.axis([10, Fd/2, Max_dB-80, Max_dB])
plt.xlabel('Частота (Гц)')
plt.ylabel('Уровень (дБ)')
plt.title('Амплитудный спектр')
plt.legend()
plt.tight_layout()
plt.show()
Рисунок 4- Аиплитудный спектр сигнала
Вывод
В ходе выполнения лабораторной работы был изучен и успешно применен метод формирующих фильтров для создания шумоподобных аудиосигналов. Работа проводилась в несколько этапов: было проведено исследование трех различных типов формирующих фильтров: фильтр нижних частот Баттерворта, полосовой фильтр Чебышева первого рода, Фурье-фильтр с прямоугольной АЧХ. Каждый из фильтров продемонстрировал свои уникальные характеристики при преобразовании белого шума в различные звуковые эффекты.
На практике был реализован алгоритм реализации звука дождя, который включал в себя:
Список использованных источников
Жаринов О.О. Учебно-методические материалы к выполнению лабораторной работы №4 по дисциплине “Мультимедиа-технологии “. гр.4116,4117, 4118, Z0411. ГУАП, 2025. – 19 с. (Интернет-ресурс) URL: https://pro.guap.ru/inside/student/tasks/d8cf5085c5985f0a2fbfa50b24060693/download
Яндекс диск. Звук полета на самолете // URL: https://disk.yandex.ru/d/6lep5s0fTuPUFg
Яндекс диск. Звук океана // URL: https://disk.yandex.ru/d/sgMtRwHdyfOiSw
Яндекс диск. Звук жужжания пчел // URL: https://disk.yandex.ru/d/zxVxehbZIKaqOA
Яндекс диск. Звук снежной бури // URL: https://disk.yandex.ru/d/4f0L8DQRY229gQ
Яндекс диск. Звук дороги // URL: https://disk.yandex.ru/d/Ld5myVLvN9KisQ
Яндекс диск. Шум дождя // URL: https://disk.yandex.ru/d/olefMRMCGjaIUA