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

Листинг 2. Код визуализации звукового сигнала из файла

import numpy as np

import librosa

from matplotlib import pyplot as plt

import sys

from scipy.signal import ShortTimeFFT

from scipy.signal.windows import gaussian

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

filename = 'my_output' # имя обрабатываемого файла

# считывание данных

input_signal, Fd = librosa.load(path + filename + '.mp3', sr=None, mono=False)

N = round(input_signal.size / input_signal.ndim) # количество дискретных отсчетов звука

T = N/Fd # время звучания в секундах

K = input_signal.ndim # количество каналов

print(type(input_signal), K, N, Fd, T)

# функция построения отображения сигнала в диапазоне

def plot_signal(start_t, stop_t):

fig, ax = plt.subplots(nrows=1, sharex=True, figsize=(10, 4))

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

librosa.display.waveshow(input_signal[0, :], sr=Fd, color='b', ax=ax, label='левый канал', alpha=0.8)

librosa.display.waveshow(input_signal[1, :], sr=Fd, color='r', ax=ax, label='правый канал',alpha=0.8)

ax.label_outer()

ax.legend()

ax.grid(True)

ax.minorticks_on() # добавление сетки

ax.grid(True, which='major', color='#444', linewidth=1)

ax.grid(True, which='minor', color='#aaa', ls=':')

plt.xlabel('Время')

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

plt.title('Звуковой сигнал')

plt.show()

plot_signal(0,T)

plot_signal(0,0.05)

plot_signal(2.95,T)

Рисунок 2 — Визуализация звукового сигнала (общий вид)

Рисунок 3 — Визуализация звукового сигнала (фрагмент с 0 по 0.05)

Рисунок 4 — Визуализация звукового сигнала (фрагмент с 2.95 по 3)

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

На Рисунке 5 представлен амплитудный спектр для обоих каналов в диапазоне частоты от 10 до 10000 Гц. Так как по условию частота модельного сигнала неизменна (440 Гц) на визуализации АС в целом ничего не видно: только резкое нарастание громкости при частоте 440. То есть получен всплеск: есть громкое звучание при в частоте 440Гц (что работает для обоих каналов, т. к. и там и там и максимум и минимум громкости достигаются на одной частоте) и падение звука в других частотах.

Листинг 3. Код построения амплитудного спектра сигнала

# функция вычисления амплитудного спектра в дБ

def get_spectr_dB(signal):

Spectr_input = np.fft.fft(signal) # БПФ

# Перевод в дБ:

AS_input = np.abs(Spectr_input)

eps = np.max(AS_input) * 1.0e-9

S_dB_input = 20 * np.log10(AS_input + eps)

return S_dB_input

l_S_dB = get_spectr_dB(input_signal[0,:]) # АС левого канала

r_S_dB = get_spectr_dB(input_signal[1,:]) # АС правого канала

f = np.arange(0, Fd/2, Fd/N) # набор частот спектра

# функция построения графика амплитудного спектра:

def plot_spectr(S_dB, ax):

S_dB = S_dB[:len(f)] # выравнивание длины

ax.semilogx(f, S_dB) # график в полулог. масштабе

ax.grid(True)

ax.minorticks_on() # добавление сетки

ax.grid(True, which='major', color = '#444', linewidth = 1)

ax.grid(True, which='minor', color='#aaa', ls=':')

Max_dB = np.ceil(np.max(S_dB)/20)*20

ax.axis([10, Fd/2, Max_dB-100, Max_dB]) # ограничим оси

ax.set_xlabel('Частота (Гц)')

ax.set_ylabel('Уровень (Дц)')

ax.set_title('Амплитудный спектр')

fig, axs = plt.subplots(2, 1, figsize=(6, 8))

plot_spectr(l_S_dB, axs[0]) # левый канал

plot_spectr(r_S_dB, axs[1]) # правый канал

plt.tight_layout() # отображение 2 графиков в одном окне

plt.show()

Рисунок 5 — Амплитудный спектр для обоих каналов

Выполнено построение спектрограммы (Листинг 4). Взято Гауссово окно с количество точек 20% от сигнала (для того, чтобы затратить при обработке не слишком большой объем оперативной памяти). Выполнено кратковременное преобразование Фурье — получен спектр частот для окна. Визуализация спектрограммы — график зависимости частоты от времени отображён на Рисунке 6. Никакой новой информации данная спектрограмма не даёт, так как в анализируемом файла задана постоянная частота 440Гц, поэтому на графике получилась горизонтальная прямая, отображающая частоту на этом уровне.

Для хранения результатов преобразования было задействовано 0.004 Гб памяти.