
3
.pdf
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
федеральное государственное автономное образовательное учреждение высшего образования
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
Кафедра 41
ПРЕПОДАВАТЕЛЬ |
|
|
|
|
|
|
доц., к.т.н., доц. |
|
|
|
О. О. Жаринов |
|
|
|
|
|
|
|
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
Лабораторная работа №3
Изучение методов фильтрации аудиосигналов в Python. Применение рекурсивных фильтров
по курсу: Мультимедиа технологии
СТУДЕНТКА ГР. № Z0411 |
01.04.25 |
|
М. В. Карелина |
||
|
|
|
|
|
|
|
номер группы |
|
подпись, дата |
|
инициалы, фамилия |
Номер студенческого билета: 2020/3477
Санкт-Петербург
2025

Цель работы: получить навыки обработки аудиосигналов на примере методов фильтрации сигналов во временной области с использованием рекурсивных цифровых фильтров.
Вариант 7 приведён в таблице 1.
Таблица 1 – Индивидуальный вариант задания
Вариант |
Тип фильтра |
Граничные частоты полосы пропуская |
|
|
|
фильтра |
|
|
|
fниж, Гц |
fверх, Гц |
7 |
Фильтр нижних |
− |
600 |
|
частот |
|
|
Вэтой лабораторной работе изучается метод фильтрации аудиосигналов
спомощью рекурсивных цифровых фильтров, который часто используется для устранения нежелательных частот в звуковых записях. В частности, обработка в временной области позволяет эффективно изменять амплитудный спектр сигнала, удаляя или ослабляя определённые диапазоны частот. В рамках работы будет реализован фильтр нижних частот с установленным фильтром среза 600 Гц на основе рекурсивного цифрового фильтра (РЦФ),
рассчитанного по аналоговому фильтру-прототипу семейства Баттерворта 4-
го порядка и использован ранее созданный сигнал LR2. Код программы продемонстрирован в Листинге 1.
Листинг 1. Обработка сигнала
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import lfilter, butter, freqz from scipy.io import wavfile
# Чтение файла LR2.wav
sampling_rate, signal = wavfile.read('LR2.wav') signal = signal.astype(float)
# Параметры фильтра
cutoff_frequency = 600 # частота среза в герцах nyquist_frequency = sampling_rate / 2
normalized_cutoff_frequency = cutoff_frequency / nyquist_frequency
# Создание фильтра нижних частот
b, a = butter(4, normalized_cutoff_frequency, btype='low')
# Применение фильтра к сигналу filtered_signal = lfilter(b, a, signal)
# Визуализация сигнала без фильтра plt.figure(figsize=(10, 5))
plt.plot(signal / np.max(np.abs(signal)), color='green', label='Исходный
2

сигнал')
plt.title('Исходный сигнал') plt.xlabel('Время') plt.ylabel('Амплитуда') plt.legend()
plt.grid(True) plt.show()
# Расчет спектра исходного сигнала
frequencies = np.fft.fftfreq(signal.size, 1 / sampling_rate) spectrum = np.fft.fft(signal)
plt.figure(figsize=(10, 5))
plt.plot(frequencies, np.abs(spectrum) / np.max(np.abs(spectrum)), color='green', label='Спектр исходного сигнала')
plt.title('Спектр исходного сигнала') plt.xlabel('Частота') plt.ylabel('Амплитуда')
plt.legend() plt.grid(True) plt.show()
#Визуализация отфильтрованного сигнала plt.figure(figsize=(10, 5))
plt.plot(filtered_signal, color='green', label='Отфильтрованный сигнал') plt.title('Отфильтрованный сигнал')
plt.xlabel('Время') plt.ylabel('Амплитуда') plt.legend() plt.grid(True) plt.show()
#Расчет спектра отфильтрованного сигнала
filtered_spectrum = np.fft.fft(filtered_signal)
plt.figure(figsize=(10, 5))
plt.plot(frequencies, np.abs(filtered_spectrum) / np.max(np.abs(filtered_spectrum)), color='green', label='Спектр отфильтрованного сигнала')
plt.title('Спектр отфильтрованного сигнала') plt.xlabel('Частота') plt.ylabel('Амплитуда')
plt.legend() plt.grid(True) plt.show()
# Спектограмма до и после фильтрации plt.figure(figsize=(12, 6))
plt.subplot(2, 1, 1)
plt.specgram(signal, NFFT=1024, Fs=sampling_rate, noverlap=512, cmap='hot') plt.title('Спектограмма исходного сигнала')
plt.xlabel('Время') plt.ylabel('Частота')
plt.subplot(2, 1, 2)
plt.specgram(filtered_signal, NFFT=1024, Fs=sampling_rate, noverlap=512, cmap='hot')
plt.title('Спектограмма отфильтрованного сигнала') plt.xlabel('Время')
plt.ylabel('Частота')
plt.tight_layout()
3

plt.show()
# Запись отфильтрованного сигнала в файл wavfile.write('LR3.wav', sampling_rate, (filtered_signal * 32767).astype(np.int16))
# Расчет и визуализация АЧХ w, h = freqz(b, a, worN=2000) plt.figure(figsize=(10, 5))
plt.plot(0.5 * sampling_rate * w / np.pi, np.abs(h), color='blue') plt.title('АЧХ фильтра')
plt.xlabel('Частота (Гц)') plt.ylabel('Амплитуда') plt.grid()
plt.xlim(0, 0.5 * sampling_rate) plt.ylim(0, 1.1)
plt.show()
# Запись отфильтрованного сигнала в файл wavfile.write('LR3.wav', sampling_rate, (filtered_signal * 32767).astype(np.int16))
Результаты работы программы при фильтрации сигнала приведены на
Рисунках 1-6.
Рисунок 1 – Визуализация исходного сигнала
4

Рисунок 2 – Визуализация исходного сигнала
5

Рисунок 3 – Визуализация отфильтрованного сигнала
Рисунок 4 – Визуализация отфильтрованного сигнала
Рисунок 5 – Спектрограмма сигналов
6

Рисунок 6 - График амплитудно-частотной характеристики фильтра
При прослушивании отфильтрованного сигнала были замечены изменения в худшую сторону, звук стал напоминать шипение.
Далее проделаем те же операции над ранее загруженным аудио фрагментом пения птиц. Код программы представлен в Листинге 2.
Листинг 2. Обработка аудио
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import lfilter, butter, freqz from scipy.io import wavfile
# Чтение файла LR2MUSIC.wav
sampling_rate, signal = wavfile.read('LR2MUSIC.wav') signal = signal.astype(float)
# Параметры фильтра
cutoff_frequency = 600 # частота среза в герцах nyquist_frequency = sampling_rate / 2
normalized_cutoff_frequency = cutoff_frequency / nyquist_frequency
# Создание фильтра нижних частот
b, a = butter(4, normalized_cutoff_frequency, btype='low')
# Применение фильтра к сигналу filtered_signal = lfilter(b, a, signal)
# Визуализация сигнала без фильтра plt.figure(figsize=(10, 5))
plt.plot(signal / np.max(np.abs(signal)), color='green', label='Исходный сигнал')
plt.title('Исходный сигнал') plt.xlabel('Время') plt.ylabel('Амплитуда')
7

plt.legend() plt.grid(True) plt.show()
# Расчет спектра исходного сигнала
frequencies = np.fft.fftfreq(signal.size, 1 / sampling_rate) spectrum = np.fft.fft(signal)
plt.figure(figsize=(10, 5))
plt.plot(frequencies, np.abs(spectrum) / np.max(np.abs(spectrum)), color='green', label='Спектр исходного сигнала')
plt.title('Спектр исходного сигнала') plt.xlabel('Частота') plt.ylabel('Амплитуда')
plt.legend() plt.grid(True) plt.show()
#Визуализация отфильтрованного сигнала plt.figure(figsize=(10, 5))
plt.plot(filtered_signal, color='green', label='Отфильтрованный сигнал') plt.title('Отфильтрованный сигнал')
plt.xlabel('Время') plt.ylabel('Амплитуда') plt.legend() plt.grid(True) plt.show()
#Расчет спектра отфильтрованного сигнала
filtered_spectrum = np.fft.fft(filtered_signal)
plt.figure(figsize=(10, 5))
plt.plot(frequencies, np.abs(filtered_spectrum) / np.max(np.abs(filtered_spectrum)), color='green', label='Спектр отфильтрованного сигнала')
plt.title('Спектр отфильтрованного сигнала') plt.xlabel('Частота') plt.ylabel('Амплитуда')
plt.legend() plt.grid(True) plt.show()
# Спектограмма до и после фильтрации plt.figure(figsize=(12, 6)) plt.subplot(2, 1, 1)
plt.specgram(signal, NFFT=1024, Fs=sampling_rate, noverlap=512, cmap='hot') plt.title('Спектограмма исходного сигнала')
plt.xlabel('Время') plt.ylabel('Частота')
plt.subplot(2, 1, 2)
plt.specgram(filtered_signal, NFFT=1024, Fs=sampling_rate, noverlap=512, cmap='hot')
plt.title('Спектограмма отфильтрованного сигнала') plt.xlabel('Время')
plt.ylabel('Частота')
plt.tight_layout() plt.show()
# Запись отфильтрованного сигнала в файл wavfile.write('LR3MUSIC.wav', sampling_rate, (filtered_signal * 32767).astype(np.int16))
8

# Расчет и визуализация АЧХ w, h = freqz(b, a, worN=2000) plt.figure(figsize=(10, 5))
plt.plot(0.5 * sampling_rate * w / np.pi, np.abs(h), color='blue') plt.title('АЧХ фильтра')
plt.xlabel('Частота (Гц)') plt.ylabel('Амплитуда') plt.grid()
plt.xlim(0, 0.5 * sampling_rate) plt.ylim(0, 1.1)
plt.show()
# Запись отфильтрованного сигнала в файл wavfile.write('LR3MUSIC.wav', sampling_rate, (filtered_signal * 32767).astype(np.int16))
Результаты обработки представлены на Рисунках 7-12.
Рисунок 7 – Визуализация исходного сигнала
9

Рисунок 8 – Визуализация исходного сигнала
Рисунок 9 – Визуализация отфильтрованного сигнала
10