Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МТ4.docx
Скачиваний:
0
Добавлен:
04.05.2025
Размер:
1.92 Mб
Скачать

ГУАП

КАФЕДРА № 41

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

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

доцент, канд. техн. наук, доцент

О.О. Жаринов

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

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

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

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

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

аудиосигналов

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

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

СТУДЕНТ гр. №

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

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

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

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

Краткие теоретические сведения о методе формирующего фильтра и классификации “окрашенных” шумов

Одним из возможных подходов к созданию шумоподобных аудиосигналов является метод формирующего фильтра. Основная идея метода заключается в пропускании через фильтр сигнала от искусственного создаваемого источника белого шума (БШ). В зависимости от свойств применяемого фильтра выходной сигнал оказывается “спектрально окрашенным”, что порождает специфические слуховые ощущения. Например, если применить полосовой фильтр с узкой полосой, то выходной шум будет восприниматься как “звенящий”, если применить фильтр нижних частот (lowpass), то аудиосигнал на выходе представляет собой глухой шум, напоминающий, в зависимости от параметров фильтра, шум водопада, фонтана, шелест листвы, и т.д. Смешивание нескольких шумов в разных пропорциях, а также динамическое изменение интенсивности одного или нескольких процессов значительно увеличить разнообразие формируемых звуковых эффектов [1].

Цветовые соответствия различных типов шумового сигнала определяются с помощью графиков спектральной плотности, то есть распределения мощности сигнала по частотам [2].

Ход работы:

Была разработана программа для генерации и обработки аудиосигнала, его фильтрации и амплитудной модуляции (Листинг 1).

Программа создает два независимых белых шумовых сигнала (БШ1 и БШ2) с равномерным распределением амплитуд в диапазоне [−1,1]. Дискретизация осуществляется с частотой Fd=44100, а длительность сигнала составляет 5 секунд.

Фильтрация сигналов выполняется с помощью цифровых фильтров Баттерворта второго порядка. Для первого шума (БШ1) применяется полосовой фильтр в диапазоне 2000–2025 Гц, а для второго шума (БШ2) – фильтр верхних частот с граничной частотой 0.8 Гц. Фильтрация производится с использованием представления секций (sos) и функции signal.sosfilt из библиотеки SciPy.

После фильтрации выполняется амплитудная модуляция сигнала y1​ с использованием сигнала y2​, обеспечивая вариации амплитуды без полного затухания путем добавления единицы к модулирующему сигналу.

Для предотвращения выхода значений за границы диапазона [−1,1] результат нормируется по максимальной амплитуде. Итоговый обработанный сигнал сохраняется в файл output.mp3 с помощью библиотеки soundfile.

Листинг 1 – Программа для модуляции и сохранения сигнала

import numpy as np

import matplotlib.pyplot as plt

from scipy import signal

import soundfile as sf

plt.close('all')

Fd = 44100

T = 5

N = round(Fd*T)

t = np.linspace(0, T, N)

x1 = np.random.uniform(low=-1.0, high=1.0, size=(2, N)) # БШ1

x2 = np.random.uniform(low=-1.0, high=1.0, size=(2, N)) # БШ2

# Задаем граничные частоты полос двух форм. фильтров:

f_dn1, f_up1 = 2000, 2025

f_up2 = 0.8

order1, order2 = 2, 2

sos1 = signal.butter(order1,

Wn=(f_dn1 / (Fd/2), f_up1 / (Fd/2)),

btype='bandpass', output='sos')

sos2 = signal.butter(order2,

Wn=(f_up2 / (Fd/2)),

btype='highpass', output='sos')

y1 = signal.sosfilt(sos1, x1)

y2 = signal.sosfilt(sos2, x2)

# модуляция одного процесса другим 1+ нужно, чтобы громкость не спадала до нуля

y = y1 * (1+y2)

# Нормировка:

Norm = np.max(np.abs(y))

if Norm != 0:

y = y / Norm

# Записываем аудиофайл

sf.write('output.mp3', np.transpose(y), Fd)

Получился следующий звук: сигнализация с белым шумом, бегающим из одного уха в другое. Прослушать можно по ссылке 1 в приложении. Для визуализации временных и спектральных характеристик аудиосигнала была разработана программа (Листинг 2).

Для представления временной формы сигнала используется библиотека librosa, которая обеспечивает удобное отображение формы волны для обоих каналов (левого и правого) с различными цветами и уровнями прозрачности. Отображаются два графика: полный сигнал и его первые 0.5.

