Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МТ_ЛР1_Иванова_4117.docx
Скачиваний:
0
Добавлен:
29.04.2025
Размер:
1.06 Mб
Скачать

ГУАП

КАФЕДРА № 41

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

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

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

О.О. Жаринов

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

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

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

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

ОСНОВЫ МОДЕЛИРОВАНИЯ И ОБРАБОТКИ АУДИОСИГНАЛОВ СРЕДСТВАМИ PYTHON.

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

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

СТУДЕНТ ГР. №

4117

А.В. Иванова

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

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

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

Цель работы:

Получить представление о принципах формирования аудиосигналов и приобрести навыки обработки звуковых файлов с использованием средств Python.

Вариант 8:

Рисунок 1 — Задание по варианту

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

Аудиоконтент является одной из составляющих мультимедиа. Посредством Python можно читать, записывать, обрабатывать и анализировать аудиофайлы. Для удобной работы с ними можно использовать такие библиотеки как Librosa [2], для обработки аудиосигналов; и soundfile, для работы с аудио файлами.

Для чтения файла и получения его частоты дискретизации можно использовать метод librosa.load. Для музыкальных файлов обычно частота дискретизации обычно задаётся в 44100 Гц.

В звуковом файле каждый отдельно взятый отсчёт оцифрованного сигнала (sample) представлен целым числом со знаком, лежащими в диапазоне либо от минус 128 до +127 , либо от минус 32768 до +32767 (в зависимости от кодировки). При этом метод загрузки .load модуля librosa автоматически преобразует формат данных к типу float32, чтобы точность дальнейших вычислений была максимальной.

Для повышения точности звука, в том числе избавления от шумов, осуществляется нормировка данных – максимальное (по модулю) значение в массиве не будет превышать 1.0. При этом нужно иметь в виду, что и при записи аудиоданных следует выполнять требования к нормировке величин, передаваемых в метод .write модуля sounfile, в противном случае в аудиофайл будут записаны искаженные данные (произойдет “ограничение”, которое в аудиотехнике известно также как “перегрузка” или “клиппирование”), из-за чего звук будет воспроизводиться с более или менее выраженными хрипами.

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

При необходимости можно производить изменения амплитуды и/или частоты гармонических компонентов на протяжении записи формируемого модельного аудиосигнала. При этом обычно амплитудные параметры формируемого сигнала можно изменять отдельно, уже после формирования компонентов сигнала с желаемыми частотными свойствами.

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

w(t)= (1−cos(2πt/T))2

где T – длительность создаваемого сигнала в секундах; после чего осуществить поэлементное умножение уже сформированного массива отсчётов звукового сигнала и массива дискретных значений этой функции (wn=w(n/Fd)).

Важный инструмент для изучения свойств сигнала – метод быстрого преобразования Фурье (БПФ или fft –fast fourier transform), который позволяет вычислить спектр аудиосигнала, построение графика которого позволяет определить, каково распределение энергии гармонических компонентов, в сумме составляющих анализируемый аудиосигнал, по частотам. Построение спектра при моделировании аудиосигналов также позволяет проконтролировать корректность задания

параметров тональных компонентов сигнала. Для

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

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

Выполнение работы:

В начале проведена подготовка к написанию программы: установлена версия Python 3.12, так как необходимые для работы библиотеки не работают с версией выше.

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

Заданы характеристики сигнала: длительность 3 секунды, частота дискретизации 44100 Гц, число дискретных отсчётов. По условию громкость синусоидального сигнала должна от 0 до max возрастать в левом канале и наоборот убывать в правом. Громкость звука зависит от амплитуды звуковых волн — чем она больше, тем громче звук. Поэтому задано N коэффициентов равномерно убывающих от 0 до 1 и наоборот. Для каждого отсчета (семпла) значение амплитуды умножается на соответствующий коэффициент. В качестве функции сигнала использован синус, частота является константой, равной 440 Гц.

Далее выполнена нормировка амплитуд сигнала, для уменьшения шумов: максимальные значения амплитуд приравниваются к 1, а остальные пропорционально уменьшаются.

В конце полученный модельный сигнал записан в файл через библиотеку soundfile.

Листинг 1. Код генерации звукового сигнала и запись в файл.

import numpy as np

import soundfile as sf

path = '/home/iva/PycharmProjects/Multimedia_lab1/sounds/' # путь к папке с файлами с аудио

Fd = 44100 # частота дискретизации

T = 3 # длительность аудио в сек.

N = round(T*Fd) # число дискретных отсчетов

l_k = np.linspace(0,1,N) # коэффициенты для амплитуды (увеличение)

r_k = np.linspace(1,0,N) # коэффициенты для амплитуды (уменьшение)

def harm_waves(f, A):

signal_s = l_k * A * np.sin(2 * np.pi * f * np.arange(N) / Fd) # левый канал

signal_c = r_k * A * np.sin(2 * np.pi * f * np.arange(N) / Fd) # правый канал

signal = np.vstack((signal_s, signal_c))

return signal

f = 440 # частота

A = 1 # амплитуда

model_signal = harm_waves(f, A) # формирование сигнала

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

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

if Norm != 0:

model_signal /= Norm

sf.write(path + 'my_output.mp3', np.transpose(model_signal), Fd)

Установлена библиотека librosa. Через неё выполнено чтение ранее записанного файла и вычислены его характеристики для дальнейшей визуализации (Листинг 2). Проверено, что полученные характеристики совпадают с установленными.

Написана функция визуализации звукового сигнала для этого использован модуль pyplot (библиотека matplotlib) (параметры холста) и display (библиотека numpy) для отображения сигнала в виде зависимости его амплитуды от времени аудиофайла.

На первом графике (Рисунок 2) представлен общий вид сигнала: видно, что амплитуда в правом канале постепенно снижается от 1 до 0, а в левом канале — наоборот, постепенно увеличивается и доходит до 1 к концу файла. На графике видны небольшие скачки, обусловленные потерей качества при сохранении файла в .mp3 формате.

Для наглядной визуализации изменения амплитуды на Рисунке 3 выделен фрагмент самого начала файла (от 0 до 0.05 секунды), где видно, что амплитуда в правом канале в 0 максимальная и постепенно снижается, а в левом наоборот, начинается с 0 и постепенно увеличивается.

Аналогично на Рисунке 4 выделен фрагмент в конце файла (с 2.95 по 3 секунды), где видно уменьшение амплитуды в правом канале до 0 и увеличение в левом до 1.

Также записанный файл прослушан — по мере проигрывания в начале громко слышен звук только справа, а потом постепенно звук нарастает слева и в конце слышен только громко слева.