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

1

.pdf
Скачиваний:
0
Добавлен:
16.05.2025
Размер:
564.47 Кб
Скачать

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

федеральное государственное автономное образовательное учреждение высшего образования

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»

Кафедра 41

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

 

 

 

 

 

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

 

 

 

О. О. Жаринов

 

 

 

 

 

 

 

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

 

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

 

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

Лабораторная работа №1

Основы моделирования и обработки аудиосигналов средствами Python

по курсу: Мультимедиа технологии

СТУДЕНТКА ГР. №

Z0411

05.04.25

 

М.В. Карелина

 

 

 

 

 

 

 

 

 

номер группы

 

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

 

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

Номер студенческого билета: 2020/3477

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

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

Вариант 7, задание: создать синусоидальный сигнал, громкость которого линейно увеличивается от нуля в начале записи до максимума в конце записи,

одновременно в обоих каналах. Частота сигнала не изменяется на всем протяжении записи.

Создан синусоидальный сигнал с частотой 440 Гц и продолжительностью 5 секунд. Громкость начала записи была низкой и постепенно увеличивалась до максимума к концу, что создает эффект нарастания звука. Запись была выполнена с частотой дискретизации 44.1 кГц,

что обеспечивает хорошее качество воспроизведения. Сигнал был обработан так, что сила звука линейно возрастала от нуля до максимума, а затем сохранён в формате WAV. Код программы показан на листинге 1.

Листинг 1. Формирование аудиофайла с заданными параметрами.

import numpy as np

import matplotlib.pyplot as plt from scipy.io.wavfile import write

# Параметры сигнала

duration = 5.0 # Продолжительность сигнала в секундах sample_rate = 44100 # Частота дискретизации в Гц

frequency = 440.0 # Частота синусоидального сигнала в Гц (ля первой октавы)

# Генерация временной оси

t = np.linspace(0, duration, int(sample_rate * duration), endpoint=False)

# Генерация синусоидального сигнала

signal = np.sin(2 * np.pi * frequency * t)

# Генерация линейно увеличивающейся громкости

volume = np.linspace(0, 1, signal.shape[0]) # От нуля до единицы stereo_signal = signal * volume # Применяем громкость к сигналу

# Создание стерео-сигнала (дублирование по двум каналам) stereo_signal = np.column_stack((stereo_signal, stereo_signal))

# Приведение данных к типу int16 для формата WAV

stereo_signal = np.int16(stereo_signal * 32767) # Приводим к диапазону

-32768 до 32767

# Запись в файл WAV output_file = 'LR1.wav'

write(output_file, sample_rate, stereo_signal)

2

Далее разрабатывается программа на языке Python, которая открывает ранее созданный аудиофайл (LR1) и визуализирует звуковой сигнал,

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

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

2.

Листинг 2. Визуализация амплитудного спектра и спектрограммы.

import numpy as np

import matplotlib.pyplot as plt from scipy.io.wavfile import read from scipy.fft import fft, fftfreq

from scipy.signal import spectrogram

# Открываем аудиофайл input_file_name = 'LR1.wav'

sample_rate, audio_data = read(input_file_name)

#Проверяем, что аудиофайл стерео if len(audio_data.shape) != 2:

raise ValueError("Необходимо использовать стерео-аудиофайл")

#Объединяем два канала в один (среднее значение)

audio_data = np.mean(audio_data, axis=1)

#Нормировка сигнала (приведение амплитуды к диапазону [0, 1]) audio_data = audio_data - np.min(audio_data) # Сдвигаем амплитуды,

чтобы минимальное значение стало 0

audio_data = audio_data / np.max(np.abs(audio_data)) # Нормируем к диапазону [0, 1]

#Длительность сигнала в секундах

duration = len(audio_data) / sample_rate

# Визуализация осциллограммы для всей длины сигнала time = np.linspace(0, duration, len(audio_data)) plt.figure(figsize=(10, 6))

plt.plot(time, audio_data, color='blue') plt.title("Осциллограмма всего сигнала") plt.xlabel("Время (сек)") plt.ylabel("Амплитуда")

plt.ylim(0, 1) # Устанавливаем нижний предел на оси Y plt.grid(True)

3

plt.tight_layout() plt.show()

# Визуализация временного ряда сигнала (для фрагмента) start_time = 2.45

end_time = 2.55

start_sample = int(start_time * sample_rate) end_sample = int(end_time * sample_rate)

plt.figure(figsize=(10, 6)) plt.plot(time[start_sample:end_sample], audio_data[start_sample:end_sample], color='blue') plt.title("Фрагмент аудиосигнала") plt.xlabel("Время (сек)")

plt.ylabel("Амплитуда")

plt.ylim(0, 1) # Устанавливаем нижний предел на оси Y plt.grid(True)

plt.tight_layout() plt.show()

#Вычисление амплитудного спектра (FFT) fft_signal = fft(audio_data)