Для спектрального анализа вычисляется дискретное преобразование Фурье (FFT) для обоих каналов. Полученные спектры амплитуд нормируются и переводятся в децибелы с учетом фиктивного минимального значения (eps), предотвращающего логарифмирование нуля. Амплитудные спектры левого и правого каналов отображаются на одном графике.

Листинг 2 – Программа для визуализации характеристик

import librosa

from scipy.signal import ShortTimeFFT

from scipy.signal.windows import gaussian

start_t, stop_t = 0, T

fig, ax = plt.subplots(figsize=(12, 4))

librosa.display.waveshow(y[0, :], sr=Fd, color='b', ax=ax, alpha=0.6, label=f'Левый')

librosa.display.waveshow(y[1, :], sr=Fd, color='r', ax=ax, alpha=0.4, label=f'Правый')

ax.set(xlim=[start_t, stop_t],

title='Сигнал',

xlabel='Время (с)',

ylabel='Амплитуда')

ax.legend(loc='upper right', ncols=2)

ax.grid(True, which='both', ls='--', alpha=0.5)

plt.show()

start_t, stop_t = 0, 0.5

fig, ax = plt.subplots(figsize=(12, 4))

librosa.display.waveshow(y[0, :], sr=Fd, color='b', ax=ax, alpha=0.6, label=f'Левый')

librosa.display.waveshow(y[1, :], sr=Fd, color='r', ax=ax, alpha=0.4, label=f'Правый')

ax.set(xlim=[start_t, stop_t],

title='Сигнал (первые 0.5 секунды)',

xlabel='Время (с)',

ylabel='Амплитуда')

ax.legend(loc='upper right', ncols=2)

ax.grid(True, which='both', ls='--', alpha=0.5)

plt.show()

# Вычисляем амплитудные спектры для обоих каналов:

Spectr_left = np.fft.fft(y[0, :])

Spectr_right = np.fft.fft(y[1, :])

# Корректные частоты (0..Fd/2):

N = len(y[0, :])

