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

лаб2 / lab2

.m
Скачиваний:
0
Добавлен:
27.08.2024
Размер:
3.72 Кб
Скачать
clc, clear, close all % очистка памяти
[input_signal,Fd] = audioread('любимая_песня_мии_уоллес.wav'); % звуковой файл
%sound(input_signal,Fd); % проигрываем файл
N = length(input_signal); % Получить длину данных аудиофайла
t = 1:1:N;
plot(t./Fd,input_signal) % строим график сигнала
xlabel('Time'), ylabel('Audio Signal')
% вычисляем спектр сигнала по отдельности в каждом канале:
Spectr_input(:,1) = fft(input_signal(:,1));
Spectr_input(:,2) = fft(input_signal(:,2));
y = 20*log10(abs(Spectr_input(:,1))); % Преобразовать в дБ
f = [0:(Fd/N):Fd/2]; % Перевести абсциссу графика в Гц
% строим график амплитудного спектра входного сигнала
y = y(1:length(f));
figure(2),
semilogx(f,y); grid;
xlabel('Частота (Гц)');
ylabel('Уровень (дБ)');
title('Амплитудный спектр исходного аудиосигнала');
legend('Audio');
% создаем пустой массив для последующей записи вых. сигнала:
output_signal_1 = zeros(N,2);
% создаем пустой массив для спектра вых. сигнала
% небольшая константа добавляется, чтобы избежать lg(0)
Spectr_output = zeros(size(Spectr_input)) + 0.00001;
% задаем граничные частоты полосы пропускания фильтра, в Герцах
lower_frequency = 800; % изменение нижней границы частоты
% переводим Герцы в целочисленные индексы массива: см. ф-лу (1)
n_lower_frequency = round(N * lower_frequency / Fd);

for n = 2:n_lower_frequency
Spectr_output(n,:) = Spectr_input(n,:);
Spectr_output(N+2-n,:) = Spectr_input(N+2-n,:);
end
% отдельно копируем элемент с наименьшим индексом:
Spectr_output(1,:) = Spectr_input(1,:);
% теперь вычитанием массивов создаем массив, в котором
% будут в наличии лишь компоненты
% с частотами от lower_frequency до upper_frequency
% т.е. будет реализован именно полосовой фильтр:
Spectr_output = Spectr_input - Spectr_output;

%посмотрим на график выходного спектра (только левый канал):
y=20*log10(abs(Spectr_output(:,1))); %Преобразовать в дБ
f=[0:(Fd/N):Fd/2]; %Перевести Абсциссу в Гц
y=y(1:length(f));
figure(3), semilogx(f,y); grid;
xlabel('Частота (Гц)'); ylabel('Уровень (дБ)');
title('Амплитудный спектр выходного сигнала аудиофайла');legend('Audio');
% обратное БПФ от модифицированного спектра:
% раздельно для каждого канала
output_signal_1(:,1) =ifft(Spectr_output(:,1));
output_signal_1(:,2) =ifft(Spectr_output(:,2));
% можно прослушать результат фильтрации прямо в Matlab:
%sound(output_signal_1, Fd);
% выведем графики исходного аудиосигнала и после фильтрации:
% сейчас выводится весь график.
figure(4);
plot(input_signal);
% записываем новый аудиофайл:
audiowrite('любимая_песня_мии_уоллес_filtered.wav', output_signal_1, Fd)
Соседние файлы в папке лаб2