Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Мультимедиа4

.docx
Скачиваний:
0
Добавлен:
20.06.2025
Размер:
1.89 Mб
Скачать

ГУАП

КАФЕДРА № 41

ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ

ПРЕПОДАВАТЕЛЬ

доц., к.т.н., доц.

О.О. Жаринов

должность, уч. степень, звание

подпись, дата

инициалы, фамилия

ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №4

Применение формирующих фильтров для создания шумоподобных аудиосигналов

по курсу: МУЛЬТИМЕДИА ТЕХНОЛОГИИ

РАБОТУ ВЫПОЛНИЛ

СТУДЕНТ гр. №

4116

подпись, дата

инициалы, фамилия

Санкт-Петербург 2025

Цель работы: изучить методологию создания шумоподобных сигналов на основе формирующих фильтров

Краткие теоретические сведения

Использование фильтров в мультимедиа при обработке аудиосигналов не ограничивается только трансформацией свойств речевых, музыкальных и иных записей. Заметное место в мультимедиа отводится имитационному моделированию разнообразных шумовых эффектов (например, звуки природы, звуки технологических процессов и т. п.). При этом возможны два принципиально различных подхода: в первом имитационные модели звуков создаются посредством комбинаций детерминированных функций, во втором – с помощью случайных процессов с существенно неравномерным спектром. Ярким примером первого подхода является “графический калькулятор”, в составе которого в числе прочего имеются средства частотной модуляции несущей посредством величины функции, рассчитанной для некоторой последовательности аргументов. Методом частотной модуляции можно создать разнообразные экзотические “поющие” звуки, напоминающие звучание терменвокса. Второй подход к созданию аудиодорожек предназначен для создания звуков, в которых нет ярко выраженного основного тона. Одним из возможных подходов к созданию таких шумоподобных аудиосигналов является метод формирующего фильтра. Основная идея метода заключается в пропускании через фильтр сигнала от искусственного создаваемого источника белого шума (БШ). В зависимости от свойств применяемого фильтра выходной сигнал оказывается “спектрально окрашенным”, что порождает специфические слуховые ощущения. Например, если применить полосовой фильтр с узкой полосой, то выходной шум будет восприниматься как “звенящий”, если применить фильтр нижних частот (lowpass), то аудиосигнал на выходе представляет собой глухой шум, напоминающий, в зависимости от параметров фильтра, шум водопада, фонтана, шелест листвы, и т.д.

Смешивание нескольких шумов в разных пропорциях, а также динамическое изменение интенсивности одного или нескольких процессов значительно увеличивающих разнообразие формируемых звуковых эффектов.

Ход работы

Для начала проведено исследование трех формирующих фильтров для создания шумоподобных сигналов. В качестве исходного сигнала используется белый шум, генерируемый с помощью равномерного распределения в диапазоне от -1 до 1.

Первым выбран фильтр нижних частот (ФНЧ) Баттерворта пятого порядка с частотой среза 700 Гц, которая определяет, какие частоты будут доминировать в выходном сигнале. При прослушивании выходного сигнала, можно сказать, что он напоминает звук при полете в самолете, однако, если понизить порядок фильтра до 2, то сигнал становится походим на шум океана. Фильтр второго порядка сохраняет часть высокочастотных компонентов.

Прослушать звуки можно по данным ссылкам

  1. Звук полета на самолете: https://disk.yandex.ru/d/6lep5s0fTuPUFg

  2. Звук океана: 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- Аиплитудный спектр сигнала

Вывод

В ходе выполнения лабораторной работы был изучен и успешно применен метод формирующих фильтров для создания шумоподобных аудиосигналов. Работа проводилась в несколько этапов: было проведено исследование трех различных типов формирующих фильтров: фильтр нижних частот Баттерворта, полосовой фильтр Чебышева первого рода, Фурье-фильтр с прямоугольной АЧХ. Каждый из фильтров продемонстрировал свои уникальные характеристики при преобразовании белого шума в различные звуковые эффекты.

На практике был реализован алгоритм реализации звука дождя, который включал в себя:

Список использованных источников

  1. Жаринов О.О. Учебно-методические материалы к выполнению лабораторной работы №4 по дисциплине “Мультимедиа-технологии “. гр.4116,4117, 4118, Z0411. ГУАП, 2025. – 19 с. (Интернет-ресурс) URL: https://pro.guap.ru/inside/student/tasks/d8cf5085c5985f0a2fbfa50b24060693/download

  2. Яндекс диск. Звук полета на самолете // URL: https://disk.yandex.ru/d/6lep5s0fTuPUFg

  3. Яндекс диск. Звук океана // URL: https://disk.yandex.ru/d/sgMtRwHdyfOiSw

  4. Яндекс диск. Звук жужжания пчел // URL: https://disk.yandex.ru/d/zxVxehbZIKaqOA

  5. Яндекс диск. Звук снежной бури // URL: https://disk.yandex.ru/d/4f0L8DQRY229gQ

  6. Яндекс диск. Звук дороги // URL: https://disk.yandex.ru/d/Ld5myVLvN9KisQ

  7. Яндекс диск. Шум дождя // URL: https://disk.yandex.ru/d/olefMRMCGjaIUA

Соседние файлы в предмете Мультимедиа технологии