freq = np.fft.fftfreq(N, 1/Fd)[:N//2]

# Преобразуем в дБ:

def to_db(spectrum):

eps = 1e-9 # Фиксированное значение для избежания log(0)

return 20 * np.log10(np.abs(spectrum[:N//2]) + eps)

S_dB_left = to_db(Spectr_left)

S_dB_right = to_db(Spectr_right)

f = np.arange(0, Fd / 2, Fd / N) # Перевести Абсциссу в Гц

plt.figure(figsize=(12, 4))

plt.plot(f, S_dB_left, color="b",alpha=0.6, label='Левый канал')

plt.plot(f, S_dB_right, color="r",alpha=0.4, label='Правый канал')

plt.grid(True)

plt.minorticks_on() # отобразит мелкую сетку на лог.масштабе

plt.grid(True, which="major", color="#444", linewidth=1)

plt.axis([-500, 22500, -40, 80])

plt.xlabel('Частота (Гц)')

plt.ylabel('Уровень (дБ)')

plt.title("Амплитудный спектр")

plt.legend()

plt.grid(True, which='both', ls='--', alpha=0.5)

plt.show()

На рисунках 1 – 3 представлены визуализация сигнала во времени и амплитудный спектр получившегося звука.

Рисунок 1 – Полная визуализация сигнала

Рисунок 2 – Визуализация начального отрезка сигнала

Рисунок 3 – Визуализация амплитудного спектра

По графикам явно заметен “бегающий” шум.

Для модуляции следующего сигнала параметры были изменены следующим образом (Листинг 3): фильтрация с помощью цифровых фильтров Баттерворта для левого канала второго порядка, а правого – первого порядка. Для первого шума применяется полосовой фильтр в диапазоне 10000–15000 Гц, а для второго шума – фильтр нижних частот с граничной частотой 1000 Гц.

Листинг 3 – Фильтры для второго сигнала

f_dn1, f_up1 = 10000, 15000

f_up2 = 0.2

order1, order2 = 2, 1

sos1 = signal.butter(order1,

                     Wn=(f_dn1 / (Fd/2), f_up1 / (Fd/2)),

                     btype='bandpass', output='sos')

sos2 = signal.butter(order2,

                     Wn=(f_up2 / (Fd/2)),

                     btype='lowpass', output='sos')

Полученый сигнал звучит как синий шум, напоминает звук работы пескоструйного аппарата. На рисунках 4 – 6 представлена визуализация сигнала. Прослушать можно по ссылке 2 в Приложении.

Рисунок 4 – Полная визуализация сигнала

Рисунок 5 – Визуализация начального отрезка сигнала

Рисунок 6 – Визуализация амплитудного спектра

По графикам виден “ровный” шум в обоих каналах и применение полосового фильтра в диапазоне 10000-15000 Гц.

Для третьего сигнала параметры фильтров были настроены следующим образом (Листинг 4): для первого шума (БШ1) применяется полосовой фильтр второго порядка в диапазоне 100–200 Гц, позволяющий выделить сигналы в этом частотном диапазоне, для второго шума (БШ2) используется фильтр нижних частот первого порядка с граничной частотой 1 Гц, который подавляет частоты выше 1 Гц.

Листинг 4 – Фильтры для третьего сигнала

f_dn1, f_up1 = 100, 200

f_up2 = 1

order1, order2 = 2, 1

sos1 = signal.butter(order1,

Wn=(f_dn1 / (Fd/2), f_up1 / (Fd/2)),

btype='bandpass', output='sos')

sos2 = signal.butter(order2,

Wn=(f_up2 / (Fd/2)),

btype='lowpass', output='sos')

Получился звук, похожий на гул ветра в большом помещении вроде ангара. На рисунках 7 – 9 представлена визуализация. Прослушать можно по ссылке 3 в Приложении.

Рисунок 7 – Полная визуализация сигнала

Рисунок 8 – Визуализация начального отрезка сигнала

Рисунок 9 – Визуализация амплитудного спектра

По графику амплитудного спектра ярко заметно подавление правого канала.

Для создания сигнала с реверберацией были внесены следующие изменения (Листинг 5): фильтрация сигналов выполняется с помощью цифровых фильтров Баттерворта четвертого порядка для левого канала и второго порядка для правого канала, для первого шума применяется полосовой фильтр с диапазоном 1000–1100 Гц, для второго шума применяется фильтр нижних частот с граничной частотой 0.3 Гц. После фильтрации выполняется амплитудная модуляция сигнала y1 с использованием сигнала y2, что позволяет изменять амплитуду основного сигнала на основе модульного сигнала. Для этого применяется модуляция с параметром Fm = 0.9, где для каждого отсчета рассчитывается амплитудный коэффициент alfa, который изменяет громкость сигнала по схеме, основанной на косинусоидальных колебаниях с заданной частотой модуляции. Также в программе реализована задержка сигнала с применением параметра delay_samples. Сигнал задерживается на 0.5 секунды, что создает эффект эха.

Листинг 5 – Фильтры и модуляция сигнала с реверберацией

# Основные параметры

Fd = 44100 # Частота дискретизации (Гц)

T = 5 # Длительность сигнала (сек)

N = round(Fd * T) # Количество отсчетов

t = np.linspace(0, T, N)

x1 = np.random.uniform(low=-1.0, high=1.0, size=(2, N)) # БШ1

x2 = np.random.uniform(low=-1.0, high=1.0, size=(2, N)) # БШ2

f_dn1, f_up1 = 1000, 1100

f_up2 = 0.3

order1, order2 = 4, 2

sos1 = signal.butter(order1,

Wn=(f_dn1 / (Fd/2), f_up1 / (Fd/2)),

btype='bandpass', output='sos')

sos2 = signal.butter(order2,

Wn=(f_up2 / (Fd/2)),

btype='lowpass', output='sos')

# Применение фильтров

y1 = signal.sosfilt(sos1, x1)

y2 = signal.sosfilt(sos2, x2)

# Модуляция

y = y1 * (1 + y2)

alfa = np.zeros((2, N))

Fm = 0.9

for n in range(N):

alfa[:, n] = (0.5*(1-np.cos(2*np.pi*Fm*n/Fd)))**2

y = y * alfa

delay_samples = int(0.5 * Fd) # задержка

y[:, delay_samples:] += 0.3 * y[:, :-delay_samples]

Получившийся сигнал напоминает сонар подводной лодки. Прослушать можно по ссылке 4 в Приложении. Визуализация представлена на рисунках 9 - 11.

Рисунок 9 – Полная визуализация сигнала

Рисунок 10 – Визуализация начального отрезка сигнала

Рисунок 11 – Визуализация амплитудного спектра

По графикам видна реверберация и успешное применение полосового фильтра в диапазоне 1000-1100 Гц и фильтра нижних частот.

Вывод: в ходе выполнения лабораторной работы была изучена методология создания шумоподобных сигналов на основе формирующих фильтров. Были использованы полосовой фильтр, фильтр нижних частот, фильтр верхних частот. Успешно смоделированы четыре отличющихся сигнала.

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