amplitude_spectrum = np.abs(fft_signal)[:len(fft_signal) // 2] # Только положительные частоты

frequencies = fftfreq(len(audio_data), 1 / sample_rate)[:len(fft_signal) // 2]

#Нормируем амплитудный спектр

amplitude_spectrum = amplitude_spectrum / np.max(amplitude_spectrum) #

Нормируем к диапазону [0, 1]

#Визуализация амплитудного спектра plt.figure(figsize=(10, 6))

plt.plot(frequencies, amplitude_spectrum, color='green') plt.title("Амплитудный спектр")

plt.xlabel("Частота (Гц)") plt.ylabel("Амплитуда (нормализованная)")

plt.ylim(0, 1) # Устанавливаем верхний предел на оси Y plt.grid(True)

plt.tight_layout() plt.show()

#Логарифмическое преобразование амплитудного спектра

log_amplitude_spectrum = 20 * np.log10(amplitude_spectrum + 1e-10) #

Добавляем маленькое значение для избежания log(0)

# Устанавливаем минимальное значение логарифмического спектра на ноль log_amplitude_spectrum = log_amplitude_spectrum - np.min(log_amplitude_spectrum) # Сдвигаем логарифмические значения log_amplitude_spectrum = log_amplitude_spectrum / np.max(log_amplitude_spectrum) # Нормируем к диапазону [0, 1]

# Визуализация логарифмического амплитудного спектра plt.figure(figsize=(10, 6))

plt.plot(frequencies, log_amplitude_spectrum, color='orange') plt.title("Логарифмический амплитудный спектр") plt.xlabel("Частота (Гц)")

plt.ylabel("Амплитуда (нормализованная)")

plt.ylim(0, 1) # Устанавливаем верхний предел на оси Y plt.grid(True)

plt.tight_layout() plt.show()

4

# Визуализация спектрограммы (используем общий сигнал) plt.figure(figsize=(10, 6))

frequencies, times, Sxx = spectrogram(audio_data, sample_rate)

Sxx_db = 10 * np.log10(Sxx + 1e-10) # Логарифмическое преобразование

Sxx_db = Sxx_db - np.min(Sxx_db) # Сдвигаем логарифмические значения

Sxx_db = Sxx_db / np.max(Sxx_db) # Нормируем к диапазону [0, 1] plt.pcolormesh(times, frequencies, Sxx_db, shading='gouraud') plt.colorbar(label='Нормализованные децибелы') plt.title("Спектрограмма сигнала")

plt.ylabel("Частота (Гц)") plt.xlabel("Время (сек)")

plt.ylim(0, 2000) # Ограничение по частотам для лучшего визуального восприятия

plt.grid() plt.tight_layout() plt.show()

Этот код на Python предназначен для анализа аудиосигнала под названием LR1.wav. Он использует несколько популярных библиотек, таких как numpy, matplotlib и scipy, чтобы выполнить необходимые вычисления и визуализации. Сначала код загружает аудиофайл и проверяет, является ли он стереофоническим, то есть содержит два канала — левый и правый. Если файл действительно стерео, код объединяет оба канала, вычисляя их среднее значение, чтобы создать один монофонический сигнал. Следующим шагом является нормализация сигнала — это процесс, который приводит амплитуду звука в диапазон от -1 до 1.

Далее, код визуализирует аудиосигнал в виде осциллограммы, что позволяет увидеть, как изменяется амплитуда звука с течением времени. Кроме того, он анализирует временной ряд только для небольшого фрагмента аудиосигнала, что помогает сосредоточиться на определённых моментах.

Результат на рисунках 1, 2.

Важной частью анализа является быстрое преобразование Фурье (FFT),

которое позволяет переходить от временной области к частотной. Это помогает выяснить, какие частоты преобладают в аудиосигнале. Амплитудный спектр затем выводится в логарифмической шкале, что облегчает восприятие и анализ. Результат на рисунках 3,4.

Ссылка на аудиофайлы: https://drive.google.com/drive/folders/1- T1Y_1foDcRzw5ROi7un1AuykKyI-kU1?usp=drive_link

5

В конце код создает спектрограмму, которая показывает изменение

частотного состава сигнала с течением времени. Результат на рисунке 5.

Рисунок 1 – Визуализация осцилограммы сигнала

Рисунок 2 – Визуализация созданного сигнала, фрагмент с 2,45 по 2,55 сек

6

Рисунок 3 – Амплитудный спектр созданного сигнала,

Рисунок 4 – Амплитудный спектр созданного сигнала

7

Рисунок 5 – Спектрограмма созданного сигнала

8

Вывод В ходе выполнения лабораторной работы был создан аудиофайл,

представляющий синусоидальный сигнал с фиксированной частотой,

громкость которого линейно увеличивается от нуля в начале записи до максимума в конце.

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

включая получение осциллограммы, амплитудного спектра (в том числе в логарифмическом представлении) и спектрограммы. Все вышеупомянутые процессы были реализованы с помощью библиотек Python, что позволило автоматически генерировать и визуализировать данные.

Для создания аудиофайла была разработана специальная программа, в

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

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

9

Список используемых источников:

1.Мультимедиатехнологии в информационных системах.

Представление и обработка изображений в компьютере: учеб. пособие/ Н. Н.

Красильников, О. И. Красильникова. ГУАП. СПб, 2007. 132 с.

2.10 аудиомодулей Python для воспроизведения и записи // URL: https://pythonpip.ru/osnovy/10-audiomoduley-python-dlyavosproizvedeniya-i- zapisi

3.SciPy.signal.ShortTimeFFT (документация на англ. яз.) // URL: https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.ShortTime FFT.html#scipy.signal.ShortTimeFFT

4.Практическое применение преобразования Фурье для анализа

сигналов.

Введение

для

 

начинающих.

//

URL:

https://habr.com/ru/articles/269991/

 

 

 

 

 

5.

Спектрограмма

звука

-

как

читать

//

URL:

https://chistoug.ru/articles/spektrogramma-zvuka-kak-chitat.html

 

 

10

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