Считывание данных файла и визуализация
Во второй части выполнения данной лабораторной работы необходимо написать программу, которая производит открытие полученного модельного аудиофайла, визуализирует содержащийся в нём сигнал, а также вычисляет и визуализирует амплитудный спектр сигнала. Список используемых переменных представлен в таблице 2, а в листинге 2 – исходный код программы.
Таблица 2. Список используемых переменных
Название |
Тип |
Описание |
Fft_spectrum |
Массив чисел |
Результат БПФ над исходным сигналом |
Magnitude_spectrum |
Массив чисел |
Амплитудный спектр сигнала |
Freqs |
Массив чисел |
Частотный спектр сигнала |
signal |
Массив чисел |
Исходный сигнал |
Sample_rate |
целочисленный |
Частота дискретизации сигнала |
Листинг 2. Открытие и визуализация аудиофайла
def frec_magni_graph(signal, freq: int): # Вычисление амплитудного спектра сигнала fft_spectrum = np.fft.fft(signal) magnitude_spectrum = 20 * np.log10(np.abs(fft_spectrum)) print(magnitude_spectrum)
# Генерация частотной оси freqs = np.fft.fftfreq(len(fft_spectrum), 1/sample_rate)
# Построение амплитудного спектра plt.figure(figsize=(12, 6)) plt.plot(freqs[:len(freqs)//2], magnitude_spectrum[:len(freqs)//2]) plt.xlabel('Частота (Гц)') plt.ylabel('Уровень (Дб)') plt.title('Амплитудный спектр аудиосигнала') plt.grid() plt.semilogx()
#--------- Открываем файл для визуализации ------------ signal, sample_rate = sf.read("output_audio.wav") t = [i/sample_rate for i in range(len(signal))] plt.figure(figsize=(12, 6)) plt.plot(t, signal, label=['Левое ухо', "Правое ухо"], alpha=0.6) plt.legend() plt.ylabel("Максимальная амплитуда") plt.xlabel("Время (с)") plt.title("График сигнала для разных каналов")
#---------- Вычисление и визуализация АЧХ ------------ signal, sample_rate = sf.read("output_audio.wav")
frec_magni_graph(signal[:,0], sample_rate) plt.show() |
Далее необходимо проверить работу данной программы. Попробуем сгенерировать аудиосигнал длительностью 7 секунд с частотой 1000 Гц. На рисунке 3 приведена визуализация исходного аудиосигнала, а на рисунке 4 – амплитудный спектр сигнала.
Рисунок 3 – Визуализация аудиосигнала
Рисунок 4 – Амплитудный спектр сигнала
Как видно из данных рисунков, визуализации соответствуют действительности, поскольку из 3 рисунка видно, что длительность аудиосигнала – 7 секунд (ось х), а из 4 рисунка – частота сигнала ровно 100 Гц. Далее попробуем взять любой другой аудиофайл и создадим для него точно такие же визуализации. В качестве звукового файла была выбрана музыка из радио из игры Portal [6]. Созданные визуализации показаны на рисунках 5 и 6.
Рисунок 5 – Визуализация аудиофайла
Рисунок 6 – Амплитудный спектр сигнала
Выводы
Подводя итоги к проделанной работе, можно сделать вывод о том, что в ходе выполнения данной лабораторной работы мною были получены элементарные навыки по работе с аудиофайлами на языке Python, а именно генерация звуковых дорожек заданной длинны, заданной частоты и с определенным условием. Помимо этого, я получил навык по визуализации аудиофайла, а также по созданию амплитудного спектра сигнала. По данному спектру было видно, что сгенерированный звук имеет идеальный пик по амплитуде ровно в той частоте, на которой и был создан звук. При создании такого же спектра, только уже сложного аудиосигнала достаточно трудно выявить какие-то преобладающие частоты.