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

3

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

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

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

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

Кафедра 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

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