- •Выполнение работы:
- •Листинг 1. Код генерации звукового сигнала и запись в файл.
- •Листинг 2. Код визуализации звукового сигнала из файла
- •Листинг 3. Код построения амплитудного спектра сигнала
- •Листинг 4. Код построения спектрограммы сигнала.
- •Дополнительное задание:
- •Выводы:
- •Список использованных источников
Листинг 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 Гб памяти.
